blob: c123d0300d59d05f32c97da218b09c9aaa3ab01c [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900901 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800914 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000927 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 versions: ["1", "2", "3"],
929 },
930 }
931
932 cc_library {
933 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900934 srcs: ["mylib.cpp"],
935 shared_libs: ["mylib4"],
936 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["10", "11", "12"],
941 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900944
945 cc_library {
946 name: "mylib4",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000950 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900951 }
Jiyong Park105dc322021-06-11 17:22:09 +0900952
Spandan Das357ffcc2024-07-24 18:07:48 +0000953 cc_prebuilt_library_shared {
954 name: "my_prebuilt_platform_lib",
955 stubs: {
956 symbol_file: "my_prebuilt_platform_lib.map.txt",
957 versions: ["1", "2", "3"],
958 },
959 srcs: ["foo.so"],
960 }
961
962 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963 cc_prebuilt_library_shared {
964 name: "my_prebuilt_platform_stub_only_lib",
965 stubs: {
966 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967 versions: ["1", "2", "3"],
968 }
969 }
970
Jiyong Park105dc322021-06-11 17:22:09 +0900971 rust_binary {
972 name: "foo.rust",
973 srcs: ["foo.rs"],
974 shared_libs: ["libfoo.shared_from_rust"],
975 prefer_rlib: true,
976 apex_available: ["myapex"],
977 }
978
979 cc_library_shared {
980 name: "libfoo.shared_from_rust",
981 srcs: ["mylib.cpp"],
982 system_shared_libs: [],
983 stl: "none",
984 stubs: {
985 versions: ["10", "11", "12"],
986 },
987 }
988
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989 `)
990
Jooyung Hana0503a52023-08-23 13:12:50 +0900991 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 copyCmds := apexRule.Args["copy_commands"]
993
994 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996
997 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
Colin Crossaede88c2020-08-11 12:17:01 -07001003 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001006 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001008 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009
Colin Crossea91a172024-11-05 16:14:05 -08001010 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001011 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001013 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001014
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001015 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016 // is replaced by sharing of "cFlags" in cc/builder.go.
1017 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018 // module variable representing "cflags". So it was not detected by ensureNotContains.
1019 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021 // including the original cflags's "-include mylib.h".
1022 //
Jiyong Park64379952018-12-13 18:37:29 +09001023 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001024 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001026
Jiyong Park85cc35a2022-07-17 11:30:47 +09001027 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1028 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029 // Ensure that genstub for apex-provided lib is invoked with --apex
1030 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001031
Jooyung Hana0503a52023-08-23 13:12:50 +09001032 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001033 "lib64/mylib.so",
1034 "lib64/mylib3.so",
1035 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001036 "bin/foo.rust",
1037 "lib64/libc++.so", // by the implicit dependency from foo.rust
1038 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001039 })
Jiyong Park105dc322021-06-11 17:22:09 +09001040
1041 // Ensure that stub dependency from a rust module is not included
1042 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001047
Jooyung Hana0503a52023-08-23 13:12:50 +09001048 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001049 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001050
1051 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1056 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057
1058 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1063 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064}
1065
Jooyung Han20348752023-12-05 15:23:56 +09001066func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001067 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001068 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069 apex {
1070 name: "myapex",
1071 key: "myapex.key",
1072 vendor: true,
1073 updatable: false,
1074 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "libbar",
1085 srcs: ["mylib.cpp"],
1086 llndk: {
1087 symbol_file: "libbar.map.txt",
1088 }
1089 }
1090 `)
1091}
1092
Jiyong Park1bc84122021-06-22 20:23:05 +09001093func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001094 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001095 ctx := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 binaries: ["foo.rust"],
1101 updatable: false,
1102 platform_apis: true,
1103 }
1104
1105 apex_key {
1106 name: "myapex.key",
1107 public_key: "testkey.avbpubkey",
1108 private_key: "testkey.pem",
1109 }
1110
1111 cc_library {
1112 name: "mylib",
1113 srcs: ["mylib.cpp"],
1114 shared_libs: ["mylib2"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 apex_available: [ "myapex" ],
1118 }
1119
1120 cc_library {
1121 name: "mylib2",
1122 srcs: ["mylib.cpp"],
1123 cflags: ["-include mylib.h"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["1", "2", "3"],
1128 },
1129 }
1130
1131 rust_binary {
1132 name: "foo.rust",
1133 srcs: ["foo.rs"],
1134 shared_libs: ["libfoo.shared_from_rust"],
1135 prefer_rlib: true,
1136 apex_available: ["myapex"],
1137 }
1138
1139 cc_library_shared {
1140 name: "libfoo.shared_from_rust",
1141 srcs: ["mylib.cpp"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["10", "11", "12"],
1146 },
1147 }
1148 `)
1149
Jooyung Hana0503a52023-08-23 13:12:50 +09001150 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001151 copyCmds := apexRule.Args["copy_commands"]
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156
1157 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001162 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165}
1166
Colin Cross7812fd32020-09-25 12:35:10 -07001167func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001169 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001170 apex {
1171 name: "myapex",
1172 key: "myapex.key",
1173 native_shared_libs: ["mylib", "mylib3"],
1174 min_sdk_version: "29",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 cc_library {
1184 name: "mylib",
1185 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001186 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001187 system_shared_libs: [],
1188 stl: "none",
1189 apex_available: [ "myapex" ],
1190 min_sdk_version: "28",
1191 }
1192
1193 cc_library {
1194 name: "mylib2",
1195 srcs: ["mylib.cpp"],
1196 cflags: ["-include mylib.h"],
1197 system_shared_libs: [],
1198 stl: "none",
1199 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001200 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001201 versions: ["28", "29", "30", "current"],
1202 },
1203 min_sdk_version: "28",
1204 }
1205
1206 cc_library {
1207 name: "mylib3",
1208 srcs: ["mylib.cpp"],
1209 shared_libs: ["mylib4"],
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001213 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001214 versions: ["28", "29", "30", "current"],
1215 },
1216 apex_available: [ "myapex" ],
1217 min_sdk_version: "28",
1218 }
1219
1220 cc_library {
1221 name: "mylib4",
1222 srcs: ["mylib.cpp"],
1223 system_shared_libs: [],
1224 stl: "none",
1225 apex_available: [ "myapex" ],
1226 min_sdk_version: "28",
1227 }
1228 `)
1229
Jooyung Hana0503a52023-08-23 13:12:50 +09001230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001231 copyCmds := apexRule.Args["copy_commands"]
1232
1233 // Ensure that direct non-stubs dep is always included
1234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235
1236 // Ensure that indirect stubs dep is not included
1237 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238
1239 // Ensure that direct stubs dep is included
1240 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241
1242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243
Jiyong Park55549df2021-02-26 23:57:23 +09001244 // Ensure that mylib is linking with the latest version of stub for mylib2
1245 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001246 // ... and not linking to the non-stub (impl) variant of mylib2
1247 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248
Colin Crossea91a172024-11-05 16:14:05 -08001249 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001250 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251 // .. and not linking to the stubs variant of mylib3
1252 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253
1254 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001255 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001256 ensureNotContains(t, mylib2Cflags, "-include ")
1257
Jiyong Park85cc35a2022-07-17 11:30:47 +09001258 // Ensure that genstub is invoked with --systemapi
1259 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001260
Jooyung Hana0503a52023-08-23 13:12:50 +09001261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001262 "lib64/mylib.so",
1263 "lib64/mylib3.so",
1264 "lib64/mylib4.so",
1265 })
1266}
1267
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001268func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269 t.Parallel()
1270 // myapex (Z)
1271 // mylib -----------------.
1272 // |
1273 // otherapex (29) |
1274 // libstub's versions: 29 Z current
1275 // |
1276 // <platform> |
1277 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001278 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001279 apex {
1280 name: "myapex",
1281 key: "myapex.key",
1282 native_shared_libs: ["mylib"],
1283 min_sdk_version: "Z", // non-final
1284 }
1285
1286 cc_library {
1287 name: "mylib",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libstub"],
1290 apex_available: ["myapex"],
1291 min_sdk_version: "Z",
1292 }
1293
1294 apex_key {
1295 name: "myapex.key",
1296 public_key: "testkey.avbpubkey",
1297 private_key: "testkey.pem",
1298 }
1299
1300 apex {
1301 name: "otherapex",
1302 key: "myapex.key",
1303 native_shared_libs: ["libstub"],
1304 min_sdk_version: "29",
1305 }
1306
1307 cc_library {
1308 name: "libstub",
1309 srcs: ["mylib.cpp"],
1310 stubs: {
1311 versions: ["29", "Z", "current"],
1312 },
1313 apex_available: ["otherapex"],
1314 min_sdk_version: "29",
1315 }
1316
1317 // platform module depending on libstub from otherapex should use the latest stub("current")
1318 cc_library {
1319 name: "libplatform",
1320 srcs: ["mylib.cpp"],
1321 shared_libs: ["libstub"],
1322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001323 `,
1324 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326 variables.Platform_sdk_final = proptools.BoolPtr(false)
1327 variables.Platform_version_active_codenames = []string{"Z"}
1328 }),
1329 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001330
Jiyong Park55549df2021-02-26 23:57:23 +09001331 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001333 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336
1337 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342}
1343
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001346 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001348 name: "myapex2",
1349 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001351 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 }
1353
1354 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001355 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "mylib",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001364 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 system_shared_libs: [],
1366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001367 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 }
1369
1370 cc_library {
1371 name: "libfoo",
1372 srcs: ["mylib.cpp"],
1373 shared_libs: ["libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["10", "20", "30"],
1378 },
1379 }
1380
1381 cc_library {
1382 name: "libbar",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 }
1387
Jiyong Park678c8812020-02-07 17:25:49 +09001388 cc_library_static {
1389 name: "libbaz",
1390 srcs: ["mylib.cpp"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex2" ],
1394 }
1395
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001396 `)
1397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that direct non-stubs dep is always included
1402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403
1404 // Ensure that indirect stubs dep is not included
1405 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406
1407 // Ensure that dependency of stubs is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409
Colin Crossaede88c2020-08-11 12:17:01 -07001410 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411
1412 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001415 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001418
1419 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001421
Colin Crossf61d03d2023-11-02 16:56:39 -07001422 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001424 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001425
Colin Crossf61d03d2023-11-02 16:56:39 -07001426 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001428 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429}
1430
Jooyung Hand3639552019-08-09 12:57:43 +09001431func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001432 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001561 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001562 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001563 cc_library {
1564 name: "libc",
1565 no_libcrt: true,
1566 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001567 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568 stl: "none",
1569 system_shared_libs: [],
1570 stubs: { versions: ["1"] },
1571 apex_available: ["com.android.runtime"],
1572
1573 sanitize: {
1574 hwaddress: true,
1575 }
1576 }
1577
1578 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001579 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 no_libcrt: true,
1581 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001582 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 stl: "none",
1584 system_shared_libs: [],
1585 srcs: [""],
1586 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
1589 sanitize: {
1590 never: true,
1591 },
Spandan Das4de7b492023-05-05 21:13:01 +00001592 apex_available: [
1593 "//apex_available:anyapex",
1594 "//apex_available:platform",
1595 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001596 } `)
1597 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598
Jooyung Hana0503a52023-08-23 13:12:50 +09001599 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 "lib64/bionic/libc.so",
1601 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602 })
1603
Colin Cross4c4c1be2022-02-10 11:41:18 -08001604 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001605
1606 installed := hwasan.Description("install libclang_rt.hwasan")
1607 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608
1609 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612}
1613
1614func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001615 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001616 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001617 prepareForTestOfRuntimeApexWithHwasan,
1618 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619 variables.SanitizeDevice = []string{"hwaddress"}
1620 }),
1621 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622 cc_library {
1623 name: "libc",
1624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 stubs: { versions: ["1"] },
1630 apex_available: ["com.android.runtime"],
1631 }
1632
1633 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001634 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001635 no_libcrt: true,
1636 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001637 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 stl: "none",
1639 system_shared_libs: [],
1640 srcs: [""],
1641 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001642 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
1644 sanitize: {
1645 never: true,
1646 },
Spandan Das4de7b492023-05-05 21:13:01 +00001647 apex_available: [
1648 "//apex_available:anyapex",
1649 "//apex_available:platform",
1650 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001651 }
Paul Duffina02cae32021-03-09 01:44:06 +00001652 `)
1653 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654
Jooyung Hana0503a52023-08-23 13:12:50 +09001655 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 "lib64/bionic/libc.so",
1657 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658 })
1659
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 installed := hwasan.Description("install libclang_rt.hwasan")
1663 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664
1665 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668}
1669
Jooyung Han61b66e92020-03-21 14:21:46 +00001670func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001671 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 testcases := []struct {
1673 name string
1674 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001675 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001676 shouldLink string
1677 shouldNotLink []string
1678 }{
1679 {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001681 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001682 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 shouldLink: "current",
1684 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 },
1686 {
Jiyong Park55549df2021-02-26 23:57:23 +09001687 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001688 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001689 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 shouldLink: "current",
1691 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 },
1693 }
1694 for _, tc := range testcases {
1695 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001696 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001697 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 apex {
1699 name: "myapex",
1700 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001702 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001703 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Jooyung Han61b66e92020-03-21 14:21:46 +00001706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 cc_library {
1713 name: "mylib",
1714 srcs: ["mylib.cpp"],
1715 vendor_available: true,
1716 shared_libs: ["libbar"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722
Jooyung Han61b66e92020-03-21 14:21:46 +00001723 cc_library {
1724 name: "libbar",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001729 llndk: {
1730 symbol_file: "libbar.map.txt",
1731 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001733 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001734 withUnbundledBuild,
1735 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001736
Jooyung Han61b66e92020-03-21 14:21:46 +00001737 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 "lib64/mylib.so",
1740 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001741
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001743 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001746
Steven Moreland2c4000c2021-04-27 02:08:49 +00001747 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001752
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 ver := tc.shouldLink
1755 if tc.shouldLink == "current" {
1756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 }
1758 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 })
1760 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761}
1762
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001770 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "mylib",
1781 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001782 system_shared_libs: ["libc"],
1783 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 }
1787
1788 cc_library_shared {
1789 name: "mylib_shared",
1790 srcs: ["mylib.cpp"],
1791 shared_libs: ["libdl#27"],
1792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001793 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001794 }
1795
1796 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001797 name: "libBootstrap",
1798 srcs: ["mylib.cpp"],
1799 stl: "none",
1800 bootstrap: true,
1801 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 `)
1803
Jooyung Hana0503a52023-08-23 13:12:50 +09001804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 copyCmds := apexRule.Args["copy_commands"]
1806
1807 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001811
1812 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001813 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
Colin Crossaede88c2020-08-11 12:17:01 -07001815 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818
1819 // For dependency to libc
1820 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001821 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001823 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001824 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001825 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827
1828 // For dependency to libm
1829 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001832 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001833 // ... and is not compiling with the stub
1834 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836
1837 // For dependency to libdl
1838 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001839 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... Cflags from stub is correctly exported to mylib
1846 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001848
1849 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001850 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001854}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001855
Jooyung Han749dc692020-04-15 11:03:39 +09001856func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001857 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001858 // there are three links between liba --> libz.
1859 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001860 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001861 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001862 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 apex {
1871 name: "otherapex",
1872 key: "myapex.key",
1873 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882
1883 cc_library {
1884 name: "libx",
1885 shared_libs: ["liba"],
1886 system_shared_libs: [],
1887 stl: "none",
1888 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001889 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 cc_library {
1893 name: "liby",
1894 shared_libs: ["liba"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
1900
1901 cc_library {
1902 name: "liba",
1903 shared_libs: ["libz"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [
1907 "//apex_available:anyapex",
1908 "//apex_available:platform",
1909 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "libz",
1915 system_shared_libs: [],
1916 stl: "none",
1917 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001918 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001919 },
1920 }
Jooyung Han749dc692020-04-15 11:03:39 +09001921 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001922
1923 expectLink := func(from, from_variant, to, to_variant string) {
1924 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926 }
1927 expectNoLink := func(from, from_variant, to, to_variant string) {
1928 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 // platform liba is linked to non-stub version
1932 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001933 // liba in myapex is linked to current
1934 expectLink("liba", "shared_apex29", "libz", "shared_current")
1935 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001936 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001937 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001938 // liba in otherapex is linked to current
1939 expectLink("liba", "shared_apex30", "libz", "shared_current")
1940 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001941 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001943}
1944
Jooyung Hanaed150d2020-04-02 01:41:41 +09001945func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001947 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 native_shared_libs: ["libx"],
1952 min_sdk_version: "R",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 cc_library {
1962 name: "libx",
1963 shared_libs: ["libz"],
1964 system_shared_libs: [],
1965 stl: "none",
1966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001967 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 }
1969
1970 cc_library {
1971 name: "libz",
1972 system_shared_libs: [],
1973 stl: "none",
1974 stubs: {
1975 versions: ["29", "R"],
1976 },
1977 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"R"}
1981 }),
1982 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001983
1984 expectLink := func(from, from_variant, to, to_variant string) {
1985 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987 }
1988 expectNoLink := func(from, from_variant, to, to_variant string) {
1989 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001992 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001994 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001996}
1997
Jooyung Han4c4da062021-06-23 10:23:16 +09001998func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001999 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002000 testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 java_libs: ["libx"],
2005 min_sdk_version: "S",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 java_library {
2015 name: "libx",
2016 srcs: ["a.java"],
2017 apex_available: [ "myapex" ],
2018 sdk_version: "current",
2019 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002020 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002021 }
2022 `,
2023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024 variables.Platform_version_active_codenames = []string{"S"}
2025 variables.Platform_sdk_codename = proptools.StringPtr("S")
2026 }),
2027 )
2028}
2029
Jooyung Han749dc692020-04-15 11:03:39 +09002030func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002031 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002032 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002037 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002038 }
2039
2040 apex_key {
2041 name: "myapex.key",
2042 public_key: "testkey.avbpubkey",
2043 private_key: "testkey.pem",
2044 }
2045
2046 cc_library {
2047 name: "libx",
2048 shared_libs: ["libz"],
2049 system_shared_libs: [],
2050 stl: "none",
2051 apex_available: [ "myapex" ],
2052 }
2053
2054 cc_library {
2055 name: "libz",
2056 system_shared_libs: [],
2057 stl: "none",
2058 stubs: {
2059 versions: ["1", "2"],
2060 },
2061 }
2062 `)
2063
2064 expectLink := func(from, from_variant, to, to_variant string) {
2065 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067 }
2068 expectNoLink := func(from, from_variant, to, to_variant string) {
2069 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002072 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002073 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002076}
2077
Jooyung Handfc864c2023-03-20 18:19:07 +09002078func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002079 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 ctx := testApex(t, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002085 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002086 vendor: true,
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 cc_library {
2097 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002098 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002099 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002101 shared_libs: ["libbar"],
2102 }
2103
2104 cc_library {
2105 name: "libbar",
2106 stubs: { versions: ["29", "30"] },
2107 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002108 }
2109 `)
2110
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002111 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002114
2115 // Ensure that mylib links with "current" LLNDK
2116 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002117 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002118
2119 // Ensure that mylib is targeting 29
2120 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122
2123 // Ensure that the correct variant of crtbegin_so is used.
2124 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002126
2127 // Ensure that the crtbegin_so used by the APEX is targeting 29
2128 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130}
2131
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002132func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002133 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002134 ctx := testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 updatable: true,
2139 native_shared_libs: [
2140 "mylib",
2141 "yourlib",
2142 ],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex {
2147 name: "myapex2",
2148 key: "myapex.key",
2149 updatable: false,
2150 native_shared_libs: ["yourlib"],
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["libbar"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex"],
2165 }
2166
2167 cc_library {
2168 name: "libbar",
2169 stubs: { versions: ["29", "30"] },
2170 }
2171
2172 cc_library {
2173 name: "yourlib",
2174 srcs: ["mylib.cpp"],
2175 min_sdk_version: "29",
2176 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }))
2181
2182 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002184 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002185 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002186 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002188
2189 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2190 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191 myapex.Output("depsinfo/flatlist.txt")), "\n")
2192 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195 flatlist, "mylib:(minSdkVersion:29)")
2196 android.AssertStringListContains(t, "track platform-available lib",
2197 flatlist, "yourlib(minSdkVersion:29)")
Jooyung Han4495f842023-04-25 16:39:59 +09002198}
2199
Pechetty Sravani (xWF)9873d742025-01-13 00:39:47 -08002200func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
2201 t.Parallel()
2202 ctx := testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 updatable: true,
2207 native_shared_libs: [
2208 "mylib",
2209 "yourlib",
2210 ],
2211 min_sdk_version: "29",
2212 }
2213
2214 apex {
2215 name: "myapex2",
2216 key: "myapex.key",
2217 updatable: false,
2218 native_shared_libs: ["yourlib"],
2219 }
2220
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226
2227 cc_library {
2228 name: "mylib",
2229 srcs: ["mylib.cpp"],
2230 shared_libs: ["libbar"],
2231 min_sdk_version: "29",
2232 apex_available: ["myapex"],
2233 }
2234
2235 cc_library {
2236 name: "libbar",
2237 stubs: { versions: ["29", "30"] },
2238 }
2239
2240 cc_library {
2241 name: "yourlib",
2242 srcs: ["mylib.cpp"],
2243 min_sdk_version: "29",
2244 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2245 }
2246 `, withFiles(android.MockFS{
2247 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2248 }),
2249 android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2252 },
2253 ))
2254
2255 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2256 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2257 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2258 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2259 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2260 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2261
2262 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2263 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2264 myapex.Output("depsinfo/flatlist.txt")), "\n")
2265 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2266 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2267 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2268 flatlist, "mylib:(minSdkVersion:29)")
2269 android.AssertStringListContains(t, "track platform-available lib",
2270 flatlist, "yourlib(minSdkVersion:29)")
2271}
2272
2273func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
2274 t.Parallel()
2275 ctx := testApex(t, `
2276 apex {
2277 name: "myapex",
2278 key: "myapex.key",
2279 updatable: true,
2280 native_shared_libs: [
2281 "mylib",
2282 "yourlib",
2283 ],
2284 min_sdk_version: "29",
2285 }
2286
2287 apex {
2288 name: "myapex2",
2289 key: "myapex.key",
2290 updatable: false,
2291 native_shared_libs: ["yourlib"],
2292 }
2293
2294 apex_key {
2295 name: "myapex.key",
2296 public_key: "testkey.avbpubkey",
2297 private_key: "testkey.pem",
2298 }
2299
2300 cc_library {
2301 name: "mylib",
2302 srcs: ["mylib.cpp"],
2303 shared_libs: ["libbar"],
2304 min_sdk_version: "29",
2305 apex_available: ["myapex"],
2306 }
2307
2308 cc_library {
2309 name: "libbar",
2310 stubs: { versions: ["29", "30"] },
2311 }
2312
2313 cc_library {
2314 name: "yourlib",
2315 srcs: ["mylib.cpp"],
2316 min_sdk_version: "29",
2317 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2318 }
2319 `, withFiles(android.MockFS{
2320 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2321 "packages/modules/common/build/allowed_deps.txt": nil,
2322 }),
2323 android.FixtureModifyProductVariables(
2324 func(variables android.FixtureProductVariables) {
2325 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2326 },
2327 ))
2328
2329 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2330 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2331 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2332 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2333 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2334 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2335
2336 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2337 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2338 myapex.Output("depsinfo/flatlist.txt")), "\n")
2339 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2340 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2341 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2342 flatlist, "mylib:(minSdkVersion:29)")
2343 android.AssertStringListContains(t, "track platform-available lib",
2344 flatlist, "yourlib(minSdkVersion:29)")
2345}
2346
Jooyung Han4495f842023-04-25 16:39:59 +09002347func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002348 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002349 ctx := testApex(t, `
2350 apex {
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002351 name: "myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002352 key: "myapex.key",
2353 updatable: true,
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002362 `)
Jooyung Han4495f842023-04-25 16:39:59 +09002363 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2364 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2365 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2366 }
2367}
2368
Jooyung Han03b51852020-02-26 22:45:42 +09002369func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002371 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002372 apex {
2373 name: "myapex",
2374 key: "myapex.key",
2375 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002376 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002377 }
2378
2379 apex_key {
2380 name: "myapex.key",
2381 public_key: "testkey.avbpubkey",
2382 private_key: "testkey.pem",
2383 }
2384
2385 cc_library {
2386 name: "libx",
2387 system_shared_libs: [],
2388 stl: "none",
2389 apex_available: [ "myapex" ],
2390 stubs: {
2391 versions: ["1", "2"],
2392 },
2393 }
2394
2395 cc_library {
2396 name: "libz",
2397 shared_libs: ["libx"],
2398 system_shared_libs: [],
2399 stl: "none",
2400 }
2401 `)
2402
2403 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002404 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002405 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2406 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2407 }
2408 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002409 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002410 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2411 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2412 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002413 expectLink("libz", "shared", "libx", "shared_current")
2414 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002415 expectNoLink("libz", "shared", "libz", "shared_1")
2416 expectNoLink("libz", "shared", "libz", "shared")
2417}
2418
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002419var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2420 func(variables android.FixtureProductVariables) {
2421 variables.SanitizeDevice = []string{"hwaddress"}
2422 },
2423)
2424
Jooyung Han75568392020-03-20 04:29:24 +09002425func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002426 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002427 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002428 apex {
2429 name: "myapex",
2430 key: "myapex.key",
2431 native_shared_libs: ["libx"],
2432 min_sdk_version: "29",
2433 }
2434
2435 apex_key {
2436 name: "myapex.key",
2437 public_key: "testkey.avbpubkey",
2438 private_key: "testkey.pem",
2439 }
2440
2441 cc_library {
2442 name: "libx",
2443 shared_libs: ["libbar"],
2444 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002445 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002446 }
2447
2448 cc_library {
2449 name: "libbar",
2450 stubs: {
2451 versions: ["29", "30"],
2452 },
2453 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002454 `,
2455 prepareForTestWithSantitizeHwaddress,
2456 )
Jooyung Han03b51852020-02-26 22:45:42 +09002457 expectLink := func(from, from_variant, to, to_variant string) {
2458 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2459 libFlags := ld.Args["libFlags"]
2460 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2461 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002462 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002463}
2464
Jooyung Han75568392020-03-20 04:29:24 +09002465func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002466 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002467 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 native_shared_libs: ["libx"],
2472 min_sdk_version: "29",
2473 }
2474
2475 apex_key {
2476 name: "myapex.key",
2477 public_key: "testkey.avbpubkey",
2478 private_key: "testkey.pem",
2479 }
2480
2481 cc_library {
2482 name: "libx",
2483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002485 }
Jooyung Han75568392020-03-20 04:29:24 +09002486 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002487
2488 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002489 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002490 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002491 // note that platform variant is not.
2492 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002493 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002494}
2495
Jooyung Han749dc692020-04-15 11:03:39 +09002496func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002497 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002498 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002499 apex {
2500 name: "myapex",
2501 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002502 native_shared_libs: ["mylib"],
2503 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002504 }
2505
2506 apex_key {
2507 name: "myapex.key",
2508 public_key: "testkey.avbpubkey",
2509 private_key: "testkey.pem",
2510 }
Jooyung Han749dc692020-04-15 11:03:39 +09002511
2512 cc_library {
2513 name: "mylib",
2514 srcs: ["mylib.cpp"],
2515 system_shared_libs: [],
2516 stl: "none",
2517 apex_available: [
2518 "myapex",
2519 ],
2520 min_sdk_version: "30",
2521 }
2522 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002523
2524 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["libfoo.ffi"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
2538 rust_ffi_shared {
2539 name: "libfoo.ffi",
2540 srcs: ["foo.rs"],
2541 crate_name: "foo",
2542 apex_available: [
2543 "myapex",
2544 ],
2545 min_sdk_version: "30",
2546 }
2547 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002548
2549 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 java_libs: ["libfoo"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 java_import {
2564 name: "libfoo",
2565 jars: ["libfoo.jar"],
2566 apex_available: [
2567 "myapex",
2568 ],
2569 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002570 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002571 }
2572 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002573
2574 // Skip check for modules compiling against core API surface
2575 testApex(t, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 java_libs: ["libfoo"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 java_library {
2590 name: "libfoo",
2591 srcs: ["Foo.java"],
2592 apex_available: [
2593 "myapex",
2594 ],
2595 // Compile against core API surface
2596 sdk_version: "core_current",
2597 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002598 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002599 }
2600 `)
2601
Jooyung Han749dc692020-04-15 11:03:39 +09002602}
2603
2604func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002605 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002606 testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 native_shared_libs: ["libfoo"],
2611 java_libs: ["libbar"],
2612 min_sdk_version: "29",
2613 }
2614
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
2619 }
2620
2621 cc_library {
2622 name: "libfoo",
2623 srcs: ["mylib.cpp"],
2624 shared_libs: ["libfoo_dep"],
2625 apex_available: ["myapex"],
2626 min_sdk_version: "29",
2627 }
2628
2629 cc_library {
2630 name: "libfoo_dep",
2631 srcs: ["mylib.cpp"],
2632 apex_available: ["myapex"],
2633 min_sdk_version: "29",
2634 }
2635
2636 java_library {
2637 name: "libbar",
2638 sdk_version: "current",
2639 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002640 static_libs: [
2641 "libbar_dep",
2642 "libbar_import_dep",
2643 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002644 apex_available: ["myapex"],
2645 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002646 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002647 }
2648
2649 java_library {
2650 name: "libbar_dep",
2651 sdk_version: "current",
2652 srcs: ["a.java"],
2653 apex_available: ["myapex"],
2654 min_sdk_version: "29",
2655 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002656
2657 java_import {
2658 name: "libbar_import_dep",
2659 jars: ["libbar.jar"],
2660 apex_available: ["myapex"],
2661 min_sdk_version: "29",
2662 }
Jooyung Han03b51852020-02-26 22:45:42 +09002663 `)
2664}
2665
Colin Cross8ca61c12022-10-06 21:00:14 -07002666func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002667 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002668 // Tests that an apex dependency with min_sdk_version higher than the
2669 // min_sdk_version of the apex is allowed as long as the dependency's
2670 // min_sdk_version is less than or equal to the api level that the
2671 // architecture was introduced in. In this case, arm64 didn't exist
2672 // until api level 21, so the arm64 code will never need to run on
2673 // an api level 20 device, even if other architectures of the apex
2674 // will.
2675 testApex(t, `
2676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 native_shared_libs: ["libfoo"],
2680 min_sdk_version: "20",
2681 }
2682
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688
2689 cc_library {
2690 name: "libfoo",
2691 srcs: ["mylib.cpp"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "21",
2694 stl: "none",
2695 }
2696 `)
2697}
2698
Artur Satayev8cf899a2020-04-15 17:29:42 +01002699func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002700 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002701 testCases := []struct {
2702 name string
2703 expectedError string
2704 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002705 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002706 }{
2707 {
2708 name: "Non-updatable apex with non-stable dep",
2709 bp: `
2710 apex {
2711 name: "myapex",
2712 java_libs: ["myjar"],
2713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 java_library {
2722 name: "myjar",
2723 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002724 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002725 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002726 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002727 }
2728 `,
2729 },
2730 {
2731 name: "Updatable apex with stable dep",
2732 bp: `
2733 apex {
2734 name: "myapex",
2735 java_libs: ["myjar"],
2736 key: "myapex.key",
2737 updatable: true,
2738 min_sdk_version: "29",
2739 }
2740 apex_key {
2741 name: "myapex.key",
2742 public_key: "testkey.avbpubkey",
2743 private_key: "testkey.pem",
2744 }
2745 java_library {
2746 name: "myjar",
2747 srcs: ["foo/bar/MyClass.java"],
2748 sdk_version: "current",
2749 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002750 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002751 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002752 }
2753 `,
2754 },
2755 {
2756 name: "Updatable apex with non-stable dep",
2757 expectedError: "cannot depend on \"myjar\"",
2758 bp: `
2759 apex {
2760 name: "myapex",
2761 java_libs: ["myjar"],
2762 key: "myapex.key",
2763 updatable: true,
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 java_library {
2771 name: "myjar",
2772 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002773 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002774 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002775 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002776 }
2777 `,
2778 },
2779 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002780 name: "Updatable apex with non-stable legacy core platform dep",
2781 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2782 bp: `
2783 apex {
2784 name: "myapex",
2785 java_libs: ["myjar-uses-legacy"],
2786 key: "myapex.key",
2787 updatable: true,
2788 }
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794 java_library {
2795 name: "myjar-uses-legacy",
2796 srcs: ["foo/bar/MyClass.java"],
2797 sdk_version: "core_platform",
2798 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002799 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 }
2801 `,
2802 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2803 },
2804 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002805 name: "Updatable apex with non-stable transitive dep",
2806 // This is not actually detecting that the transitive dependency is unstable, rather it is
2807 // detecting that the transitive dependency is building against a wider API surface than the
2808 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002809 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002810 bp: `
2811 apex {
2812 name: "myapex",
2813 java_libs: ["myjar"],
2814 key: "myapex.key",
2815 updatable: true,
2816 }
2817 apex_key {
2818 name: "myapex.key",
2819 public_key: "testkey.avbpubkey",
2820 private_key: "testkey.pem",
2821 }
2822 java_library {
2823 name: "myjar",
2824 srcs: ["foo/bar/MyClass.java"],
2825 sdk_version: "current",
2826 apex_available: ["myapex"],
2827 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002828 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002829 }
2830 java_library {
2831 name: "transitive-jar",
2832 srcs: ["foo/bar/MyClass.java"],
2833 sdk_version: "core_platform",
2834 apex_available: ["myapex"],
2835 }
2836 `,
2837 },
2838 }
2839
2840 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002841 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2842 continue
2843 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002844 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002845 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002846 errorHandler := android.FixtureExpectsNoErrors
2847 if test.expectedError != "" {
2848 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 android.GroupFixturePreparers(
2851 java.PrepareForTestWithJavaDefaultModules,
2852 PrepareForTestWithApexBuildComponents,
2853 prepareForTestWithMyapex,
2854 android.OptionalFixturePreparer(test.preparer),
2855 ).
2856 ExtendWithErrorHandler(errorHandler).
2857 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 })
2859 }
2860}
2861
Jooyung Han749dc692020-04-15 11:03:39 +09002862func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2863 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 native_shared_libs: ["mylib"],
2868 min_sdk_version: "29",
2869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 srcs: ["mylib.cpp"],
2880 shared_libs: ["mylib2"],
2881 system_shared_libs: [],
2882 stl: "none",
2883 apex_available: [
2884 "myapex",
2885 ],
2886 min_sdk_version: "29",
2887 }
2888
2889 // indirect part of the apex
2890 cc_library {
2891 name: "mylib2",
2892 srcs: ["mylib.cpp"],
2893 system_shared_libs: [],
2894 stl: "none",
2895 apex_available: [
2896 "myapex",
2897 ],
2898 min_sdk_version: "30",
2899 }
2900 `)
2901}
2902
2903func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002904 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002905 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 apps: ["AppFoo"],
2910 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002911 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 android_app {
2921 name: "AppFoo",
2922 srcs: ["foo/bar/MyClass.java"],
2923 sdk_version: "current",
2924 min_sdk_version: "29",
2925 system_modules: "none",
2926 stl: "none",
2927 static_libs: ["bar"],
2928 apex_available: [ "myapex" ],
2929 }
2930
2931 java_library {
2932 name: "bar",
2933 sdk_version: "current",
2934 srcs: ["a.java"],
2935 apex_available: [ "myapex" ],
2936 }
2937 `)
2938}
2939
2940func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 native_shared_libs: ["mylib"],
2947 min_sdk_version: "29",
2948 }
2949
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955
Colin Crossea91a172024-11-05 16:14:05 -08002956 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002957 cc_library {
2958 name: "mylib",
2959 srcs: ["mylib.cpp"],
2960 shared_libs: ["mylib2"],
2961 system_shared_libs: [],
2962 stl: "none",
2963 apex_available: ["myapex", "otherapex"],
2964 min_sdk_version: "29",
2965 }
2966
2967 cc_library {
2968 name: "mylib2",
2969 srcs: ["mylib.cpp"],
2970 system_shared_libs: [],
2971 stl: "none",
2972 apex_available: ["otherapex"],
2973 stubs: { versions: ["29", "30"] },
2974 min_sdk_version: "30",
2975 }
2976
2977 apex {
2978 name: "otherapex",
2979 key: "myapex.key",
2980 native_shared_libs: ["mylib", "mylib2"],
2981 min_sdk_version: "30",
2982 }
2983 `)
2984 expectLink := func(from, from_variant, to, to_variant string) {
2985 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2986 libFlags := ld.Args["libFlags"]
2987 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2988 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002989 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002990 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002991}
2992
Jooyung Haned124c32021-01-26 11:43:46 +09002993func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002994 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002995 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2996 func(variables android.FixtureProductVariables) {
2997 variables.Platform_sdk_codename = proptools.StringPtr("S")
2998 variables.Platform_version_active_codenames = []string{"S"}
2999 },
3000 )
Jooyung Haned124c32021-01-26 11:43:46 +09003001 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3002 apex {
3003 name: "myapex",
3004 key: "myapex.key",
3005 native_shared_libs: ["libfoo"],
3006 min_sdk_version: "S",
3007 }
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013 cc_library {
3014 name: "libfoo",
3015 shared_libs: ["libbar"],
3016 apex_available: ["myapex"],
3017 min_sdk_version: "29",
3018 }
3019 cc_library {
3020 name: "libbar",
3021 apex_available: ["myapex"],
3022 }
3023 `, withSAsActiveCodeNames)
3024}
3025
3026func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003027 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003028 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3029 variables.Platform_sdk_codename = proptools.StringPtr("S")
3030 variables.Platform_version_active_codenames = []string{"S", "T"}
3031 })
Colin Cross1c460562021-02-16 17:55:47 -08003032 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 native_shared_libs: ["libfoo"],
3037 min_sdk_version: "S",
3038 }
3039 apex_key {
3040 name: "myapex.key",
3041 public_key: "testkey.avbpubkey",
3042 private_key: "testkey.pem",
3043 }
3044 cc_library {
3045 name: "libfoo",
3046 shared_libs: ["libbar"],
3047 apex_available: ["myapex"],
3048 min_sdk_version: "S",
3049 }
3050 cc_library {
3051 name: "libbar",
3052 stubs: {
3053 symbol_file: "libbar.map.txt",
3054 versions: ["30", "S", "T"],
3055 },
3056 }
3057 `, withSAsActiveCodeNames)
3058
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003059 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003060 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3061 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003062 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003063}
3064
Jiyong Park7c2ee712018-12-07 00:42:25 +09003065func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003066 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003067 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003068 apex {
3069 name: "myapex",
3070 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003071 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003072 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003073 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003074 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003075 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003076 }
3077
3078 apex_key {
3079 name: "myapex.key",
3080 public_key: "testkey.avbpubkey",
3081 private_key: "testkey.pem",
3082 }
3083
3084 prebuilt_etc {
3085 name: "myetc",
3086 src: "myprebuilt",
3087 sub_dir: "foo/bar",
3088 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003089
3090 cc_library {
3091 name: "mylib",
3092 srcs: ["mylib.cpp"],
3093 relative_install_path: "foo/bar",
3094 system_shared_libs: [],
3095 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003096 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003097 }
3098
3099 cc_binary {
3100 name: "mybin",
3101 srcs: ["mylib.cpp"],
3102 relative_install_path: "foo/bar",
3103 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003105 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003106 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003107
3108 rust_binary {
3109 name: "mybin.rust",
3110 srcs: ["foo.rs"],
3111 relative_install_path: "rust_subdir",
3112 apex_available: [ "myapex" ],
3113 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003114 `)
3115
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003117 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003118
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003119 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003120 ensureContains(t, cmd, "/etc ")
3121 ensureContains(t, cmd, "/etc/foo ")
3122 ensureContains(t, cmd, "/etc/foo/bar ")
3123 ensureContains(t, cmd, "/lib64 ")
3124 ensureContains(t, cmd, "/lib64/foo ")
3125 ensureContains(t, cmd, "/lib64/foo/bar ")
3126 ensureContains(t, cmd, "/lib ")
3127 ensureContains(t, cmd, "/lib/foo ")
3128 ensureContains(t, cmd, "/lib/foo/bar ")
3129 ensureContains(t, cmd, "/bin ")
3130 ensureContains(t, cmd, "/bin/foo ")
3131 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003132 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003133}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003134
Jooyung Han35155c42020-02-06 17:33:20 +09003135func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 multilib: {
3142 both: {
3143 native_shared_libs: ["mylib"],
3144 binaries: ["mybin"],
3145 },
3146 },
3147 compile_multilib: "both",
3148 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 cc_library {
3159 name: "mylib",
3160 relative_install_path: "foo/bar",
3161 system_shared_libs: [],
3162 stl: "none",
3163 apex_available: [ "myapex" ],
3164 native_bridge_supported: true,
3165 }
3166
3167 cc_binary {
3168 name: "mybin",
3169 relative_install_path: "foo/bar",
3170 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003171 stl: "none",
3172 apex_available: [ "myapex" ],
3173 native_bridge_supported: true,
3174 compile_multilib: "both", // default is "first" for binary
3175 multilib: {
3176 lib64: {
3177 suffix: "64",
3178 },
3179 },
3180 }
Spandan Das45e40012024-12-02 22:45:48 +00003181 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003182 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003183 "bin/foo/bar/mybin",
3184 "bin/foo/bar/mybin64",
3185 "bin/arm/foo/bar/mybin",
3186 "bin/arm64/foo/bar/mybin64",
3187 "lib/foo/bar/mylib.so",
3188 "lib/arm/foo/bar/mylib.so",
3189 "lib64/foo/bar/mylib.so",
3190 "lib64/arm64/foo/bar/mylib.so",
3191 })
3192}
3193
Jooyung Han85d61762020-06-24 23:50:26 +09003194func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003195 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003196 result := android.GroupFixturePreparers(
3197 prepareForApexTest,
3198 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3199 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003200 apex {
3201 name: "myapex",
3202 key: "myapex.key",
3203 binaries: ["mybin"],
3204 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212 cc_binary {
3213 name: "mybin",
3214 vendor: true,
3215 shared_libs: ["libfoo"],
3216 }
3217 cc_library {
3218 name: "libfoo",
3219 proprietary: true,
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003224 "bin/mybin",
3225 "lib64/libfoo.so",
3226 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3227 "lib64/libc++.so",
3228 })
3229
Jooyung Hana0503a52023-08-23 13:12:50 +09003230 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003231 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003232 name := apexBundle.BaseModuleName()
3233 prefix := "TARGET_"
3234 var builder strings.Builder
3235 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003236 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003237 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003238 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003239
Jooyung Hana0503a52023-08-23 13:12:50 +09003240 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003241 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3242 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003243}
3244
Justin Yun13decfb2021-03-08 19:25:55 +09003245func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003246 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003247 ctx := testApex(t, `
3248 apex {
3249 name: "myapex",
3250 key: "myapex.key",
3251 updatable: false,
3252 product_specific: true,
3253 binaries: ["foo"],
3254 }
3255
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }
3261
3262 cc_binary {
3263 name: "foo",
3264 product_available: true,
3265 apex_available: ["myapex"],
3266 srcs: ["foo.cpp"],
3267 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003268 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003269
3270 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003271 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003272 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3273 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3274 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3275 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3276}
3277
Jooyung Han8e5685d2020-09-21 11:02:57 +09003278func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003279 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003280 testCases := []struct {
3281 name string
3282 additionalProp string
3283 }{
3284 {"system apex with prebuilt_firmware", ""},
3285 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3286 }
3287 for _, tc := range testCases {
3288 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003289 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003290 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003291 apex {
3292 name: "myapex",
3293 key: "myapex.key",
3294 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003296 `+tc.additionalProp+`
3297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 prebuilt_firmware {
3304 name: "myfirmware",
3305 src: "myfirmware.bin",
3306 filename_from_src: true,
3307 `+tc.additionalProp+`
3308 }
3309 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 "etc/firmware/myfirmware.bin",
3312 })
3313 })
3314 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003315}
3316
Jooyung Hanefb184e2020-06-25 17:14:25 +09003317func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003318 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003320 apex {
3321 name: "myapex",
3322 key: "myapex.key",
3323 vendor: true,
3324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003325 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003326 }
3327
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333
3334 cc_library {
3335 name: "mylib",
3336 vendor_available: true,
3337 }
3338 `)
3339
Jooyung Hana0503a52023-08-23 13:12:50 +09003340 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003341 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003342 name := apexBundle.BaseModuleName()
3343 prefix := "TARGET_"
3344 var builder strings.Builder
3345 data.Custom(&builder, name, prefix, "", data)
3346 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003348}
3349
Jooyung Han2ed99d02020-06-24 23:26:26 +09003350func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003351 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003352 apex {
3353 name: "myapex",
3354 key: "myapex.key",
3355 vintf_fragments: ["fragment.xml"],
3356 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003357 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003358 }
3359 apex_key {
3360 name: "myapex.key",
3361 public_key: "testkey.avbpubkey",
3362 private_key: "testkey.pem",
3363 }
3364 cc_binary {
3365 name: "mybin",
3366 }
3367 `)
3368
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003370 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003371 name := apexBundle.BaseModuleName()
3372 prefix := "TARGET_"
3373 var builder strings.Builder
3374 data.Custom(&builder, name, prefix, "", data)
3375 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003376 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003377 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378}
3379
Jiyong Park16e91a02018-12-20 18:18:08 +09003380func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003381 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003382 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003383 apex {
3384 name: "myapex",
3385 key: "myapex.key",
3386 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 srcs: ["mylib.cpp"],
3399 system_shared_libs: [],
3400 stl: "none",
3401 stubs: {
3402 versions: ["1", "2", "3"],
3403 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003404 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003405 }
3406
3407 cc_binary {
3408 name: "not_in_apex",
3409 srcs: ["mylib.cpp"],
3410 static_libs: ["mylib"],
3411 static_executable: true,
3412 system_shared_libs: [],
3413 stl: "none",
3414 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003415 `)
3416
Colin Cross7113d202019-11-20 16:39:12 -08003417 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003418
3419 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003420 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003421}
Jiyong Park9335a262018-12-24 11:31:58 +09003422
3423func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003424 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003425 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003426 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003427 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003428 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003429 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003430 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003431 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003433 }
3434
3435 cc_library {
3436 name: "mylib",
3437 srcs: ["mylib.cpp"],
3438 system_shared_libs: [],
3439 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003440 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 android_app_certificate {
3450 name: "myapex.certificate",
3451 certificate: "testkey",
3452 }
3453
3454 android_app_certificate {
3455 name: "myapex.certificate.override",
3456 certificate: "testkey.override",
3457 }
3458
Jiyong Park9335a262018-12-24 11:31:58 +09003459 `)
3460
3461 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003462 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003463
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003464 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3465 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003466 "vendor/foo/devkeys/testkey.avbpubkey")
3467 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003468 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3469 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003470 "vendor/foo/devkeys/testkey.pem")
3471 }
3472
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003473 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003474 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003475 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003476 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003477 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003478 }
3479}
Jiyong Park58e364a2019-01-19 19:24:06 +09003480
Jooyung Hanf121a652019-12-17 14:30:11 +09003481func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003485 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003490 }
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003496 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003497 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3498 if actual := rule.Args["certificates"]; actual != expected {
3499 t.Errorf("certificates should be %q, not %q", expected, actual)
3500 }
3501 })
3502 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003503 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003504 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003505 apex {
3506 name: "myapex_keytest",
3507 key: "myapex.key",
3508 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516 android_app_certificate {
3517 name: "myapex.certificate.override",
3518 certificate: "testkey.override",
3519 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003520 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003521 expected := "testkey.override.x509.pem testkey.override.pk8"
3522 if actual := rule.Args["certificates"]; actual != expected {
3523 t.Errorf("certificates should be %q, not %q", expected, actual)
3524 }
3525 })
3526 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003534 }
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540 android_app_certificate {
3541 name: "myapex.certificate",
3542 certificate: "testkey",
3543 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003544 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003545 expected := "testkey.x509.pem testkey.pk8"
3546 if actual := rule.Args["certificates"]; actual != expected {
3547 t.Errorf("certificates should be %q, not %q", expected, actual)
3548 }
3549 })
3550 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003551 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003552 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003553 apex {
3554 name: "myapex_keytest",
3555 key: "myapex.key",
3556 file_contexts: ":myapex-file_contexts",
3557 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003558 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003559 }
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565 android_app_certificate {
3566 name: "myapex.certificate.override",
3567 certificate: "testkey.override",
3568 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003569 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003570 expected := "testkey.override.x509.pem testkey.override.pk8"
3571 if actual := rule.Args["certificates"]; actual != expected {
3572 t.Errorf("certificates should be %q, not %q", expected, actual)
3573 }
3574 })
3575 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003576 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003577 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003578 apex {
3579 name: "myapex",
3580 key: "myapex.key",
3581 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003582 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003583 }
3584 apex_key {
3585 name: "myapex.key",
3586 public_key: "testkey.avbpubkey",
3587 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003588 }`,
3589 android.MockFS{
3590 "vendor/foo/devkeys/testkey.x509.pem": nil,
3591 }.AddToFixture(),
3592 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003593 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003594 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3595 if actual := rule.Args["certificates"]; actual != expected {
3596 t.Errorf("certificates should be %q, not %q", expected, actual)
3597 }
3598 })
3599 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003600 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003601 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003602 apex {
3603 name: "myapex_keytest",
3604 key: "myapex.key",
3605 file_contexts: ":myapex-file_contexts",
3606 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003607 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003608 }
3609 apex_key {
3610 name: "myapex.key",
3611 public_key: "testkey.avbpubkey",
3612 private_key: "testkey.pem",
3613 }
3614 android_app_certificate {
3615 name: "myapex.certificate.override",
3616 certificate: "testkey.override",
3617 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003618 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003619 expected := "testkey.override.x509.pem testkey.override.pk8"
3620 if actual := rule.Args["certificates"]; actual != expected {
3621 t.Errorf("certificates should be %q, not %q", expected, actual)
3622 }
3623 })
3624}
3625
Jiyong Park58e364a2019-01-19 19:24:06 +09003626func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003627 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003628 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003629 apex {
3630 name: "myapex",
3631 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003632 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003633 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003634 }
3635
3636 apex {
3637 name: "otherapex",
3638 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003639 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003640 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003641 }
3642
3643 apex_key {
3644 name: "myapex.key",
3645 public_key: "testkey.avbpubkey",
3646 private_key: "testkey.pem",
3647 }
3648
3649 cc_library {
3650 name: "mylib",
3651 srcs: ["mylib.cpp"],
3652 system_shared_libs: [],
3653 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003654 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003655 "myapex",
3656 "otherapex",
3657 ],
Jooyung Han24282772020-03-21 23:20:55 +09003658 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003659 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003660 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003661 cc_library {
3662 name: "mylib2",
3663 srcs: ["mylib.cpp"],
3664 system_shared_libs: [],
3665 stl: "none",
3666 apex_available: [
3667 "myapex",
3668 "otherapex",
3669 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003670 static_libs: ["mylib3"],
3671 recovery_available: true,
3672 min_sdk_version: "29",
3673 }
3674 cc_library {
3675 name: "mylib3",
3676 srcs: ["mylib.cpp"],
3677 system_shared_libs: [],
3678 stl: "none",
3679 apex_available: [
3680 "myapex",
3681 "otherapex",
3682 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003683 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003684 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003685 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003686 `)
3687
Jooyung Hanc87a0592020-03-02 17:44:33 +09003688 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003689 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003690 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003695
Vinh Tranf9754732023-01-19 22:41:46 -05003696 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003697 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003698 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003699
Colin Crossaede88c2020-08-11 12:17:01 -07003700 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3701 // each variant defines additional macros to distinguish which apex variant it is built for
3702
3703 // non-APEX variant does not have __ANDROID_APEX__ defined
3704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3706
Vinh Tranf9754732023-01-19 22:41:46 -05003707 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003708 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003710
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711 // non-APEX variant does not have __ANDROID_APEX__ defined
3712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3714
Vinh Tranf9754732023-01-19 22:41:46 -05003715 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003716 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003717 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003718}
Jiyong Park7e636d02019-01-28 16:16:54 +09003719
3720func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003721 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003722 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003723 apex {
3724 name: "myapex",
3725 key: "myapex.key",
3726 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003727 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
3736 cc_library_headers {
3737 name: "mylib_headers",
3738 export_include_dirs: ["my_include"],
3739 system_shared_libs: [],
3740 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003741 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003742 }
3743
3744 cc_library {
3745 name: "mylib",
3746 srcs: ["mylib.cpp"],
3747 system_shared_libs: [],
3748 stl: "none",
3749 header_libs: ["mylib_headers"],
3750 export_header_lib_headers: ["mylib_headers"],
3751 stubs: {
3752 versions: ["1", "2", "3"],
3753 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003754 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003755 }
3756
3757 cc_library {
3758 name: "otherlib",
3759 srcs: ["mylib.cpp"],
3760 system_shared_libs: [],
3761 stl: "none",
3762 shared_libs: ["mylib"],
3763 }
3764 `)
3765
Colin Cross7113d202019-11-20 16:39:12 -08003766 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003767
3768 // Ensure that the include path of the header lib is exported to 'otherlib'
3769 ensureContains(t, cFlags, "-Imy_include")
3770}
Alex Light9670d332019-01-29 18:07:33 -08003771
Jiyong Park7cd10e32020-01-14 09:22:18 +09003772type fileInApex struct {
3773 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003774 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003775 isLink bool
3776}
3777
Jooyung Han1724d582022-12-21 10:17:44 +09003778func (f fileInApex) String() string {
3779 return f.src + ":" + f.path
3780}
3781
3782func (f fileInApex) match(expectation string) bool {
3783 parts := strings.Split(expectation, ":")
3784 if len(parts) == 1 {
3785 match, _ := path.Match(parts[0], f.path)
3786 return match
3787 }
3788 if len(parts) == 2 {
3789 matchSrc, _ := path.Match(parts[0], f.src)
3790 matchDst, _ := path.Match(parts[1], f.path)
3791 return matchSrc && matchDst
3792 }
3793 panic("invalid expected file specification: " + expectation)
3794}
3795
Jooyung Hana57af4a2020-01-23 05:36:59 +00003796func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003798 module := ctx.ModuleForTests(moduleName, variant)
3799 apexRule := module.MaybeRule("apexRule")
3800 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003802 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 for _, cmd := range strings.Split(copyCmds, "&&") {
3804 cmd = strings.TrimSpace(cmd)
3805 if cmd == "" {
3806 continue
3807 }
3808 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 switch terms[0] {
3812 case "mkdir":
3813 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003814 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003815 t.Fatal("copyCmds contains invalid cp command", cmd)
3816 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003817 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003818 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003819 isLink = false
3820 case "ln":
3821 if len(terms) != 3 && len(terms) != 4 {
3822 // ln LINK TARGET or ln -s LINK TARGET
3823 t.Fatal("copyCmds contains invalid ln command", cmd)
3824 }
3825 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003826 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003827 isLink = true
3828 default:
3829 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3830 }
3831 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003832 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003833 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003834 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 }
Jooyung Han1724d582022-12-21 10:17:44 +09003836 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003837 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 }
3839 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003840 return ret
3841}
3842
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003843func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003844 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003845 var failed bool
3846 var surplus []string
3847 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003848 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003849 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003850 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003851 if file.match(expected) {
3852 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003853 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003854 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003855 }
3856 }
Jooyung Han1724d582022-12-21 10:17:44 +09003857 if !matchFound {
3858 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003859 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003860 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003861
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003864 t.Log("surplus files", surplus)
3865 failed = true
3866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003868 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003870 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003871 if !filesMatched[expected] {
3872 missing = append(missing, expected)
3873 }
3874 }
3875 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 t.Log("missing files", missing)
3877 failed = true
3878 }
3879 if failed {
3880 t.Fail()
3881 }
3882}
3883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3885 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3886}
3887
3888func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003889 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003890 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3891 if deapexer.Output != nil {
3892 outputs = append(outputs, deapexer.Output.String())
3893 }
3894 for _, output := range deapexer.ImplicitOutputs {
3895 outputs = append(outputs, output.String())
3896 }
3897 actualFiles := make([]fileInApex, 0, len(outputs))
3898 for _, output := range outputs {
3899 dir := "/deapexer/"
3900 pos := strings.LastIndex(output, dir)
3901 if pos == -1 {
3902 t.Fatal("Unknown deapexer output ", output)
3903 }
3904 path := output[pos+len(dir):]
3905 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3906 }
3907 assertFileListEquals(t, files, actualFiles)
3908}
3909
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910func vndkLibrariesTxtFiles(vers ...string) (result string) {
3911 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003912 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003913 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003914 prebuilt_etc {
3915 name: "` + txt + `.libraries.` + v + `.txt",
3916 src: "dummy.txt",
3917 }
3918 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 }
3920 }
3921 return
3922}
3923
Jooyung Han344d5432019-08-23 11:17:39 +09003924func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003925 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003926 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003927 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003928 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003929 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003931 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003932 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003933 }
3934
3935 apex_key {
3936 name: "myapex.key",
3937 public_key: "testkey.avbpubkey",
3938 private_key: "testkey.pem",
3939 }
3940
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 vndk_prebuilt_shared {
3942 name: "libvndk27",
3943 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003944 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003945 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003946 vndk: {
3947 enabled: true,
3948 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003949 target_arch: "arm64",
3950 arch: {
3951 arm: {
3952 srcs: ["libvndk27_arm.so"],
3953 },
3954 arm64: {
3955 srcs: ["libvndk27_arm64.so"],
3956 },
3957 },
Colin Cross2807f002021-03-02 10:15:29 -08003958 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 vndk_prebuilt_shared {
3962 name: "libvndk27",
3963 version: "27",
3964 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003965 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003966 vndk: {
3967 enabled: true,
3968 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003969 target_arch: "x86_64",
3970 arch: {
3971 x86: {
3972 srcs: ["libvndk27_x86.so"],
3973 },
3974 x86_64: {
3975 srcs: ["libvndk27_x86_64.so"],
3976 },
3977 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003978 }
3979 `+vndkLibrariesTxtFiles("27"),
3980 withFiles(map[string][]byte{
3981 "libvndk27_arm.so": nil,
3982 "libvndk27_arm64.so": nil,
3983 "libvndk27_x86.so": nil,
3984 "libvndk27_x86_64.so": nil,
3985 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003986
Jooyung Hana0503a52023-08-23 13:12:50 +09003987 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 "lib/libvndk27_arm.so",
3989 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003990 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003991 })
Jooyung Han344d5432019-08-23 11:17:39 +09003992}
3993
Jooyung Han90eee022019-10-01 20:02:42 +09003994func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003995 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003996 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003997 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003998 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003999 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004000 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004001 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004002 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004003 }
4004 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004005 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004006 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004008 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004009 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004010 }
4011 apex_key {
4012 name: "myapex.key",
4013 public_key: "testkey.avbpubkey",
4014 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004015 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004016
4017 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004018 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004019 apexManifestRule := module.Rule("apexManifestRule")
4020 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004021 }
4022
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004023 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004024 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004025}
4026
Jooyung Han344d5432019-08-23 11:17:39 +09004027func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004028 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004029 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004030 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004031 name: "com.android.vndk.v30",
4032 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004033 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004034 native_bridge_supported: true,
4035 }
4036
4037 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004038 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004039 public_key: "testkey.avbpubkey",
4040 private_key: "testkey.pem",
4041 }
4042
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004043 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004044 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 version: "30",
4046 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004047 srcs: ["mylib.cpp"],
4048 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004049 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004051 vndk: {
4052 enabled: true,
4053 },
Jooyung Han344d5432019-08-23 11:17:39 +09004054 }
4055 `)
4056}
4057
Jooyung Han31c470b2019-10-18 16:26:59 +09004058func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004059 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004060 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004062 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004064 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004066 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 vndk_prebuilt_shared {
4076 name: "libvndk27",
4077 version: "27",
4078 target_arch: "arm",
4079 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004080 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk: {
4082 enabled: true,
4083 },
4084 arch: {
4085 arm: {
4086 srcs: ["libvndk27.so"],
4087 }
4088 },
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 binder32bit: true,
4096 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004097 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 vndk: {
4099 enabled: true,
4100 },
4101 arch: {
4102 arm: {
4103 srcs: ["libvndk27binder32.so"],
4104 }
4105 },
Colin Cross2807f002021-03-02 10:15:29 -08004106 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004107 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004108 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 withFiles(map[string][]byte{
4110 "libvndk27.so": nil,
4111 "libvndk27binder32.so": nil,
4112 }),
4113 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004114 android.FixtureModifyConfig(func(config android.Config) {
4115 target := android.Target{
4116 Os: android.Android,
4117 Arch: android.Arch{
4118 ArchType: android.Arm,
4119 ArchVariant: "armv7-a-neon",
4120 Abi: []string{"armeabi-v7a"},
4121 },
4122 NativeBridge: android.NativeBridgeDisabled,
4123 NativeBridgeHostArchName: "",
4124 NativeBridgeRelativePath: "",
4125 }
4126 config.Targets[android.Android] = []android.Target{target}
4127 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }),
4129 )
4130
Jooyung Hana0503a52023-08-23 13:12:50 +09004131 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004133 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 })
4135}
4136
Jooyung Hane1633032019-08-01 17:41:43 +09004137func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004139 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004140 apex {
4141 name: "myapex_nodep",
4142 key: "myapex.key",
4143 native_shared_libs: ["lib_nodep"],
4144 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004145 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004146 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004147 }
4148
4149 apex {
4150 name: "myapex_dep",
4151 key: "myapex.key",
4152 native_shared_libs: ["lib_dep"],
4153 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004154 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004155 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004156 }
4157
4158 apex {
4159 name: "myapex_provider",
4160 key: "myapex.key",
4161 native_shared_libs: ["libfoo"],
4162 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004163 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004164 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004165 }
4166
4167 apex {
4168 name: "myapex_selfcontained",
4169 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004170 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004171 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004172 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004173 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004174 }
4175
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181
4182 cc_library {
4183 name: "lib_nodep",
4184 srcs: ["mylib.cpp"],
4185 system_shared_libs: [],
4186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004187 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004188 }
4189
4190 cc_library {
4191 name: "lib_dep",
4192 srcs: ["mylib.cpp"],
4193 shared_libs: ["libfoo"],
4194 system_shared_libs: [],
4195 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004196 apex_available: [
4197 "myapex_dep",
4198 "myapex_provider",
4199 "myapex_selfcontained",
4200 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004201 }
4202
4203 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004204 name: "lib_dep_on_bar",
4205 srcs: ["mylib.cpp"],
4206 shared_libs: ["libbar"],
4207 system_shared_libs: [],
4208 stl: "none",
4209 apex_available: [
4210 "myapex_selfcontained",
4211 ],
4212 }
4213
4214
4215 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004216 name: "libfoo",
4217 srcs: ["mytest.cpp"],
4218 stubs: {
4219 versions: ["1"],
4220 },
4221 system_shared_libs: [],
4222 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004223 apex_available: [
4224 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004225 ],
4226 }
4227
4228 cc_library {
4229 name: "libbar",
4230 srcs: ["mytest.cpp"],
4231 stubs: {
4232 versions: ["1"],
4233 },
4234 system_shared_libs: [],
4235 stl: "none",
4236 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004237 "myapex_selfcontained",
4238 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004239 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004240
Jooyung Hane1633032019-08-01 17:41:43 +09004241 `)
4242
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004244 var provideNativeLibs, requireNativeLibs []string
4245
Jooyung Hana0503a52023-08-23 13:12:50 +09004246 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004247 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4248 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004249 ensureListEmpty(t, provideNativeLibs)
4250 ensureListEmpty(t, requireNativeLibs)
4251
Jooyung Hana0503a52023-08-23 13:12:50 +09004252 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004253 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4254 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004255 ensureListEmpty(t, provideNativeLibs)
4256 ensureListContains(t, requireNativeLibs, "libfoo.so")
4257
Jooyung Hana0503a52023-08-23 13:12:50 +09004258 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4260 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004261 ensureListContains(t, provideNativeLibs, "libfoo.so")
4262 ensureListEmpty(t, requireNativeLibs)
4263
Jooyung Hana0503a52023-08-23 13:12:50 +09004264 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004265 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4266 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004267 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004268 ensureListEmpty(t, requireNativeLibs)
4269}
4270
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004271func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004272 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 ctx := testApex(t, `
4274 apex {
4275 name: "myapex",
4276 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004277 native_shared_libs: ["mylib"],
4278 updatable: false,
4279 }
4280
4281 apex_key {
4282 name: "myapex.key",
4283 public_key: "testkey.avbpubkey",
4284 private_key: "testkey.pem",
4285 }
4286
4287 cc_library {
4288 name: "mylib",
4289 srcs: ["mylib.cpp"],
4290 system_shared_libs: [],
4291 stl: "none",
4292 apex_available: [
4293 "//apex_available:platform",
4294 "myapex",
4295 ],
4296 }
4297 `, android.FixtureMergeEnv(map[string]string{
4298 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4299 }))
4300
Jooyung Hana0503a52023-08-23 13:12:50 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004302 apexManifestRule := module.Rule("apexManifestRule")
4303 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4304}
4305
Vinh Tran8f5310f2022-10-07 18:16:47 -04004306func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004307 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004308 testCases := []struct {
4309 compileMultiLibProp string
4310 containedLibs []string
4311 notContainedLibs []string
4312 }{
4313 {
4314 containedLibs: []string{
4315 "image.apex/lib64/mylib.so",
4316 "image.apex/lib/mylib.so",
4317 },
4318 compileMultiLibProp: `compile_multilib: "both",`,
4319 },
4320 {
4321 containedLibs: []string{"image.apex/lib64/mylib.so"},
4322 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4323 compileMultiLibProp: `compile_multilib: "first",`,
4324 },
4325 {
4326 containedLibs: []string{"image.apex/lib64/mylib.so"},
4327 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4328 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4329 },
4330 {
4331 containedLibs: []string{"image.apex/lib64/mylib.so"},
4332 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4333 compileMultiLibProp: `compile_multilib: "64",`,
4334 },
4335 {
4336 containedLibs: []string{"image.apex/lib/mylib.so"},
4337 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4338 compileMultiLibProp: `compile_multilib: "32",`,
4339 },
4340 }
4341 for _, testCase := range testCases {
4342 ctx := testApex(t, fmt.Sprintf(`
4343 apex {
4344 name: "myapex",
4345 key: "myapex.key",
4346 %s
4347 native_shared_libs: ["mylib"],
4348 updatable: false,
4349 }
4350 apex_key {
4351 name: "myapex.key",
4352 public_key: "testkey.avbpubkey",
4353 private_key: "testkey.pem",
4354 }
4355 cc_library {
4356 name: "mylib",
4357 srcs: ["mylib.cpp"],
4358 apex_available: [
4359 "//apex_available:platform",
4360 "myapex",
4361 ],
4362 }
4363 `, testCase.compileMultiLibProp),
4364 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004365 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004366 apexRule := module.Rule("apexRule")
4367 copyCmds := apexRule.Args["copy_commands"]
4368 for _, containedLib := range testCase.containedLibs {
4369 ensureContains(t, copyCmds, containedLib)
4370 }
4371 for _, notContainedLib := range testCase.notContainedLibs {
4372 ensureNotContains(t, copyCmds, notContainedLib)
4373 }
4374 }
4375}
4376
Alex Light0851b882019-02-07 13:20:53 -08004377func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004378 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004379 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004380 apex {
4381 name: "myapex",
4382 key: "myapex.key",
4383 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004385 }
4386
4387 apex_key {
4388 name: "myapex.key",
4389 public_key: "testkey.avbpubkey",
4390 private_key: "testkey.pem",
4391 }
4392
4393 cc_library {
4394 name: "mylib_common",
4395 srcs: ["mylib.cpp"],
4396 system_shared_libs: [],
4397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004398 apex_available: [
4399 "//apex_available:platform",
4400 "myapex",
4401 ],
Alex Light0851b882019-02-07 13:20:53 -08004402 }
4403 `)
4404
Jooyung Hana0503a52023-08-23 13:12:50 +09004405 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004406 apexRule := module.Rule("apexRule")
4407 copyCmds := apexRule.Args["copy_commands"]
4408
4409 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4410 t.Log("Apex was a test apex!")
4411 t.Fail()
4412 }
4413 // Ensure that main rule creates an output
4414 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4415
4416 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004417 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004418
4419 // Ensure that both direct and indirect deps are copied into apex
4420 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4421
Colin Cross7113d202019-11-20 16:39:12 -08004422 // Ensure that the platform variant ends with _shared
4423 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004424
Colin Cross56a83212020-09-15 18:30:11 -07004425 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004426 t.Log("Found mylib_common not in any apex!")
4427 t.Fail()
4428 }
4429}
4430
4431func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004432 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004433 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004434 apex_test {
4435 name: "myapex",
4436 key: "myapex.key",
4437 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004438 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004439 }
4440
4441 apex_key {
4442 name: "myapex.key",
4443 public_key: "testkey.avbpubkey",
4444 private_key: "testkey.pem",
4445 }
4446
4447 cc_library {
4448 name: "mylib_common_test",
4449 srcs: ["mylib.cpp"],
4450 system_shared_libs: [],
4451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004452 // TODO: remove //apex_available:platform
4453 apex_available: [
4454 "//apex_available:platform",
4455 "myapex",
4456 ],
Alex Light0851b882019-02-07 13:20:53 -08004457 }
4458 `)
4459
Jooyung Hana0503a52023-08-23 13:12:50 +09004460 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004461 apexRule := module.Rule("apexRule")
4462 copyCmds := apexRule.Args["copy_commands"]
4463
4464 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4465 t.Log("Apex was not a test apex!")
4466 t.Fail()
4467 }
4468 // Ensure that main rule creates an output
4469 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4470
4471 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004473
4474 // Ensure that both direct and indirect deps are copied into apex
4475 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4476
Colin Cross7113d202019-11-20 16:39:12 -08004477 // Ensure that the platform variant ends with _shared
4478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004479}
4480
Jooyung Han85707de2023-12-01 14:21:13 +09004481func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004482 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004483 ctx := testApex(t, `
4484 apex {
4485 name: "myapex",
4486 key: "myapex.key",
4487 updatable: false,
4488 binaries: ["mybin"],
4489 }
4490 apex {
4491 name: "myvendorapex",
4492 key: "myapex.key",
4493 file_contexts: "myvendorapex_file_contexts",
4494 vendor: true,
4495 updatable: false,
4496 binaries: ["mybin"],
4497 }
4498 apex_key {
4499 name: "myapex.key",
4500 public_key: "testkey.avbpubkey",
4501 private_key: "testkey.pem",
4502 }
4503 cc_binary {
4504 name: "mybin",
4505 vendor_available: true,
4506 system_shared_libs: [],
4507 stl: "none",
4508 shared_libs: ["libz"],
4509 apex_available: ["//apex_available:anyapex"],
4510 }
4511 cc_library {
4512 name: "libz",
4513 vendor_available: true,
4514 system_shared_libs: [],
4515 stl: "none",
4516 stubs: {
4517 versions: ["28", "30"],
4518 },
4519 target: {
4520 vendor: {
4521 no_stubs: true,
4522 },
4523 },
4524 }
4525 `, withFiles(map[string][]byte{
4526 "myvendorapex_file_contexts": nil,
4527 }))
4528
4529 // libz provides stubs for core variant.
4530 {
4531 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4532 "bin/mybin",
4533 })
4534 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4535 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4536 }
4537 // libz doesn't provide stubs for vendor variant.
4538 {
4539 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4540 "bin/mybin",
4541 "lib64/libz.so",
4542 })
4543 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4544 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4545 }
4546}
4547
Alex Light9670d332019-01-29 18:07:33 -08004548func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004549 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004550 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004551 apex {
4552 name: "myapex",
4553 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004554 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004555 multilib: {
4556 first: {
4557 native_shared_libs: ["mylib_common"],
4558 }
4559 },
4560 target: {
4561 android: {
4562 multilib: {
4563 first: {
4564 native_shared_libs: ["mylib"],
4565 }
4566 }
4567 },
4568 host: {
4569 multilib: {
4570 first: {
4571 native_shared_libs: ["mylib2"],
4572 }
4573 }
4574 }
4575 }
4576 }
4577
4578 apex_key {
4579 name: "myapex.key",
4580 public_key: "testkey.avbpubkey",
4581 private_key: "testkey.pem",
4582 }
4583
4584 cc_library {
4585 name: "mylib",
4586 srcs: ["mylib.cpp"],
4587 system_shared_libs: [],
4588 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004589 // TODO: remove //apex_available:platform
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
Alex Light9670d332019-01-29 18:07:33 -08004594 }
4595
4596 cc_library {
4597 name: "mylib_common",
4598 srcs: ["mylib.cpp"],
4599 system_shared_libs: [],
4600 stl: "none",
4601 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004602 // TODO: remove //apex_available:platform
4603 apex_available: [
4604 "//apex_available:platform",
4605 "myapex",
4606 ],
Alex Light9670d332019-01-29 18:07:33 -08004607 }
4608
4609 cc_library {
4610 name: "mylib2",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 compile_multilib: "first",
4615 }
4616 `)
4617
Jooyung Hana0503a52023-08-23 13:12:50 +09004618 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004619 copyCmds := apexRule.Args["copy_commands"]
4620
4621 // Ensure that main rule creates an output
4622 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4623
4624 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004625 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4626 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4627 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004628
4629 // Ensure that both direct and indirect deps are copied into apex
4630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4631 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4632 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4633
Colin Cross7113d202019-11-20 16:39:12 -08004634 // Ensure that the platform variant ends with _shared
4635 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4636 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4637 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004638}
Jiyong Park04480cf2019-02-06 00:16:29 +09004639
Jiyong Park59140302020-12-14 18:44:04 +09004640func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004641 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004647 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 arch: {
4649 arm64: {
4650 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 x86_64: {
4654 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004655 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004656 },
4657 }
4658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004667 name: "mylib.generic",
4668 srcs: ["mylib.cpp"],
4669 system_shared_libs: [],
4670 stl: "none",
4671 // TODO: remove //apex_available:platform
4672 apex_available: [
4673 "//apex_available:platform",
4674 "myapex",
4675 ],
4676 }
4677
4678 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004679 name: "mylib.arm64",
4680 srcs: ["mylib.cpp"],
4681 system_shared_libs: [],
4682 stl: "none",
4683 // TODO: remove //apex_available:platform
4684 apex_available: [
4685 "//apex_available:platform",
4686 "myapex",
4687 ],
4688 }
4689
4690 cc_library {
4691 name: "mylib.x64",
4692 srcs: ["mylib.cpp"],
4693 system_shared_libs: [],
4694 stl: "none",
4695 // TODO: remove //apex_available:platform
4696 apex_available: [
4697 "//apex_available:platform",
4698 "myapex",
4699 ],
4700 }
4701 `)
4702
Jooyung Hana0503a52023-08-23 13:12:50 +09004703 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004704 copyCmds := apexRule.Args["copy_commands"]
4705
4706 // Ensure that apex variant is created for the direct dep
4707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004708 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004709 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4710
4711 // Ensure that both direct and indirect deps are copied into apex
4712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4713 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4714}
4715
Jiyong Park04480cf2019-02-06 00:16:29 +09004716func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004718 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004719 apex {
4720 name: "myapex",
4721 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004722 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004723 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004724 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004725 }
4726
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732
4733 sh_binary {
4734 name: "myscript",
4735 src: "mylib.cpp",
4736 filename: "myscript.sh",
4737 sub_dir: "script",
4738 }
4739 `)
4740
Jooyung Hana0503a52023-08-23 13:12:50 +09004741 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004742 copyCmds := apexRule.Args["copy_commands"]
4743
4744 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4745}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004746
Jooyung Han91df2082019-11-20 01:49:42 +09004747func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004748 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004749 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004750 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004751 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004752 {"", "system"},
4753 {"product_specific: true", "product"},
4754 {"soc_specific: true", "vendor"},
4755 {"proprietary: true", "vendor"},
4756 {"vendor: true", "vendor"},
4757 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004758 }
4759 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004760 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004761 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004762 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004763 apex {
4764 name: "myapex",
4765 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004766 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004767 `+tc.propName+`
4768 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004769
Jooyung Han91df2082019-11-20 01:49:42 +09004770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004776
Jooyung Hana0503a52023-08-23 13:12:50 +09004777 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08004778 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004779 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004780 if actual != expected {
4781 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4782 }
Jooyung Han91df2082019-11-20 01:49:42 +09004783 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785}
Jiyong Park67882562019-03-21 01:11:21 +09004786
Jooyung Han580eb4f2020-06-24 19:33:06 +09004787func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004788 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004789 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 apex {
4791 name: "myapex",
4792 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004793 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004795
Jooyung Han580eb4f2020-06-24 19:33:06 +09004796 apex_key {
4797 name: "myapex.key",
4798 public_key: "testkey.avbpubkey",
4799 private_key: "testkey.pem",
4800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004802 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803 rule := module.Output("file_contexts")
4804 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4805}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806
Jooyung Han580eb4f2020-06-24 19:33:06 +09004807func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004808 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004809 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 apex {
4811 name: "myapex",
4812 key: "myapex.key",
4813 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004814 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004816
Jooyung Han580eb4f2020-06-24 19:33:06 +09004817 apex_key {
4818 name: "myapex.key",
4819 public_key: "testkey.avbpubkey",
4820 private_key: "testkey.pem",
4821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822 `, withFiles(map[string][]byte{
4823 "my_own_file_contexts": nil,
4824 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004825}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004826
Jooyung Han580eb4f2020-06-24 19:33:06 +09004827func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004828 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004829 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 product_specific: true,
4834 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004835 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004836 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004837
Jooyung Han580eb4f2020-06-24 19:33:06 +09004838 apex_key {
4839 name: "myapex.key",
4840 public_key: "testkey.avbpubkey",
4841 private_key: "testkey.pem",
4842 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004843 `)
4844
Colin Cross1c460562021-02-16 17:55:47 -08004845 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `, withFiles(map[string][]byte{
4860 "product_specific_file_contexts": nil,
4861 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004862 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863 rule := module.Output("file_contexts")
4864 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4865}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004866
Jooyung Han580eb4f2020-06-24 19:33:06 +09004867func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004868 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004869 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex {
4871 name: "myapex",
4872 key: "myapex.key",
4873 product_specific: true,
4874 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004875 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004876 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004877
Jooyung Han580eb4f2020-06-24 19:33:06 +09004878 apex_key {
4879 name: "myapex.key",
4880 public_key: "testkey.avbpubkey",
4881 private_key: "testkey.pem",
4882 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004883
Jooyung Han580eb4f2020-06-24 19:33:06 +09004884 filegroup {
4885 name: "my-file-contexts",
4886 srcs: ["product_specific_file_contexts"],
4887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004888 `, withFiles(map[string][]byte{
4889 "product_specific_file_contexts": nil,
4890 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004891 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 rule := module.Output("file_contexts")
4893 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004894}
4895
Jiyong Park67882562019-03-21 01:11:21 +09004896func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004898 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004899 apex_key {
4900 name: "myapex.key",
4901 public_key: ":my.avbpubkey",
4902 private_key: ":my.pem",
4903 product_specific: true,
4904 }
4905
4906 filegroup {
4907 name: "my.avbpubkey",
4908 srcs: ["testkey2.avbpubkey"],
4909 }
4910
4911 filegroup {
4912 name: "my.pem",
4913 srcs: ["testkey2.pem"],
4914 }
4915 `)
4916
4917 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4918 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004919 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004920 if actual_pubkey != expected_pubkey {
4921 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4922 }
4923 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004924 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004925 if actual_privkey != expected_privkey {
4926 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4927 }
4928}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929
4930func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004931 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004932 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004933 prebuilt_apex {
4934 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004935 arch: {
4936 arm64: {
4937 src: "myapex-arm64.apex",
4938 },
4939 arm: {
4940 src: "myapex-arm.apex",
4941 },
4942 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004943 }
4944 `)
4945
Wei Li340ee8e2022-03-18 17:33:24 -07004946 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4947 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004948
Jiyong Parkc95714e2019-03-29 14:23:10 +09004949 expectedInput := "myapex-arm64.apex"
4950 if prebuilt.inputApex.String() != expectedInput {
4951 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4952 }
Wei Li340ee8e2022-03-18 17:33:24 -07004953 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4954 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4955 rule := testingModule.Rule("genProvenanceMetaData")
4956 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4957 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4958 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4959 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004960
4961 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4962 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004963}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004964
Paul Duffinc0609c62021-03-01 17:27:16 +00004965func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004967 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004968 prebuilt_apex {
4969 name: "myapex",
4970 }
4971 `)
4972}
4973
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004974func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004975 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004976 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004977 prebuilt_apex {
4978 name: "myapex",
4979 src: "myapex-arm.apex",
4980 filename: "notmyapex.apex",
4981 }
4982 `)
4983
Wei Li340ee8e2022-03-18 17:33:24 -07004984 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4985 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004986
4987 expected := "notmyapex.apex"
4988 if p.installFilename != expected {
4989 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4990 }
Wei Li340ee8e2022-03-18 17:33:24 -07004991 rule := testingModule.Rule("genProvenanceMetaData")
4992 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4993 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4994 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4995 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004996}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004997
Samiul Islam7c02e262021-09-08 17:48:28 +01004998func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004999 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005000 testApex(t, `
5001 apex_set {
5002 name: "com.company.android.myapex",
5003 apex_name: "com.android.myapex",
5004 set: "company-myapex.apks",
5005 filename: "com.company.android.myapex.apex"
5006 }
5007 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5008
5009 testApex(t, `
5010 apex_set {
5011 name: "com.company.android.myapex",
5012 apex_name: "com.android.myapex",
5013 set: "company-myapex.apks",
5014 filename: "com.company.android.myapex.capex"
5015 }
5016 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5017
5018 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5019 apex_set {
5020 name: "com.company.android.myapex",
5021 apex_name: "com.android.myapex",
5022 set: "company-myapex.apks",
5023 filename: "some-random-suffix"
5024 }
5025 `)
5026}
5027
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005028func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005029 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005030 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005031 prebuilt_apex {
5032 name: "myapex.prebuilt",
5033 src: "myapex-arm.apex",
5034 overrides: [
5035 "myapex",
5036 ],
5037 }
5038 `)
5039
Wei Li340ee8e2022-03-18 17:33:24 -07005040 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5041 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005042
5043 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005044 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005045 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005046 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 }
Wei Li340ee8e2022-03-18 17:33:24 -07005048 rule := testingModule.Rule("genProvenanceMetaData")
5049 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5050 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5051 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5052 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005053}
5054
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005055func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005056 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005057 testApex(t, `
5058 prebuilt_apex {
5059 name: "com.company.android.myapex",
5060 apex_name: "com.android.myapex",
5061 src: "company-myapex-arm.apex",
5062 }
5063 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5064
5065 testApex(t, `
5066 apex_set {
5067 name: "com.company.android.myapex",
5068 apex_name: "com.android.myapex",
5069 set: "company-myapex.apks",
5070 }
5071 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5072}
5073
5074func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005075 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005076 _ = android.GroupFixturePreparers(
5077 java.PrepareForTestWithJavaDefaultModules,
5078 PrepareForTestWithApexBuildComponents,
5079 android.FixtureWithRootAndroidBp(`
5080 platform_bootclasspath {
5081 name: "platform-bootclasspath",
5082 fragments: [
5083 {
5084 apex: "com.android.art",
5085 module: "art-bootclasspath-fragment",
5086 },
5087 ],
5088 }
5089
5090 prebuilt_apex {
5091 name: "com.company.android.art",
5092 apex_name: "com.android.art",
5093 src: "com.company.android.art-arm.apex",
5094 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5095 }
5096
5097 prebuilt_bootclasspath_fragment {
5098 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005099 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005100 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005101 hidden_api: {
5102 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5103 metadata: "my-bootclasspath-fragment/metadata.csv",
5104 index: "my-bootclasspath-fragment/index.csv",
5105 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5106 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5107 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005108 }
5109
5110 java_import {
5111 name: "core-oj",
5112 jars: ["prebuilt.jar"],
5113 }
5114 `),
5115 ).RunTest(t)
5116}
5117
Spandan Das59a4a2b2024-01-09 21:35:56 +00005118// A minimal context object for use with DexJarBuildPath
5119type moduleErrorfTestCtx struct {
5120}
5121
5122func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5123}
5124
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005126 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005127 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005128 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005129 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5130 // is disabled.
5131 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005132
5133 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5134 // file creation.
5135 java.FixtureConfigureBootJars("platform:foo"),
5136 android.FixtureModifyMockFS(func(fs android.MockFS) {
5137 fs["platform/Android.bp"] = []byte(`
5138 java_library {
5139 name: "foo",
5140 srcs: ["Test.java"],
5141 compile_dex: true,
5142 }
5143 `)
5144 fs["platform/Test.java"] = nil
5145 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005146 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005147
Paul Duffin40a3f652021-07-19 13:11:24 +01005148 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005149 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005150 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005151 var rule android.TestingBuildParams
5152
5153 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5154 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005155 }
5156
Paul Duffin40a3f652021-07-19 13:11:24 +01005157 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5158 t.Helper()
5159 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5160 var rule android.TestingBuildParams
5161
5162 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5163 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5164 }
5165
Paul Duffin89f570a2021-06-16 01:42:33 +01005166 fragment := java.ApexVariantReference{
5167 Apex: proptools.StringPtr("myapex"),
5168 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5169 }
5170
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005172 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005173 bp := `
5174 prebuilt_apex {
5175 name: "myapex",
5176 arch: {
5177 arm64: {
5178 src: "myapex-arm64.apex",
5179 },
5180 arm: {
5181 src: "myapex-arm.apex",
5182 },
5183 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005184 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5185 }
5186
5187 prebuilt_bootclasspath_fragment {
5188 name: "my-bootclasspath-fragment",
5189 contents: ["libfoo", "libbar"],
5190 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005191 hidden_api: {
5192 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5193 metadata: "my-bootclasspath-fragment/metadata.csv",
5194 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005195 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5196 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5197 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005198 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005199 }
5200
Spandan Das52c01a12024-09-20 01:09:48 +00005201 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005203 public: {
5204 jars: ["libfoo.jar"],
5205 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005206 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005207 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005209 }
Paul Duffin37856732021-02-26 14:24:15 +00005210
5211 java_sdk_library_import {
5212 name: "libbar",
5213 public: {
5214 jars: ["libbar.jar"],
5215 },
5216 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005217 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005218 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005219 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005220 `
5221
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005223
Paul Duffin537ea3d2021-05-14 10:38:00 +01005224 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005225 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005226 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005227 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005228 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005229 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005230 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005231 })
5232
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005233 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005234 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005235 bp := `
5236 apex_set {
5237 name: "myapex",
5238 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005240 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5241 }
5242
Paul Duffin89f570a2021-06-16 01:42:33 +01005243 prebuilt_bootclasspath_fragment {
5244 name: "my-bootclasspath-fragment",
5245 contents: ["libfoo", "libbar"],
5246 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005247 hidden_api: {
5248 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5249 metadata: "my-bootclasspath-fragment/metadata.csv",
5250 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005251 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5252 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5253 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005254 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005255 }
5256
Liz Kammer2dc72442023-04-20 10:10:48 -04005257 prebuilt_systemserverclasspath_fragment {
5258 name: "my-systemserverclasspath-fragment",
5259 contents: ["libbaz"],
5260 apex_available: ["myapex"],
5261 }
5262
Spandan Das52c01a12024-09-20 01:09:48 +00005263 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005265 public: {
5266 jars: ["libfoo.jar"],
5267 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005268 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005269 shared_library: false,
5270 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Spandan Das52c01a12024-09-20 01:09:48 +00005273
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 java_sdk_library_import {
5275 name: "libbar",
5276 public: {
5277 jars: ["libbar.jar"],
5278 },
5279 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005280 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005281 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005282 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005283
5284 java_sdk_library_import {
5285 name: "libbaz",
5286 public: {
5287 jars: ["libbaz.jar"],
5288 },
5289 apex_available: ["myapex"],
5290 shared_library: false,
5291 permitted_packages: ["baz"],
5292 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005293 `
5294
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005296
Paul Duffin537ea3d2021-05-14 10:38:00 +01005297 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005298 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005300 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005301 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005302 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005303 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005304
5305 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5306
5307 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005308 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005309 "myjavalib.myapex",
5310 "libfoo.myapex",
5311 "libbar.myapex",
5312 "libbaz.myapex",
5313 }
5314 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5315 for i, e := range mkEntries {
5316 g := e.OverrideName
5317 if w := overrideNames[i]; w != g {
5318 t.Errorf("Expected override name %q, got %q", w, g)
5319 }
5320 }
5321
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005322 })
5323
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005325 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 bp := `
5327 prebuilt_apex {
5328 name: "myapex",
5329 arch: {
5330 arm64: {
5331 src: "myapex-arm64.apex",
5332 },
5333 arm: {
5334 src: "myapex-arm.apex",
5335 },
5336 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005337 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5338 }
5339
5340 prebuilt_bootclasspath_fragment {
5341 name: "my-bootclasspath-fragment",
5342 contents: ["libfoo", "libbar"],
5343 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005344 hidden_api: {
5345 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5346 metadata: "my-bootclasspath-fragment/metadata.csv",
5347 index: "my-bootclasspath-fragment/index.csv",
5348 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5349 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5350 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005351 }
5352
5353 java_import {
5354 name: "libfoo",
5355 jars: ["libfoo.jar"],
5356 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005357 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005358 }
5359
5360 java_library {
5361 name: "libfoo",
5362 srcs: ["foo/bar/MyClass.java"],
5363 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005364 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005365 }
Paul Duffin37856732021-02-26 14:24:15 +00005366
5367 java_sdk_library_import {
5368 name: "libbar",
5369 public: {
5370 jars: ["libbar.jar"],
5371 },
5372 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005373 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005374 }
5375
5376 java_sdk_library {
5377 name: "libbar",
5378 srcs: ["foo/bar/MyClass.java"],
5379 unsafe_ignore_missing_latest_api: true,
5380 apex_available: ["myapex"],
5381 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 `
5383
5384 // In this test the source (java_library) libfoo is active since the
5385 // prebuilt (java_import) defaults to prefer:false. However the
5386 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5387 // find the dex boot jar in it. We either need to disable the source libfoo
5388 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005390 // dexbootjar check is skipped if AllowMissingDependencies is true
5391 preparerAllowMissingDeps := android.GroupFixturePreparers(
5392 preparer,
5393 android.PrepareForTestWithAllowMissingDependencies,
5394 )
5395 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 })
5397
5398 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005399 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005401 apex {
5402 name: "myapex",
5403 key: "myapex.key",
5404 updatable: false,
5405 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5406 }
5407
5408 apex_key {
5409 name: "myapex.key",
5410 public_key: "testkey.avbpubkey",
5411 private_key: "testkey.pem",
5412 }
5413
5414 bootclasspath_fragment {
5415 name: "my-bootclasspath-fragment",
5416 contents: ["libfoo", "libbar"],
5417 apex_available: ["myapex"],
5418 hidden_api: {
5419 split_packages: ["*"],
5420 },
5421 }
5422
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005423 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",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005438 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 contents: ["libfoo", "libbar"],
5440 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005441 hidden_api: {
5442 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5443 metadata: "my-bootclasspath-fragment/metadata.csv",
5444 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005445 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5446 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5447 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005448 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005449 }
5450
Spandan Das52c01a12024-09-20 01:09:48 +00005451 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 name: "libfoo",
5453 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005454 public: {
5455 jars: ["libfoo.jar"],
5456 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005458 shared_library: false,
5459 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 }
5461
5462 java_library {
5463 name: "libfoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005466 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005467 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
Paul Duffin37856732021-02-26 14:24:15 +00005469
5470 java_sdk_library_import {
5471 name: "libbar",
5472 prefer: true,
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005477 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005478 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005479 }
5480
5481 java_sdk_library {
5482 name: "libbar",
5483 srcs: ["foo/bar/MyClass.java"],
5484 unsafe_ignore_missing_latest_api: true,
5485 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005486 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005487 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005488 `
5489
Paul Duffin89f570a2021-06-16 01:42:33 +01005490 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005491
Paul Duffin537ea3d2021-05-14 10:38:00 +01005492 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005493 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005494 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005495 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005496 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005497 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005498 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 })
5500
5501 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005502 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503 bp := `
5504 apex {
5505 name: "myapex",
5506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005507 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005508 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 }
5510
5511 apex_key {
5512 name: "myapex.key",
5513 public_key: "testkey.avbpubkey",
5514 private_key: "testkey.pem",
5515 }
5516
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005517 bootclasspath_fragment {
5518 name: "my-bootclasspath-fragment",
5519 contents: ["libfoo", "libbar"],
5520 apex_available: ["myapex"],
5521 hidden_api: {
5522 split_packages: ["*"],
5523 },
5524 }
5525
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 prebuilt_apex {
5527 name: "myapex",
5528 arch: {
5529 arm64: {
5530 src: "myapex-arm64.apex",
5531 },
5532 arm: {
5533 src: "myapex-arm.apex",
5534 },
5535 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005536 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5537 }
5538
5539 prebuilt_bootclasspath_fragment {
5540 name: "my-bootclasspath-fragment",
5541 contents: ["libfoo", "libbar"],
5542 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005543 hidden_api: {
5544 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5545 metadata: "my-bootclasspath-fragment/metadata.csv",
5546 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005547 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5548 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5549 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005550 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005551 }
5552
5553 java_import {
5554 name: "libfoo",
5555 jars: ["libfoo.jar"],
5556 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005557 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 }
5559
5560 java_library {
5561 name: "libfoo",
5562 srcs: ["foo/bar/MyClass.java"],
5563 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005564 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005565 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005566 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
Paul Duffin37856732021-02-26 14:24:15 +00005568
5569 java_sdk_library_import {
5570 name: "libbar",
5571 public: {
5572 jars: ["libbar.jar"],
5573 },
5574 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005575 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005576 }
5577
5578 java_sdk_library {
5579 name: "libbar",
5580 srcs: ["foo/bar/MyClass.java"],
5581 unsafe_ignore_missing_latest_api: true,
5582 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005583 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005584 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005585 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005586 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005587 `
5588
Paul Duffin89f570a2021-06-16 01:42:33 +01005589 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005590
Paul Duffin537ea3d2021-05-14 10:38:00 +01005591 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005592 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5594 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005595 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5596 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 })
5599
5600 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005601 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005602 bp := `
5603 apex {
5604 name: "myapex",
5605 enabled: false,
5606 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005607 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 }
5609
5610 apex_key {
5611 name: "myapex.key",
5612 public_key: "testkey.avbpubkey",
5613 private_key: "testkey.pem",
5614 }
5615
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005616 bootclasspath_fragment {
5617 name: "my-bootclasspath-fragment",
5618 enabled: false,
5619 contents: ["libfoo", "libbar"],
5620 apex_available: ["myapex"],
5621 hidden_api: {
5622 split_packages: ["*"],
5623 },
5624 }
5625
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005626 prebuilt_apex {
5627 name: "myapex",
5628 arch: {
5629 arm64: {
5630 src: "myapex-arm64.apex",
5631 },
5632 arm: {
5633 src: "myapex-arm.apex",
5634 },
5635 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005636 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5637 }
5638
5639 prebuilt_bootclasspath_fragment {
5640 name: "my-bootclasspath-fragment",
5641 contents: ["libfoo", "libbar"],
5642 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005643 hidden_api: {
5644 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5645 metadata: "my-bootclasspath-fragment/metadata.csv",
5646 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005647 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5648 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5649 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005650 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 }
5652
5653 java_import {
5654 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005655 jars: ["libfoo.jar"],
5656 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005657 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005658 }
5659
5660 java_library {
5661 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005662 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005663 srcs: ["foo/bar/MyClass.java"],
5664 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005665 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005666 }
Paul Duffin37856732021-02-26 14:24:15 +00005667
5668 java_sdk_library_import {
5669 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005670 public: {
5671 jars: ["libbar.jar"],
5672 },
5673 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005674 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005675 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005676 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005677 }
5678
5679 java_sdk_library {
5680 name: "libbar",
5681 srcs: ["foo/bar/MyClass.java"],
5682 unsafe_ignore_missing_latest_api: true,
5683 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005684 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005685 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005686 `
Cole Fausta963b942024-04-11 17:43:00 -07005687 // This test disables libbar, which causes the ComponentDepsMutator to add
5688 // deps on libbar.stubs and other sub-modules that don't exist. We can
5689 // enable AllowMissingDependencies to work around that, but enabling that
5690 // causes extra checks for missing source files to dex_bootjars, so add those
5691 // to the mock fs as well.
5692 preparer2 := android.GroupFixturePreparers(
5693 preparer,
5694 android.PrepareForTestWithAllowMissingDependencies,
5695 android.FixtureMergeMockFs(map[string][]byte{
5696 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005697 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005698 }),
5699 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005700
Cole Fausta963b942024-04-11 17:43:00 -07005701 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005702
Paul Duffin537ea3d2021-05-14 10:38:00 +01005703 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005704 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005705 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005706 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005707 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005708 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005709 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005710 })
Spandan Das3a392012024-01-17 18:26:27 +00005711
Spandan Dasf2c10572024-02-27 04:49:52 +00005712 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005713 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005714 bp := `
5715 // Source
5716 apex {
5717 name: "myapex",
5718 enabled: false,
5719 key: "myapex.key",
5720 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 // Prebuilt
5730 prebuilt_apex {
5731 name: "myapex.v1",
5732 source_apex_name: "myapex",
5733 arch: {
5734 arm64: {
5735 src: "myapex-arm64.apex",
5736 },
5737 arm: {
5738 src: "myapex-arm.apex",
5739 },
5740 },
5741 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5742 prefer: true,
5743 }
5744 prebuilt_apex {
5745 name: "myapex.v2",
5746 source_apex_name: "myapex",
5747 arch: {
5748 arm64: {
5749 src: "myapex-arm64.apex",
5750 },
5751 arm: {
5752 src: "myapex-arm.apex",
5753 },
5754 },
5755 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5756 prefer: true,
5757 }
5758
5759 prebuilt_bootclasspath_fragment {
5760 name: "my-bootclasspath-fragment",
5761 contents: ["libfoo", "libbar"],
5762 apex_available: ["myapex"],
5763 hidden_api: {
5764 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5765 metadata: "my-bootclasspath-fragment/metadata.csv",
5766 index: "my-bootclasspath-fragment/index.csv",
5767 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5768 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5769 },
5770 prefer: true,
5771 }
5772
5773 java_import {
5774 name: "libfoo",
5775 jars: ["libfoo.jar"],
5776 apex_available: ["myapex"],
5777 prefer: true,
5778 }
5779 java_import {
5780 name: "libbar",
5781 jars: ["libbar.jar"],
5782 apex_available: ["myapex"],
5783 prefer: true,
5784 }
5785 `
5786
Spandan Dasf2c10572024-02-27 04:49:52 +00005787 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 +00005788 })
5789
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005790}
5791
Roland Levillain630846d2019-06-26 12:48:34 +01005792func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005793 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005794 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005795 apex_test {
5796 name: "myapex",
5797 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005798 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005799 tests: [
5800 "mytest",
5801 ],
5802 }
5803
5804 apex_key {
5805 name: "myapex.key",
5806 public_key: "testkey.avbpubkey",
5807 private_key: "testkey.pem",
5808 }
5809
Liz Kammer1c14a212020-05-12 15:26:55 -07005810 filegroup {
5811 name: "fg",
5812 srcs: [
5813 "baz",
5814 "bar/baz"
5815 ],
5816 }
5817
Roland Levillain630846d2019-06-26 12:48:34 +01005818 cc_test {
5819 name: "mytest",
5820 gtest: false,
5821 srcs: ["mytest.cpp"],
5822 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005823 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005824 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005825 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005826 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005827 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005828
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005829 cc_library {
5830 name: "mylib",
5831 srcs: ["mylib.cpp"],
5832 system_shared_libs: [],
5833 stl: "none",
5834 }
5835
Liz Kammer5bd365f2020-05-27 15:15:11 -07005836 filegroup {
5837 name: "fg2",
5838 srcs: [
5839 "testdata/baz"
5840 ],
5841 }
Roland Levillain630846d2019-06-26 12:48:34 +01005842 `)
5843
Jooyung Hana0503a52023-08-23 13:12:50 +09005844 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005845 copyCmds := apexRule.Args["copy_commands"]
5846
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005847 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005848 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005849 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005850
Liz Kammer1c14a212020-05-12 15:26:55 -07005851 //Ensure that test data are copied into apex.
5852 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5853 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5854
Roland Levillainf89cd092019-07-29 16:22:59 +01005855 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005856 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005857 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005858 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005859 prefix := "TARGET_"
5860 var builder strings.Builder
5861 data.Custom(&builder, name, prefix, "", data)
5862 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005863 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005864 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005865}
5866
Jooyung Hand48f3c32019-08-23 11:18:57 +09005867func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005868 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005869 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5870 apex {
5871 name: "myapex",
5872 key: "myapex.key",
5873 native_shared_libs: ["libfoo"],
5874 }
5875
5876 apex_key {
5877 name: "myapex.key",
5878 public_key: "testkey.avbpubkey",
5879 private_key: "testkey.pem",
5880 }
5881
5882 cc_library {
5883 name: "libfoo",
5884 stl: "none",
5885 system_shared_libs: [],
5886 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005887 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005888 }
5889 `)
5890 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 java_libs: ["myjar"],
5895 }
5896
5897 apex_key {
5898 name: "myapex.key",
5899 public_key: "testkey.avbpubkey",
5900 private_key: "testkey.pem",
5901 }
5902
5903 java_library {
5904 name: "myjar",
5905 srcs: ["foo/bar/MyClass.java"],
5906 sdk_version: "none",
5907 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005908 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005909 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005910 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005911 }
5912 `)
5913}
5914
Bill Peckhama41a6962021-01-11 10:58:54 -08005915func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005916 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005917 apex {
5918 name: "myapex",
5919 key: "myapex.key",
5920 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005921 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005922 }
5923
5924 apex_key {
5925 name: "myapex.key",
5926 public_key: "testkey.avbpubkey",
5927 private_key: "testkey.pem",
5928 }
5929
5930 java_import {
5931 name: "myjavaimport",
5932 apex_available: ["myapex"],
5933 jars: ["my.jar"],
5934 compile_dex: true,
5935 }
5936 `)
5937
Jooyung Hana0503a52023-08-23 13:12:50 +09005938 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 apexRule := module.Rule("apexRule")
5940 copyCmds := apexRule.Args["copy_commands"]
5941 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5942}
5943
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005945 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 apps: [
5951 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005952 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005954 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005955 }
5956
5957 apex_key {
5958 name: "myapex.key",
5959 public_key: "testkey.avbpubkey",
5960 private_key: "testkey.pem",
5961 }
5962
5963 android_app {
5964 name: "AppFoo",
5965 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005967 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005968 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005969 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005971 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005973
5974 android_app {
5975 name: "AppFooPriv",
5976 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005977 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005978 system_modules: "none",
5979 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005980 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005981 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005982 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005983 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005984
5985 cc_library_shared {
5986 name: "libjni",
5987 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005988 shared_libs: ["libfoo"],
5989 stl: "none",
5990 system_shared_libs: [],
5991 apex_available: [ "myapex" ],
5992 sdk_version: "current",
5993 }
5994
5995 cc_library_shared {
5996 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 stl: "none",
5998 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005999 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006000 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006001 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 `)
6003
Jooyung Hana0503a52023-08-23 13:12:50 +09006004 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005 apexRule := module.Rule("apexRule")
6006 copyCmds := apexRule.Args["copy_commands"]
6007
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006008 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6009 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006010 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011
Colin Crossaede88c2020-08-11 12:17:01 -07006012 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006014 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006015 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006016 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // JNI libraries including transitive deps are
6018 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006019 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006020 // ... embedded inside APK (jnilibs.zip)
6021 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6022 // ... and not directly inside the APEX
6023 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6024 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006025
6026 apexBundle := module.Module().(*apexBundle)
6027 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6028 var builder strings.Builder
6029 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6030 androidMk := builder.String()
6031 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6032 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6033 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6034 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6035 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6036 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 +01006037}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006038
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006039func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006040 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006041 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6042 for _, id := range invalidBuildIds {
6043 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6044 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6045 variables.BuildId = proptools.StringPtr(id)
6046 })
6047 testApexError(t, message, `apex {
6048 name: "myapex",
6049 key: "myapex.key",
6050 apps: ["AppFooPrebuilt"],
6051 updatable: false,
6052 }
6053
6054 apex_key {
6055 name: "myapex.key",
6056 public_key: "testkey.avbpubkey",
6057 private_key: "testkey.pem",
6058 }
6059
6060 android_app_import {
6061 name: "AppFooPrebuilt",
6062 apk: "PrebuiltAppFoo.apk",
6063 presigned: true,
6064 apex_available: ["myapex"],
6065 }
6066 `, fixture)
6067 }
6068}
6069
Dario Frenicde2a032019-10-27 00:29:22 +01006070func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006071 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006072 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006073 apex {
6074 name: "myapex",
6075 key: "myapex.key",
6076 apps: [
6077 "AppFooPrebuilt",
6078 "AppFooPrivPrebuilt",
6079 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006080 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006081 }
6082
6083 apex_key {
6084 name: "myapex.key",
6085 public_key: "testkey.avbpubkey",
6086 private_key: "testkey.pem",
6087 }
6088
6089 android_app_import {
6090 name: "AppFooPrebuilt",
6091 apk: "PrebuiltAppFoo.apk",
6092 presigned: true,
6093 dex_preopt: {
6094 enabled: false,
6095 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006096 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006097 }
6098
6099 android_app_import {
6100 name: "AppFooPrivPrebuilt",
6101 apk: "PrebuiltAppFooPriv.apk",
6102 privileged: true,
6103 presigned: true,
6104 dex_preopt: {
6105 enabled: false,
6106 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006107 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006108 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006109 }
6110 `)
6111
Jooyung Hana0503a52023-08-23 13:12:50 +09006112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006113 apexRule := module.Rule("apexRule")
6114 copyCmds := apexRule.Args["copy_commands"]
6115
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006116 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6117 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006118}
6119
6120func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006121 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 apps: [
6127 "AppFoo",
6128 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006129 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006130 }
6131
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }
6137
6138 android_app {
6139 name: "AppFoo",
6140 srcs: ["foo/bar/MyClass.java"],
6141 sdk_version: "none",
6142 system_modules: "none",
6143 apex_available: [ "myapex" ],
6144 }
6145
6146 android_app_import {
6147 name: "AppFoo",
6148 apk: "AppFooPrebuilt.apk",
6149 filename: "AppFooPrebuilt.apk",
6150 presigned: true,
6151 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006152 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006153 }
6154 `, withFiles(map[string][]byte{
6155 "AppFooPrebuilt.apk": nil,
6156 }))
6157
Jooyung Hana0503a52023-08-23 13:12:50 +09006158 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006159 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006160 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006161}
6162
Dario Freni6f3937c2019-12-20 22:58:03 +00006163func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006164 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006165 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 apps: [
6170 "TesterHelpAppFoo",
6171 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006172 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 android_test_helper_app {
6182 name: "TesterHelpAppFoo",
6183 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006184 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006185 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006186 }
6187
6188 `)
6189
Jooyung Hana0503a52023-08-23 13:12:50 +09006190 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191 apexRule := module.Rule("apexRule")
6192 copyCmds := apexRule.Args["copy_commands"]
6193
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006194 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006195}
6196
Jooyung Han18020ea2019-11-13 10:50:48 +09006197func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006198 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006199 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006200 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006201 apex {
6202 name: "myapex",
6203 key: "myapex.key",
6204 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006205 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006206 }
6207
6208 apex_key {
6209 name: "myapex.key",
6210 public_key: "testkey.avbpubkey",
6211 private_key: "testkey.pem",
6212 }
6213
6214 apex {
6215 name: "otherapex",
6216 key: "myapex.key",
6217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006218 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006219 }
6220
6221 cc_defaults {
6222 name: "libfoo-defaults",
6223 apex_available: ["otherapex"],
6224 }
6225
6226 cc_library {
6227 name: "libfoo",
6228 defaults: ["libfoo-defaults"],
6229 stl: "none",
6230 system_shared_libs: [],
6231 }`)
6232}
6233
Paul Duffine52e66f2020-03-30 17:54:29 +01006234func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006235 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006237 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006238 apex {
6239 name: "myapex",
6240 key: "myapex.key",
6241 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006242 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006243 }
6244
6245 apex_key {
6246 name: "myapex.key",
6247 public_key: "testkey.avbpubkey",
6248 private_key: "testkey.pem",
6249 }
6250
6251 apex {
6252 name: "otherapex",
6253 key: "otherapex.key",
6254 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006255 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 }
6257
6258 apex_key {
6259 name: "otherapex.key",
6260 public_key: "testkey.avbpubkey",
6261 private_key: "testkey.pem",
6262 }
6263
6264 cc_library {
6265 name: "libfoo",
6266 stl: "none",
6267 system_shared_libs: [],
6268 apex_available: ["otherapex"],
6269 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006270
6271 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6272 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6273 testApex(t, `
6274 apex {
6275 name: "com.sdv.myapex",
6276 key: "myapex.key",
6277 native_shared_libs: ["libfoo"],
6278 updatable: false,
6279 product_specific: true,
6280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 apex {
6289 name: "com.any.otherapex",
6290 key: "otherapex.key",
6291 native_shared_libs: ["libfoo"],
6292 updatable: false,
6293 }
6294
6295 apex_key {
6296 name: "otherapex.key",
6297 public_key: "testkey.avbpubkey",
6298 private_key: "testkey.pem",
6299 }
6300
6301 cc_library {
6302 name: "libfoo",
6303 stl: "none",
6304 system_shared_libs: [],
6305 apex_available: ["com.any.otherapex"],
6306 product_specific: true,
6307 }`,
6308 android.FixtureMergeMockFs(android.MockFS{
6309 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6310 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6311 }))
6312
6313 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6314 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6315 apex {
6316 name: "com.sdv.myapex",
6317 key: "myapex.key",
6318 native_shared_libs: ["libfoo"],
6319 updatable: false,
6320 }
6321
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327
6328 apex {
6329 name: "com.any.otherapex",
6330 key: "otherapex.key",
6331 native_shared_libs: ["libfoo"],
6332 updatable: false,
6333 }
6334
6335 apex_key {
6336 name: "otherapex.key",
6337 public_key: "testkey.avbpubkey",
6338 private_key: "testkey.pem",
6339 }
6340
6341 cc_library {
6342 name: "libfoo",
6343 stl: "none",
6344 system_shared_libs: [],
6345 apex_available: ["com.any.otherapex"],
6346 }`,
6347 android.FixtureMergeMockFs(android.MockFS{
6348 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6349 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6350 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006351}
Jiyong Park127b40b2019-09-30 16:04:35 +09006352
Paul Duffine52e66f2020-03-30 17:54:29 +01006353func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006354 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006355 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006356 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006357.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006358.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006359.*via tag cc\.dependencyTag.*
6360.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006361.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006362.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006363.*via tag cc\.dependencyTag.*
6364.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006365.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006366.*-> libbaz.*link:shared.*
6367.*via tag cc\.dependencyTag.*
6368.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
Jiyong Park127b40b2019-09-30 16:04:35 +09006382 cc_library {
6383 name: "libfoo",
6384 stl: "none",
6385 shared_libs: ["libbar"],
6386 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006387 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006388 }
6389
6390 cc_library {
6391 name: "libbar",
6392 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006393 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006394 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006395 apex_available: ["myapex"],
6396 }
6397
6398 cc_library {
6399 name: "libbaz",
6400 stl: "none",
6401 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006402 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006403
6404 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6405 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6406 testApex(t, `
6407 apex {
6408 name: "com.sdv.myapex",
6409 key: "myapex.key",
6410 native_shared_libs: ["libfoo"],
6411 updatable: false,
6412 product_specific: true,
6413 }
6414
6415 apex_key {
6416 name: "myapex.key",
6417 public_key: "testkey.avbpubkey",
6418 private_key: "testkey.pem",
6419 }
6420
6421 cc_library {
6422 name: "libfoo",
6423 stl: "none",
6424 shared_libs: ["libbar"],
6425 system_shared_libs: [],
6426 apex_available: ["com.sdv.myapex"],
6427 product_specific: true,
6428 }
6429
6430 cc_library {
6431 name: "libbar",
6432 stl: "none",
6433 shared_libs: ["libbaz"],
6434 system_shared_libs: [],
6435 apex_available: ["com.sdv.myapex"],
6436 product_specific: true,
6437 }
6438
6439 cc_library {
6440 name: "libbaz",
6441 stl: "none",
6442 system_shared_libs: [],
6443 product_specific: true,
6444 }`,
6445 android.FixtureMergeMockFs(android.MockFS{
6446 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6447 }))
6448
6449 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6450 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6451 apex {
6452 name: "com.sdv.myapex",
6453 key: "myapex.key",
6454 native_shared_libs: ["libfoo"],
6455 updatable: false,
6456 }
6457
6458 apex_key {
6459 name: "myapex.key",
6460 public_key: "testkey.avbpubkey",
6461 private_key: "testkey.pem",
6462 }
6463
6464 cc_library {
6465 name: "libfoo",
6466 stl: "none",
6467 shared_libs: ["libbar"],
6468 system_shared_libs: [],
6469 apex_available: ["com.sdv.myapex"],
6470 }
6471
6472 cc_library {
6473 name: "libbar",
6474 stl: "none",
6475 shared_libs: ["libbaz"],
6476 system_shared_libs: [],
6477 apex_available: ["com.sdv.myapex"],
6478 }
6479
6480 cc_library {
6481 name: "libbaz",
6482 stl: "none",
6483 system_shared_libs: [],
6484 }`,
6485 android.FixtureMergeMockFs(android.MockFS{
6486 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6487 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006488}
Jiyong Park127b40b2019-09-30 16:04:35 +09006489
Liz Kammer5f108fa2023-05-11 14:33:17 -04006490func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006491 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006492 testApex(t, `
6493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["libfoo"],
6497 updatable: false,
6498 }
6499
6500 apex_key {
6501 name: "myapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 static_libs: ["libbar"],
6510 system_shared_libs: [],
6511 apex_available: ["myapex"],
6512 }
6513
6514 cc_library {
6515 name: "libbar",
6516 stl: "none",
6517 shared_libs: ["libbaz"],
6518 system_shared_libs: [],
6519 apex_available: ["myapex"],
6520 }
6521
6522 cc_library {
6523 name: "libbaz",
6524 stl: "none",
6525 system_shared_libs: [],
6526 }`)
6527
6528 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6529 apex {
6530 name: "myapex",
6531 key: "myapex.key",
6532 native_shared_libs: ["libfoo"],
6533 updatable: false,
6534 }
6535
6536 apex_key {
6537 name: "myapex.key",
6538 public_key: "testkey.avbpubkey",
6539 private_key: "testkey.pem",
6540 }
6541
6542 cc_library {
6543 name: "libfoo",
6544 stl: "none",
6545 static_libs: ["libbar"],
6546 system_shared_libs: [],
6547 apex_available: ["myapex"],
6548 }
6549
6550 cc_library {
6551 name: "libbar",
6552 stl: "none",
6553 system_shared_libs: [],
6554 }`)
6555}
6556
Paul Duffine52e66f2020-03-30 17:54:29 +01006557func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006558 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 testApexError(t, "\"otherapex\" is not a valid module name", `
6560 apex {
6561 name: "myapex",
6562 key: "myapex.key",
6563 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006564 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006565 }
6566
6567 apex_key {
6568 name: "myapex.key",
6569 public_key: "testkey.avbpubkey",
6570 private_key: "testkey.pem",
6571 }
6572
6573 cc_library {
6574 name: "libfoo",
6575 stl: "none",
6576 system_shared_libs: [],
6577 apex_available: ["otherapex"],
6578 }`)
6579
Paul Duffine52e66f2020-03-30 17:54:29 +01006580 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006581 apex {
6582 name: "myapex",
6583 key: "myapex.key",
6584 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006585 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006586 }
6587
6588 apex_key {
6589 name: "myapex.key",
6590 public_key: "testkey.avbpubkey",
6591 private_key: "testkey.pem",
6592 }
6593
6594 cc_library {
6595 name: "libfoo",
6596 stl: "none",
6597 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006598 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006599 apex_available: ["myapex"],
6600 }
6601
6602 cc_library {
6603 name: "libbar",
6604 stl: "none",
6605 system_shared_libs: [],
6606 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006607 }
6608
6609 cc_library {
6610 name: "libbaz",
6611 stl: "none",
6612 system_shared_libs: [],
6613 stubs: {
6614 versions: ["10", "20", "30"],
6615 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006616 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006617}
Jiyong Park127b40b2019-09-30 16:04:35 +09006618
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006619func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006620 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006621 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006622 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006623 testApexError(t, "expected an integer between 0-9; got -1", `
6624 apex {
6625 name: "myapex",
6626 key: "myapex.key",
6627 apex_available_name: "com.android.foo",
6628 variant_version: "-1",
6629 updatable: false,
6630 }
6631 apex_key {
6632 name: "myapex.key",
6633 public_key: "testkey.avbpubkey",
6634 private_key: "testkey.pem",
6635 }
6636 `)
6637 })
6638
6639 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006640 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006641 testApexError(t, "expected an integer between 0-9; got 10", `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 apex_available_name: "com.android.foo",
6646 variant_version: "10",
6647 updatable: false,
6648 }
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654 `)
6655 })
6656}
6657
6658func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006659 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006660 context := android.GroupFixturePreparers(
6661 android.PrepareForIntegrationTestWithAndroid,
6662 PrepareForTestWithApexBuildComponents,
6663 android.FixtureMergeMockFs(android.MockFS{
6664 "system/sepolicy/apex/foo-file_contexts": nil,
6665 "system/sepolicy/apex/bar-file_contexts": nil,
6666 }),
6667 )
6668 result := context.RunTestWithBp(t, `
6669 apex {
6670 name: "foo",
6671 key: "myapex.key",
6672 apex_available_name: "com.android.foo",
6673 variant_version: "0",
6674 updatable: false,
6675 }
6676 apex {
6677 name: "bar",
6678 key: "myapex.key",
6679 apex_available_name: "com.android.foo",
6680 variant_version: "3",
6681 updatable: false,
6682 }
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006688 override_apex {
6689 name: "myoverrideapex",
6690 base: "bar",
6691 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006692 `)
6693
Jooyung Hana0503a52023-08-23 13:12:50 +09006694 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006695 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006696 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6697 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6698 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6699 }
6700
Jooyung Hana0503a52023-08-23 13:12:50 +09006701 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006702 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6704 barActualDefaultVersion := barManifestRule.Args["default_version"]
6705 if barActualDefaultVersion != barExpectedDefaultVersion {
6706 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6707 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006708
Spandan Das50801e22024-05-13 18:29:45 +00006709 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006710 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6711 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6712 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6713 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714}
6715
Sam Delmericoca816532023-06-02 14:09:50 -04006716func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006717 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006718 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 -07006719 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006720 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6721 apex {
6722 name: "myapex_sminus",
6723 key: "myapex.key",
6724 apps: ["AppFoo"],
6725 apex_available_name: "myapex",
6726 updatable: false,
6727 }
6728 apex {
6729 name: "myapex",
6730 key: "myapex.key",
6731 apps: ["AppFoo"],
6732 updatable: false,
6733 }
6734 apex_key {
6735 name: "myapex.key",
6736 public_key: "testkey.avbpubkey",
6737 private_key: "testkey.pem",
6738 }
6739 android_app {
6740 name: "AppFoo",
6741 srcs: ["foo/bar/MyClass.java"],
6742 sdk_version: "none",
6743 system_modules: "none",
6744 apex_available: [ "myapex_sminus" ],
6745 }`,
6746 android.FixtureMergeMockFs(android.MockFS{
6747 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6748 }),
6749 )
6750 })
6751
6752 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 -07006753 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006754 testApex(t, `
6755 apex {
6756 name: "myapex_sminus",
6757 key: "myapex.key",
6758 apps: ["AppFoo"],
6759 apex_available_name: "myapex",
6760 updatable: false,
6761 }
6762 apex {
6763 name: "myapex",
6764 key: "myapex.key",
6765 apps: ["AppFoo"],
6766 updatable: false,
6767 }
6768 apex_key {
6769 name: "myapex.key",
6770 public_key: "testkey.avbpubkey",
6771 private_key: "testkey.pem",
6772 }
6773 android_app {
6774 name: "AppFoo",
6775 srcs: ["foo/bar/MyClass.java"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 apex_available: [ "myapex" ],
6779 }`,
6780 android.FixtureMergeMockFs(android.MockFS{
6781 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6782 }),
6783 )
6784 })
6785
6786 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006787 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006788 testApex(t, `
6789 override_apex {
6790 name: "myoverrideapex_sminus",
6791 base: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFooOverride"],
6794 }
6795 override_apex {
6796 name: "myoverrideapex",
6797 base: "myapex",
6798 key: "myapex.key",
6799 apps: ["AppFooOverride"],
6800 }
6801 apex {
6802 name: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFoo"],
6805 apex_available_name: "myapex",
6806 updatable: false,
6807 }
6808 apex {
6809 name: "myapex",
6810 key: "myapex.key",
6811 apps: ["AppFoo"],
6812 updatable: false,
6813 }
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819 android_app {
6820 name: "AppFooOverride",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 apex_available: [ "myapex" ],
6825 }
6826 android_app {
6827 name: "AppFoo",
6828 srcs: ["foo/bar/MyClass.java"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 apex_available: [ "myapex" ],
6832 }`,
6833 android.FixtureMergeMockFs(android.MockFS{
6834 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6835 }),
6836 )
6837 })
6838}
6839
6840func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006841 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006842 context := android.GroupFixturePreparers(
6843 android.PrepareForIntegrationTestWithAndroid,
6844 PrepareForTestWithApexBuildComponents,
6845 java.PrepareForTestWithDexpreopt,
6846 android.FixtureMergeMockFs(android.MockFS{
6847 "system/sepolicy/apex/myapex-file_contexts": nil,
6848 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6849 }),
6850 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6851 variables.BuildId = proptools.StringPtr("buildid")
6852 }),
6853 )
6854 context.RunTestWithBp(t, `
6855 override_apex {
6856 name: "myoverrideapex_sminus",
6857 base: "myapex_sminus",
6858 }
6859 override_apex {
6860 name: "myoverrideapex",
6861 base: "myapex",
6862 }
6863 apex {
6864 name: "myapex",
6865 key: "myapex.key",
6866 apps: ["AppFoo"],
6867 updatable: false,
6868 }
6869 apex {
6870 name: "myapex_sminus",
6871 apex_available_name: "myapex",
6872 key: "myapex.key",
6873 apps: ["AppFoo_sminus"],
6874 updatable: false,
6875 }
6876 apex_key {
6877 name: "myapex.key",
6878 public_key: "testkey.avbpubkey",
6879 private_key: "testkey.pem",
6880 }
6881 android_app {
6882 name: "AppFoo",
6883 srcs: ["foo/bar/MyClass.java"],
6884 sdk_version: "none",
6885 system_modules: "none",
6886 apex_available: [ "myapex" ],
6887 }
6888 android_app {
6889 name: "AppFoo_sminus",
6890 srcs: ["foo/bar/MyClass.java"],
6891 sdk_version: "none",
6892 min_sdk_version: "29",
6893 system_modules: "none",
6894 apex_available: [ "myapex" ],
6895 }`)
6896}
6897
Jiyong Park89e850a2020-04-07 16:37:39 +09006898func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006899 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006900 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006901 apex {
6902 name: "myapex",
6903 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006904 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006905 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006906 }
6907
6908 apex_key {
6909 name: "myapex.key",
6910 public_key: "testkey.avbpubkey",
6911 private_key: "testkey.pem",
6912 }
6913
6914 cc_library {
6915 name: "libfoo",
6916 stl: "none",
6917 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006918 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006919 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006920 }
6921
6922 cc_library {
6923 name: "libfoo2",
6924 stl: "none",
6925 system_shared_libs: [],
6926 shared_libs: ["libbaz"],
6927 apex_available: ["//apex_available:platform"],
6928 }
6929
6930 cc_library {
6931 name: "libbar",
6932 stl: "none",
6933 system_shared_libs: [],
6934 apex_available: ["myapex"],
6935 }
6936
6937 cc_library {
6938 name: "libbaz",
6939 stl: "none",
6940 system_shared_libs: [],
6941 apex_available: ["myapex"],
6942 stubs: {
6943 versions: ["1"],
6944 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006945 }`)
6946
Jiyong Park89e850a2020-04-07 16:37:39 +09006947 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6948 // because it depends on libbar which isn't available to platform
6949 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6950 if libfoo.NotAvailableForPlatform() != true {
6951 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6952 }
6953
6954 // libfoo2 however can be available to platform because it depends on libbaz which provides
6955 // stubs
6956 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6957 if libfoo2.NotAvailableForPlatform() == true {
6958 t.Errorf("%q should be available to platform", libfoo2.String())
6959 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006960}
Jiyong Parka90ca002019-10-07 15:47:24 +09006961
Paul Duffine52e66f2020-03-30 17:54:29 +01006962func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006963 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006964 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006965 apex {
6966 name: "myapex",
6967 key: "myapex.key",
6968 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006969 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006970 }
6971
6972 apex_key {
6973 name: "myapex.key",
6974 public_key: "testkey.avbpubkey",
6975 private_key: "testkey.pem",
6976 }
6977
6978 cc_library {
6979 name: "libfoo",
6980 stl: "none",
6981 system_shared_libs: [],
6982 apex_available: ["myapex"],
6983 static: {
6984 apex_available: ["//apex_available:platform"],
6985 },
6986 }`)
6987
Jiyong Park89e850a2020-04-07 16:37:39 +09006988 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6989 if libfooShared.NotAvailableForPlatform() != true {
6990 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6991 }
6992 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6993 if libfooStatic.NotAvailableForPlatform() != false {
6994 t.Errorf("%q should be available to platform", libfooStatic.String())
6995 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006996}
6997
Jooyung Han9a419e22024-08-16 17:14:21 +09006998func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006999 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007000
7001 for _, tc := range []struct {
7002 name string
7003 apexAvailable string
7004 expectedError string
7005 }{
7006 {
7007 name: "prefix matches correctly",
7008 apexAvailable: "com.foo.*",
7009 },
7010 {
7011 name: "prefix doesn't match",
7012 apexAvailable: "com.bar.*",
7013 expectedError: `Consider .* "com.foo\.\*"`,
7014 },
7015 {
7016 name: "short prefix",
7017 apexAvailable: "com.*",
7018 expectedError: "requires two or more components",
7019 },
7020 {
7021 name: "wildcard not in the end",
7022 apexAvailable: "com.*.foo",
7023 expectedError: "should end with .*",
7024 },
7025 {
7026 name: "wildcard in the middle",
7027 apexAvailable: "com.foo*.*",
7028 expectedError: "not allowed in the middle",
7029 },
7030 {
7031 name: "hint with prefix pattern",
7032 apexAvailable: "//apex_available:platform",
7033 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7034 },
7035 } {
7036 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007037 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007038 errorHandler := android.FixtureExpectsNoErrors
7039 if tc.expectedError != "" {
7040 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7041 }
7042 context := android.GroupFixturePreparers(
7043 prepareForApexTest,
7044 android.FixtureMergeMockFs(android.MockFS{
7045 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7046 }),
7047 ).ExtendWithErrorHandler(errorHandler)
7048
7049 context.RunTestWithBp(t, `
7050 apex {
7051 name: "com.foo.bar",
7052 key: "myapex.key",
7053 native_shared_libs: ["libfoo"],
7054 updatable: false,
7055 }
7056
7057 apex_key {
7058 name: "myapex.key",
7059 public_key: "testkey.avbpubkey",
7060 private_key: "testkey.pem",
7061 }
7062
7063 cc_library {
7064 name: "libfoo",
7065 stl: "none",
7066 system_shared_libs: [],
7067 apex_available: ["`+tc.apexAvailable+`"],
7068 }`)
7069 })
7070 }
7071 testApexError(t, `Consider adding "com.foo" to`, `
7072 apex {
7073 name: "com.foo", // too short for a partner apex
7074 key: "myapex.key",
7075 native_shared_libs: ["libfoo"],
7076 updatable: false,
7077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
7085 cc_library {
7086 name: "libfoo",
7087 stl: "none",
7088 system_shared_libs: [],
7089 }
7090 `)
7091}
7092
Jooyung Han5f7fa502025-01-14 16:52:14 +09007093func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7094 t.Parallel()
7095 ctx := testApex(t, `
7096 apex {
7097 name: "myapex",
7098 key: "myapex.key",
7099 updatable: false,
7100 vendor: true,
7101 }
7102 apex_key {
7103 name: "myapex.key",
7104 public_key: "testkey.avbpubkey",
7105 private_key: "testkey.pem",
7106 }
7107 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7108 // vendor path should not affect "partition tag"
7109 variables.VendorPath = proptools.StringPtr("system/vendor")
7110 }))
7111
7112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7113 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7114 "vendor",
7115 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7116 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7117 "vendor",
7118 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7119}
7120
Jooyung Hanb9518072024-11-22 14:05:20 +09007121func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7122 t.Parallel()
7123 ctx := testApex(t, `
7124 apex_test {
7125 name: "myapex",
7126 key: "myapex.key",
7127 skip_validations: {
7128 host_apex_verifier: true,
7129 },
7130 updatable: false,
7131 }
7132 apex_key {
7133 name: "myapex.key",
7134 public_key: "testkey.avbpubkey",
7135 private_key: "testkey.pem",
7136 }
7137 `)
7138
7139 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7140 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7141 t.Error("should not run host_apex_verifier")
7142 }
7143}
7144
7145func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7146 t.Parallel()
7147 ctx := testApex(t, `
7148 apex_test {
7149 name: "myapex",
7150 key: "myapex.key",
7151 updatable: false,
7152 }
7153 apex_key {
7154 name: "myapex.key",
7155 public_key: "testkey.avbpubkey",
7156 private_key: "testkey.pem",
7157 }
7158 `)
7159
7160 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7161 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7162 t.Error("should run host_apex_verifier")
7163 }
7164}
7165
Jiyong Park5d790c32019-11-15 18:40:32 +09007166func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007167 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007168 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007169 apex {
7170 name: "myapex",
7171 key: "myapex.key",
7172 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007173 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007174 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007175 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007176 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007177 }
7178
7179 override_apex {
7180 name: "override_myapex",
7181 base: "myapex",
7182 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007183 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007184 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007185 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007186 compile_multilib: "first",
7187 multilib: {
7188 lib32: {
7189 native_shared_libs: ["mylib32"],
7190 },
7191 lib64: {
7192 native_shared_libs: ["mylib64"],
7193 },
7194 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007195 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007196 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007197 key: "mynewapex.key",
7198 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007199 }
7200
7201 apex_key {
7202 name: "myapex.key",
7203 public_key: "testkey.avbpubkey",
7204 private_key: "testkey.pem",
7205 }
7206
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007207 apex_key {
7208 name: "mynewapex.key",
7209 public_key: "testkey2.avbpubkey",
7210 private_key: "testkey2.pem",
7211 }
7212
7213 android_app_certificate {
7214 name: "myapex.certificate",
7215 certificate: "testkey",
7216 }
7217
Jiyong Park5d790c32019-11-15 18:40:32 +09007218 android_app {
7219 name: "app",
7220 srcs: ["foo/bar/MyClass.java"],
7221 package_name: "foo",
7222 sdk_version: "none",
7223 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007224 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007225 }
7226
7227 override_android_app {
7228 name: "override_app",
7229 base: "app",
7230 package_name: "bar",
7231 }
markchien7c803b82021-08-26 22:10:06 +08007232
7233 bpf {
7234 name: "bpf",
7235 srcs: ["bpf.c"],
7236 }
7237
7238 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007239 name: "overrideBpf",
7240 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007241 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007242
7243 prebuilt_etc {
7244 name: "myetc",
7245 src: "myprebuilt",
7246 }
7247
7248 prebuilt_etc {
7249 name: "override_myetc",
7250 src: "override_myprebuilt",
7251 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007252
7253 cc_library {
7254 name: "mylib32",
7255 apex_available: [ "myapex" ],
7256 }
7257
7258 cc_library {
7259 name: "mylib64",
7260 apex_available: [ "myapex" ],
7261 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007262 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007263
Jooyung Hana0503a52023-08-23 13:12:50 +09007264 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007265 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007266 if originalVariant.GetOverriddenBy() != "" {
7267 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7268 }
7269 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7270 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7271 }
7272
Spandan Das50801e22024-05-13 18:29:45 +00007273 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007274 apexRule := module.Rule("apexRule")
7275 copyCmds := apexRule.Args["copy_commands"]
7276
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007277 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7278 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007279
markchien7c803b82021-08-26 22:10:06 +08007280 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007281 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007282
Daniel Norman5a3ce132021-08-26 15:44:43 -07007283 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7284 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7285
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007286 apexBundle := module.Module().(*apexBundle)
7287 name := apexBundle.Name()
7288 if name != "override_myapex" {
7289 t.Errorf("name should be \"override_myapex\", but was %q", name)
7290 }
7291
Baligh Uddin004d7172020-02-19 21:29:28 -08007292 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7293 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7294 }
7295
Jiyong Park20bacab2020-03-03 11:45:41 +09007296 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007297 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007298 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7299
7300 signApkRule := module.Rule("signapk")
7301 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007302
Colin Crossaa255532020-07-03 13:18:24 -07007303 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007304 var builder strings.Builder
7305 data.Custom(&builder, name, "TARGET_", "", data)
7306 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007307 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7308 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007309 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007310 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007311 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007312 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007313 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007314 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007315}
7316
Albert Martineefabcf2022-03-21 20:11:16 +00007317func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007318 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007319 // Override from 29 to 31
7320 minSdkOverride31 := "31"
7321 ctx := testApex(t, `
7322 apex {
7323 name: "myapex",
7324 key: "myapex.key",
7325 native_shared_libs: ["mylib"],
7326 updatable: true,
7327 min_sdk_version: "29"
7328 }
7329
7330 override_apex {
7331 name: "override_myapex",
7332 base: "myapex",
7333 logging_parent: "com.foo.bar",
7334 package_name: "test.overridden.package"
7335 }
7336
7337 apex_key {
7338 name: "myapex.key",
7339 public_key: "testkey.avbpubkey",
7340 private_key: "testkey.pem",
7341 }
7342
7343 cc_library {
7344 name: "mylib",
7345 srcs: ["mylib.cpp"],
7346 runtime_libs: ["libbar"],
7347 system_shared_libs: [],
7348 stl: "none",
7349 apex_available: [ "myapex" ],
7350 min_sdk_version: "apex_inherit"
7351 }
7352
7353 cc_library {
7354 name: "libbar",
7355 srcs: ["mylib.cpp"],
7356 system_shared_libs: [],
7357 stl: "none",
7358 apex_available: [ "myapex" ],
7359 min_sdk_version: "apex_inherit"
7360 }
7361
7362 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7363
Jooyung Hana0503a52023-08-23 13:12:50 +09007364 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007365 copyCmds := apexRule.Args["copy_commands"]
7366
7367 // Ensure that direct non-stubs dep is always included
7368 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7369
7370 // Ensure that runtime_libs dep in included
7371 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7372
7373 // Ensure libraries target overridden min_sdk_version value
7374 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7375}
7376
7377func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007378 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007379 // Attempt to override from 31 to 29, should be a NOOP
7380 minSdkOverride29 := "29"
7381 ctx := testApex(t, `
7382 apex {
7383 name: "myapex",
7384 key: "myapex.key",
7385 native_shared_libs: ["mylib"],
7386 updatable: true,
7387 min_sdk_version: "31"
7388 }
7389
7390 override_apex {
7391 name: "override_myapex",
7392 base: "myapex",
7393 logging_parent: "com.foo.bar",
7394 package_name: "test.overridden.package"
7395 }
7396
7397 apex_key {
7398 name: "myapex.key",
7399 public_key: "testkey.avbpubkey",
7400 private_key: "testkey.pem",
7401 }
7402
7403 cc_library {
7404 name: "mylib",
7405 srcs: ["mylib.cpp"],
7406 runtime_libs: ["libbar"],
7407 system_shared_libs: [],
7408 stl: "none",
7409 apex_available: [ "myapex" ],
7410 min_sdk_version: "apex_inherit"
7411 }
7412
7413 cc_library {
7414 name: "libbar",
7415 srcs: ["mylib.cpp"],
7416 system_shared_libs: [],
7417 stl: "none",
7418 apex_available: [ "myapex" ],
7419 min_sdk_version: "apex_inherit"
7420 }
7421
7422 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7423
Jooyung Hana0503a52023-08-23 13:12:50 +09007424 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007425 copyCmds := apexRule.Args["copy_commands"]
7426
7427 // Ensure that direct non-stubs dep is always included
7428 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7429
7430 // Ensure that runtime_libs dep in included
7431 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7432
7433 // Ensure libraries target the original min_sdk_version value rather than the overridden
7434 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7435}
7436
Jooyung Han214bf372019-11-12 13:03:50 +09007437func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007438 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007439 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007440 apex {
7441 name: "myapex",
7442 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007443 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007444 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007445 }
7446
7447 apex_key {
7448 name: "myapex.key",
7449 public_key: "testkey.avbpubkey",
7450 private_key: "testkey.pem",
7451 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007452
7453 cc_library {
7454 name: "mylib",
7455 srcs: ["mylib.cpp"],
7456 stl: "libc++",
7457 system_shared_libs: [],
7458 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007459 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007460 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007461 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007462
Jooyung Hana0503a52023-08-23 13:12:50 +09007463 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007464 args := module.Rule("apexRule").Args
7465 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007466
7467 // The copies of the libraries in the apex should have one more dependency than
7468 // the ones outside the apex, namely the unwinder. Ideally we should check
7469 // the dependency names directly here but for some reason the names are blank in
7470 // this test.
7471 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007472 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007473 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7474 if len(apexImplicits) != len(nonApexImplicits)+1 {
7475 t.Errorf("%q missing unwinder dep", lib)
7476 }
7477 }
Jooyung Han214bf372019-11-12 13:03:50 +09007478}
7479
Paul Duffine05480a2021-03-08 15:07:14 +00007480var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007481 "api/current.txt": nil,
7482 "api/removed.txt": nil,
7483 "api/system-current.txt": nil,
7484 "api/system-removed.txt": nil,
7485 "api/test-current.txt": nil,
7486 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007487
Anton Hanssondff2c782020-12-21 17:10:01 +00007488 "100/public/api/foo.txt": nil,
7489 "100/public/api/foo-removed.txt": nil,
7490 "100/system/api/foo.txt": nil,
7491 "100/system/api/foo-removed.txt": nil,
7492
Paul Duffineedc5d52020-06-12 17:46:39 +01007493 // For java_sdk_library_import
7494 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007495}
7496
Jooyung Han58f26ab2019-12-18 15:34:32 +09007497func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007498 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007499 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007500 apex {
7501 name: "myapex",
7502 key: "myapex.key",
7503 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007504 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007505 }
7506
7507 apex_key {
7508 name: "myapex.key",
7509 public_key: "testkey.avbpubkey",
7510 private_key: "testkey.pem",
7511 }
7512
7513 java_sdk_library {
7514 name: "foo",
7515 srcs: ["a.java"],
7516 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007517 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007518 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007519
7520 prebuilt_apis {
7521 name: "sdk",
7522 api_dirs: ["100"],
7523 }
Paul Duffin9b879592020-05-26 13:21:35 +01007524 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007525
7526 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007527 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007528 "javalib/foo.jar",
7529 "etc/permissions/foo.xml",
7530 })
7531 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007532 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7533 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7534 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007535}
7536
Spandan Das3ee19692024-06-19 04:47:40 +00007537func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007538 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007539 ctx := testApex(t, `
7540 override_apex {
7541 name: "mycompanyapex",
7542 base: "myapex",
7543 }
7544 apex {
7545 name: "myapex",
7546 key: "myapex.key",
7547 java_libs: ["foo"],
7548 updatable: false,
7549 }
7550
7551 apex_key {
7552 name: "myapex.key",
7553 public_key: "testkey.avbpubkey",
7554 private_key: "testkey.pem",
7555 }
7556
7557 java_sdk_library {
7558 name: "foo",
7559 srcs: ["a.java"],
7560 api_packages: ["foo"],
7561 apex_available: [ "myapex" ],
7562 }
7563
7564 prebuilt_apis {
7565 name: "sdk",
7566 api_dirs: ["100"],
7567 }
7568 `, withFiles(filesForSdkLibrary))
7569
7570 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7571 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7572 // (com.android.foo), the filepath should not contain override apex name.
7573 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7574 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7575 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7576}
7577
Paul Duffin9b879592020-05-26 13:21:35 +01007578func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007579 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007580 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007581 apex {
7582 name: "myapex",
7583 key: "myapex.key",
7584 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007585 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007586 }
7587
7588 apex_key {
7589 name: "myapex.key",
7590 public_key: "testkey.avbpubkey",
7591 private_key: "testkey.pem",
7592 }
7593
7594 java_sdk_library {
7595 name: "foo",
7596 srcs: ["a.java"],
7597 api_packages: ["foo"],
7598 apex_available: ["myapex"],
7599 sdk_version: "none",
7600 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007601 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007602 }
7603
7604 java_library {
7605 name: "bar",
7606 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007607 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007608 apex_available: ["myapex"],
7609 sdk_version: "none",
7610 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007611 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007612 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007613
7614 prebuilt_apis {
7615 name: "sdk",
7616 api_dirs: ["100"],
7617 }
Paul Duffin9b879592020-05-26 13:21:35 +01007618 `, withFiles(filesForSdkLibrary))
7619
7620 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007621 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007622 "javalib/bar.jar",
7623 "javalib/foo.jar",
7624 "etc/permissions/foo.xml",
7625 })
7626
7627 // The bar library should depend on the implementation jar.
7628 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007629 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007630 t.Errorf("expected %q, found %#q", expected, actual)
7631 }
7632}
7633
7634func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007635 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007636 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007637 apex {
7638 name: "myapex",
7639 key: "myapex.key",
7640 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007641 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007642 }
7643
7644 apex_key {
7645 name: "myapex.key",
7646 public_key: "testkey.avbpubkey",
7647 private_key: "testkey.pem",
7648 }
7649
7650 java_sdk_library {
7651 name: "foo",
7652 srcs: ["a.java"],
7653 api_packages: ["foo"],
7654 apex_available: ["myapex"],
7655 sdk_version: "none",
7656 system_modules: "none",
7657 }
7658
7659 java_library {
7660 name: "bar",
7661 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007662 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007663 sdk_version: "none",
7664 system_modules: "none",
7665 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007666
7667 prebuilt_apis {
7668 name: "sdk",
7669 api_dirs: ["100"],
7670 }
Paul Duffin9b879592020-05-26 13:21:35 +01007671 `, withFiles(filesForSdkLibrary))
7672
7673 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007674 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007675 "javalib/foo.jar",
7676 "etc/permissions/foo.xml",
7677 })
7678
7679 // The bar library should depend on the stubs jar.
7680 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007681 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007682 t.Errorf("expected %q, found %#q", expected, actual)
7683 }
7684}
7685
Paul Duffineedc5d52020-06-12 17:46:39 +01007686func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007687 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007689 prebuilt_apis {
7690 name: "sdk",
7691 api_dirs: ["100"],
7692 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007693 withFiles(map[string][]byte{
7694 "apex/a.java": nil,
7695 "apex/apex_manifest.json": nil,
7696 "apex/Android.bp": []byte(`
7697 package {
7698 default_visibility: ["//visibility:private"],
7699 }
7700
7701 apex {
7702 name: "myapex",
7703 key: "myapex.key",
7704 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007705 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007706 }
7707
7708 apex_key {
7709 name: "myapex.key",
7710 public_key: "testkey.avbpubkey",
7711 private_key: "testkey.pem",
7712 }
7713
7714 java_library {
7715 name: "bar",
7716 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007717 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007718 apex_available: ["myapex"],
7719 sdk_version: "none",
7720 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007721 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007722 }
7723`),
7724 "source/a.java": nil,
7725 "source/api/current.txt": nil,
7726 "source/api/removed.txt": nil,
7727 "source/Android.bp": []byte(`
7728 package {
7729 default_visibility: ["//visibility:private"],
7730 }
7731
7732 java_sdk_library {
7733 name: "foo",
7734 visibility: ["//apex"],
7735 srcs: ["a.java"],
7736 api_packages: ["foo"],
7737 apex_available: ["myapex"],
7738 sdk_version: "none",
7739 system_modules: "none",
7740 public: {
7741 enabled: true,
7742 },
Colin Crosse4f34882024-11-14 12:26:00 -08007743 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007744 }
7745`),
7746 "prebuilt/a.jar": nil,
7747 "prebuilt/Android.bp": []byte(`
7748 package {
7749 default_visibility: ["//visibility:private"],
7750 }
7751
7752 java_sdk_library_import {
7753 name: "foo",
7754 visibility: ["//apex", "//source"],
7755 apex_available: ["myapex"],
7756 prefer: true,
7757 public: {
7758 jars: ["a.jar"],
7759 },
Colin Crosse4f34882024-11-14 12:26:00 -08007760 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007761 }
7762`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007763 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007764 )
7765
7766 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007767 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007768 "javalib/bar.jar",
7769 "javalib/foo.jar",
7770 "etc/permissions/foo.xml",
7771 })
7772
7773 // The bar library should depend on the implementation jar.
7774 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007775 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007776 t.Errorf("expected %q, found %#q", expected, actual)
7777 }
7778}
7779
7780func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007781 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007782 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
7786 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 java_sdk_library_import {
7797 name: "foo",
7798 apex_available: ["myapex"],
7799 prefer: true,
7800 public: {
7801 jars: ["a.jar"],
7802 },
7803 }
7804
7805 `, withFiles(filesForSdkLibrary))
7806}
7807
atrost6e126252020-01-27 17:01:16 +00007808func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007809 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007810 result := android.GroupFixturePreparers(
7811 prepareForApexTest,
7812 java.PrepareForTestWithPlatformCompatConfig,
7813 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007814 apex {
7815 name: "myapex",
7816 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007817 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007818 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007819 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007820 }
7821
7822 apex_key {
7823 name: "myapex.key",
7824 public_key: "testkey.avbpubkey",
7825 private_key: "testkey.pem",
7826 }
7827
7828 platform_compat_config {
7829 name: "myjar-platform-compat-config",
7830 src: ":myjar",
7831 }
7832
7833 java_library {
7834 name: "myjar",
7835 srcs: ["foo/bar/MyClass.java"],
7836 sdk_version: "none",
7837 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007838 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007839 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007840 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007841
7842 // Make sure that a preferred prebuilt does not affect the apex contents.
7843 prebuilt_platform_compat_config {
7844 name: "myjar-platform-compat-config",
7845 metadata: "compat-config/metadata.xml",
7846 prefer: true,
7847 }
atrost6e126252020-01-27 17:01:16 +00007848 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007849 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007850 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007851 "etc/compatconfig/myjar-platform-compat-config.xml",
7852 "javalib/myjar.jar",
7853 })
7854}
7855
Jooyung Han862c0d62022-12-21 10:15:37 +09007856func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007857 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007858 android.GroupFixturePreparers(
7859 android.PrepareForTestWithAndroidBuildComponents,
7860 PrepareForTestWithApexBuildComponents,
7861 prepareForTestWithMyapex,
7862 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7863 ).
7864 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7865 RunTestWithBp(t, `
7866 apex {
7867 name: "myapex",
7868 key: "myapex.key",
7869 prebuilts: ["foo", "bar"],
7870 updatable: false,
7871 }
7872
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }
7878
7879 prebuilt_etc {
7880 name: "foo",
7881 src: "myprebuilt",
7882 filename_from_src: true,
7883 }
7884
7885 prebuilt_etc {
7886 name: "bar",
7887 src: "myprebuilt",
7888 filename_from_src: true,
7889 }
7890 `)
7891}
7892
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007893func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007894 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007895 bp := `
7896 apex {
7897 name: "myapex",
7898 key: "myapex.key",
7899 native_shared_libs: ["libfoo"],
7900 updatable: false,
7901 unwanted_transitive_deps: ["libbar"],
7902 }
7903
7904 apex_key {
7905 name: "myapex.key",
7906 public_key: "testkey.avbpubkey",
7907 private_key: "testkey.pem",
7908 }
7909
7910 cc_library {
7911 name: "libfoo",
7912 srcs: ["foo.cpp"],
7913 shared_libs: ["libbar"],
7914 apex_available: ["myapex"],
7915 }
7916
7917 cc_library {
7918 name: "libbar",
7919 srcs: ["bar.cpp"],
7920 apex_available: ["myapex"],
7921 }`
7922 ctx := testApex(t, bp)
7923 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7924 "*/libc++.so",
7925 "*/libfoo.so",
7926 // not libbar.so
7927 })
7928}
7929
Jiyong Park479321d2019-12-16 11:47:12 +09007930func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007931 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007932 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7933 apex {
7934 name: "myapex",
7935 key: "myapex.key",
7936 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007937 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007938 }
7939
7940 apex_key {
7941 name: "myapex.key",
7942 public_key: "testkey.avbpubkey",
7943 private_key: "testkey.pem",
7944 }
7945
7946 java_library {
7947 name: "myjar",
7948 srcs: ["foo/bar/MyClass.java"],
7949 sdk_version: "none",
7950 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007951 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007952 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007953 }
7954 `)
7955}
7956
Jiyong Park7cd10e32020-01-14 09:22:18 +09007957func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007958 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 bp := `
7960 apex {
7961 name: "myapex",
7962 key: "myapex.key",
7963 native_shared_libs: ["mylib"],
7964 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007965 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007966 }
7967
Jiyong Park9d677202020-02-19 16:29:35 +09007968 apex {
7969 name: "myapex.updatable",
7970 key: "myapex.key",
7971 native_shared_libs: ["mylib"],
7972 java_libs: ["myjar"],
7973 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007974 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007975 }
7976
Jiyong Park7cd10e32020-01-14 09:22:18 +09007977 apex_key {
7978 name: "myapex.key",
7979 public_key: "testkey.avbpubkey",
7980 private_key: "testkey.pem",
7981 }
7982
7983 cc_library {
7984 name: "mylib",
7985 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007986 shared_libs: [
7987 "myotherlib",
7988 "myotherlib_ext",
7989 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007990 system_shared_libs: [],
7991 stl: "none",
7992 apex_available: [
7993 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007994 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 "//apex_available:platform",
7996 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007997 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007998 }
7999
8000 cc_library {
8001 name: "myotherlib",
8002 srcs: ["mylib.cpp"],
8003 system_shared_libs: [],
8004 stl: "none",
8005 apex_available: [
8006 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008007 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008008 "//apex_available:platform",
8009 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008010 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008011 }
8012
Jiyong Parkce243632023-02-17 18:22:25 +09008013 cc_library {
8014 name: "myotherlib_ext",
8015 srcs: ["mylib.cpp"],
8016 system_shared_libs: [],
8017 system_ext_specific: true,
8018 stl: "none",
8019 apex_available: [
8020 "myapex",
8021 "myapex.updatable",
8022 "//apex_available:platform",
8023 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008024 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008025 }
8026
Jiyong Park7cd10e32020-01-14 09:22:18 +09008027 java_library {
8028 name: "myjar",
8029 srcs: ["foo/bar/MyClass.java"],
8030 sdk_version: "none",
8031 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008032 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008033 apex_available: [
8034 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008035 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008036 "//apex_available:platform",
8037 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008038 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008039 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008040 }
8041
8042 java_library {
8043 name: "myotherjar",
8044 srcs: ["foo/bar/MyClass.java"],
8045 sdk_version: "none",
8046 system_modules: "none",
8047 apex_available: [
8048 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008049 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008050 "//apex_available:platform",
8051 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008052 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008053 }
8054 `
8055
8056 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8057 for _, f := range files {
8058 if f.path == file {
8059 if f.isLink {
8060 t.Errorf("%q is not a real file", file)
8061 }
8062 return
8063 }
8064 }
8065 t.Errorf("%q is not found", file)
8066 }
8067
Jiyong Parkce243632023-02-17 18:22:25 +09008068 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008069 for _, f := range files {
8070 if f.path == file {
8071 if !f.isLink {
8072 t.Errorf("%q is not a symlink", file)
8073 }
Jiyong Parkce243632023-02-17 18:22:25 +09008074 if f.src != target {
8075 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8076 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008077 return
8078 }
8079 }
8080 t.Errorf("%q is not found", file)
8081 }
8082
Jiyong Park9d677202020-02-19 16:29:35 +09008083 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8084 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008085 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008086 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008087 ensureRealfileExists(t, files, "javalib/myjar.jar")
8088 ensureRealfileExists(t, files, "lib64/mylib.so")
8089 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008090 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008091
Jooyung Hana0503a52023-08-23 13:12:50 +09008092 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008093 ensureRealfileExists(t, files, "javalib/myjar.jar")
8094 ensureRealfileExists(t, files, "lib64/mylib.so")
8095 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008096 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008097
8098 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008099 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008100 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008101 ensureRealfileExists(t, files, "javalib/myjar.jar")
8102 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008103 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8104 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008105
Jooyung Hana0503a52023-08-23 13:12:50 +09008106 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008107 ensureRealfileExists(t, files, "javalib/myjar.jar")
8108 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008109 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8110 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008111}
8112
Yo Chiange8128052020-07-23 20:09:18 +08008113func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008114 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008115 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008116 apex {
8117 name: "myapex",
8118 key: "myapex.key",
8119 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008120 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008121 }
8122
8123 apex_key {
8124 name: "myapex.key",
8125 public_key: "testkey.avbpubkey",
8126 private_key: "testkey.pem",
8127 }
8128
8129 cc_library_shared {
8130 name: "mylib",
8131 srcs: ["mylib.cpp"],
8132 shared_libs: ["myotherlib"],
8133 system_shared_libs: [],
8134 stl: "none",
8135 apex_available: [
8136 "myapex",
8137 "//apex_available:platform",
8138 ],
8139 }
8140
8141 cc_prebuilt_library_shared {
8142 name: "myotherlib",
8143 srcs: ["prebuilt.so"],
8144 system_shared_libs: [],
8145 stl: "none",
8146 apex_available: [
8147 "myapex",
8148 "//apex_available:platform",
8149 ],
8150 }
8151 `)
8152
Jooyung Hana0503a52023-08-23 13:12:50 +09008153 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008154 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008155 var builder strings.Builder
8156 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8157 androidMk := builder.String()
8158 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008159 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008160 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8161 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8162 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008163 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008164}
8165
Jooyung Han643adc42020-02-27 13:50:06 +09008166func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008167 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008168 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008169 apex {
8170 name: "myapex",
8171 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008172 binaries: ["mybin"],
8173 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008174 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008175 }
8176
8177 apex_key {
8178 name: "myapex.key",
8179 public_key: "testkey.avbpubkey",
8180 private_key: "testkey.pem",
8181 }
8182
8183 cc_library {
8184 name: "mylib",
8185 srcs: ["mylib.cpp"],
8186 shared_libs: ["mylib2"],
8187 system_shared_libs: [],
8188 stl: "none",
8189 apex_available: [ "myapex" ],
8190 }
8191
8192 cc_library {
8193 name: "mylib2",
8194 srcs: ["mylib.cpp"],
8195 system_shared_libs: [],
8196 stl: "none",
8197 apex_available: [ "myapex" ],
8198 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008199
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008200 // Used as both a JNI library and a regular shared library.
8201 cc_library {
8202 name: "mylib3",
8203 srcs: ["mylib.cpp"],
8204 system_shared_libs: [],
8205 stl: "none",
8206 apex_available: [ "myapex" ],
8207 }
8208
8209 cc_binary {
8210 name: "mybin",
8211 srcs: ["mybin.cpp"],
8212 shared_libs: ["mylib3"],
8213 system_shared_libs: [],
8214 stl: "none",
8215 apex_available: [ "myapex" ],
8216 }
8217
Jiyong Park34d5c332022-02-24 18:02:44 +09008218 rust_ffi_shared {
8219 name: "libfoo.rust",
8220 crate_name: "foo",
8221 srcs: ["foo.rs"],
8222 shared_libs: ["libfoo.shared_from_rust"],
8223 prefer_rlib: true,
8224 apex_available: ["myapex"],
8225 }
8226
8227 cc_library_shared {
8228 name: "libfoo.shared_from_rust",
8229 srcs: ["mylib.cpp"],
8230 system_shared_libs: [],
8231 stl: "none",
8232 stubs: {
8233 versions: ["10", "11", "12"],
8234 },
8235 }
8236
Jooyung Han643adc42020-02-27 13:50:06 +09008237 `)
8238
Jooyung Hana0503a52023-08-23 13:12:50 +09008239 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008240 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008241 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008242 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008243 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008244 "lib64/mylib.so",
8245 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008246 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008247 "lib64/libfoo.rust.so",
8248 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8249 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008250 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008251
8252 // b/220397949
8253 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008254}
8255
Jooyung Han49f67012020-04-17 13:43:10 +09008256func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008257 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008258 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008259 apex {
8260 name: "myapex",
8261 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008262 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008263 }
8264 apex_key {
8265 name: "myapex.key",
8266 public_key: "testkey.avbpubkey",
8267 private_key: "testkey.pem",
8268 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008269 `,
8270 android.FixtureModifyConfig(func(config android.Config) {
8271 delete(config.Targets, android.Android)
8272 config.AndroidCommonTarget = android.Target{}
8273 }),
8274 )
Jooyung Han49f67012020-04-17 13:43:10 +09008275
8276 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8277 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8278 }
8279}
8280
Jiyong Parkbd159612020-02-28 15:22:21 +09008281func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008282 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008283 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008284 apex {
8285 name: "myapex",
8286 key: "myapex.key",
8287 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008288 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008289 }
8290
8291 apex_key {
8292 name: "myapex.key",
8293 public_key: "testkey.avbpubkey",
8294 private_key: "testkey.pem",
8295 }
8296
8297 android_app {
8298 name: "AppFoo",
8299 srcs: ["foo/bar/MyClass.java"],
8300 sdk_version: "none",
8301 system_modules: "none",
8302 apex_available: [ "myapex" ],
8303 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008304 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008305
Jooyung Hana0503a52023-08-23 13:12:50 +09008306 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008307 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008308
8309 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008310 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 +09008311}
8312
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008313func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008314 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008315 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008316 apex {
8317 name: "myapex",
8318 key: "myapex.key",
8319 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008320 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008321 }
8322
8323 apex_key {
8324 name: "myapex.key",
8325 public_key: "testkey.avbpubkey",
8326 private_key: "testkey.pem",
8327 }
8328
8329 android_app_set {
8330 name: "AppSet",
8331 set: "AppSet.apks",
8332 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008333 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008334 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008335 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008336 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8337 s := mod.Rule("apexRule").Args["copy_commands"]
8338 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008339 if len(copyCmds) != 4 {
8340 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008341 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008342 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8343 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008344 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8345 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008346
8347 // Ensure that canned_fs_config has an entry for the app set zip file
8348 generateFsRule := mod.Rule("generateFsConfig")
8349 cmd := generateFsRule.RuleParams.Command
8350 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008351}
8352
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008353func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008354 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008355 apex_set {
8356 name: "myapex",
8357 filename: "foo_v2.apex",
8358 sanitized: {
8359 none: { set: "myapex.apks", },
8360 hwaddress: { set: "myapex.hwasan.apks", },
8361 },
Paul Duffin24704672021-04-06 16:09:30 +01008362 }
8363 `
8364 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008365
Paul Duffin24704672021-04-06 16:09:30 +01008366 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008367 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008368
Spandan Das9d6e2092024-09-21 02:50:00 +00008369 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008370 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008371
Paul Duffin24704672021-04-06 16:09:30 +01008372 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8373
8374 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008375 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8376 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008377
8378 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008379}
8380
Pranav Guptaeba03b02022-09-27 00:27:08 +00008381func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008382 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008383 ctx := testApex(t, `
8384 apex_set {
8385 name: "myapex",
8386 set: ":myapex_apks_file",
8387 }
8388
8389 filegroup {
8390 name: "myapex_apks_file",
8391 srcs: ["myapex.apks"],
8392 }
8393 `)
8394
Spandan Das9d6e2092024-09-21 02:50:00 +00008395 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008396
8397 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008398 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008399 extractedApex := m.Output(extractorOutput)
8400
8401 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8402}
8403
Paul Duffin89f570a2021-06-16 01:42:33 +01008404func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008405 t.Helper()
8406
Paul Duffin55607122021-03-30 23:32:51 +01008407 fs := android.MockFS{
8408 "a.java": nil,
8409 "a.jar": nil,
8410 "apex_manifest.json": nil,
8411 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008412 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008413 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8414 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8415 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008416 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008417 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008418
Paul Duffin55607122021-03-30 23:32:51 +01008419 errorHandler := android.FixtureExpectsNoErrors
8420 if errmsg != "" {
8421 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008422 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008423
Paul Duffin55607122021-03-30 23:32:51 +01008424 result := android.GroupFixturePreparers(
8425 cc.PrepareForTestWithCcDefaultModules,
8426 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008427 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008428 java.PrepareForTestWithJavaSdkLibraryFiles,
8429 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008430 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008431 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008432 android.FixtureModifyMockFS(func(fs android.MockFS) {
8433 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8434 insert := ""
8435 for _, fragment := range fragments {
8436 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8437 }
8438 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8439 platform_bootclasspath {
8440 name: "platform-bootclasspath",
8441 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008442 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008443 %s
8444 ],
8445 }
8446 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008447 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008448 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008449 // Dexpreopt for boot jars requires the ART boot image profile.
8450 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8451 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008452 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008453 ).
8454 ExtendWithErrorHandler(errorHandler).
8455 RunTestWithBp(t, bp)
8456
8457 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008458}
8459
Jooyung Han548640b2020-04-27 12:10:30 +09008460func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008461 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008462 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8463 apex {
8464 name: "myapex",
8465 key: "myapex.key",
8466 updatable: true,
8467 }
8468
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }
8474 `)
8475}
8476
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008477func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008478 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008479 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8480 apex {
8481 name: "myapex",
8482 key: "myapex.key",
8483 }
8484
8485 apex_key {
8486 name: "myapex.key",
8487 public_key: "testkey.avbpubkey",
8488 private_key: "testkey.pem",
8489 }
8490 `)
8491}
8492
satayevb98371c2021-06-15 16:49:50 +01008493func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008494 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008495 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8496 apex {
8497 name: "myapex",
8498 key: "myapex.key",
8499 systemserverclasspath_fragments: [
8500 "mysystemserverclasspathfragment",
8501 ],
8502 min_sdk_version: "29",
8503 updatable: true,
8504 }
8505
8506 apex_key {
8507 name: "myapex.key",
8508 public_key: "testkey.avbpubkey",
8509 private_key: "testkey.pem",
8510 }
8511
8512 java_library {
8513 name: "foo",
8514 srcs: ["b.java"],
8515 min_sdk_version: "29",
8516 installable: true,
8517 apex_available: [
8518 "myapex",
8519 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008520 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008521 }
8522
8523 systemserverclasspath_fragment {
8524 name: "mysystemserverclasspathfragment",
8525 generate_classpaths_proto: false,
8526 contents: [
8527 "foo",
8528 ],
8529 apex_available: [
8530 "myapex",
8531 ],
8532 }
satayevabcd5972021-08-06 17:49:46 +01008533 `,
8534 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8535 )
satayevb98371c2021-06-15 16:49:50 +01008536}
8537
Paul Duffin064b70c2020-11-02 17:32:38 +00008538func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008539 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008540 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008541 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008542 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008543 fragment := java.ApexVariantReference{
8544 Apex: proptools.StringPtr("myapex"),
8545 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8546 }
8547
Paul Duffin064b70c2020-11-02 17:32:38 +00008548 testDexpreoptWithApexes(t, `
8549 prebuilt_apex {
8550 name: "myapex" ,
8551 arch: {
8552 arm64: {
8553 src: "myapex-arm64.apex",
8554 },
8555 arm: {
8556 src: "myapex-arm.apex",
8557 },
8558 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008559 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8560 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008561
Paul Duffin89f570a2021-06-16 01:42:33 +01008562 prebuilt_bootclasspath_fragment {
8563 name: "my-bootclasspath-fragment",
8564 contents: ["libfoo"],
8565 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008566 hidden_api: {
8567 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8568 metadata: "my-bootclasspath-fragment/metadata.csv",
8569 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008570 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8571 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8572 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008573 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008574 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008575
Spandan Das52c01a12024-09-20 01:09:48 +00008576 java_sdk_library_import {
8577 name: "libfoo",
8578 prefer: true,
8579 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008580 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008581 },
8582 apex_available: ["myapex"],
8583 shared_library: false,
8584 permitted_packages: ["libfoo"],
8585 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008586 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008587 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008588}
8589
Spandan Dasf14e2542021-11-12 00:01:37 +00008590func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008591 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008592 bp += `
8593 apex_key {
8594 name: "myapex.key",
8595 public_key: "testkey.avbpubkey",
8596 private_key: "testkey.pem",
8597 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008598 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008599 "lib1/src/A.java": nil,
8600 "lib2/src/B.java": nil,
8601 "system/sepolicy/apex/myapex-file_contexts": nil,
8602 }
8603
Paul Duffin45338f02021-03-30 23:07:52 +01008604 errorHandler := android.FixtureExpectsNoErrors
8605 if errmsg != "" {
8606 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008607 }
Colin Crossae8600b2020-10-29 17:09:13 -07008608
Paul Duffin45338f02021-03-30 23:07:52 +01008609 android.GroupFixturePreparers(
8610 android.PrepareForTestWithAndroidBuildComponents,
8611 java.PrepareForTestWithJavaBuildComponents,
8612 PrepareForTestWithApexBuildComponents,
8613 android.PrepareForTestWithNeverallowRules(rules),
8614 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008615 apexBootJars := make([]string, 0, len(bootJars))
8616 for _, apexBootJar := range bootJars {
8617 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008618 }
satayevd604b212021-07-21 14:23:52 +01008619 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008620 }),
8621 fs.AddToFixture(),
8622 ).
8623 ExtendWithErrorHandler(errorHandler).
8624 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008625}
8626
8627func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008628 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008629 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008630 name string
8631 expectedError string
8632 bp string
8633 bootJars []string
8634 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008635 }{
8636
8637 {
8638 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8639 expectedError: "",
8640 bp: `
8641 java_library {
8642 name: "bcp_lib1",
8643 srcs: ["lib1/src/*.java"],
8644 permitted_packages: ["foo.bar"],
8645 apex_available: ["myapex"],
8646 sdk_version: "none",
8647 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008648 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008649 }
8650 java_library {
8651 name: "nonbcp_lib2",
8652 srcs: ["lib2/src/*.java"],
8653 apex_available: ["myapex"],
8654 permitted_packages: ["a.b"],
8655 sdk_version: "none",
8656 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008657 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008658 }
8659 apex {
8660 name: "myapex",
8661 key: "myapex.key",
8662 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008663 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008664 }`,
8665 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008666 bcpPermittedPackages: map[string][]string{
8667 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 "foo.bar",
8669 },
8670 },
8671 },
8672 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008673 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008674 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 +01008675 bp: `
8676 java_library {
8677 name: "bcp_lib1",
8678 srcs: ["lib1/src/*.java"],
8679 apex_available: ["myapex"],
8680 permitted_packages: ["foo.bar"],
8681 sdk_version: "none",
8682 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008683 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008684 }
8685 java_library {
8686 name: "bcp_lib2",
8687 srcs: ["lib2/src/*.java"],
8688 apex_available: ["myapex"],
8689 permitted_packages: ["foo.bar", "bar.baz"],
8690 sdk_version: "none",
8691 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008692 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008693 }
8694 apex {
8695 name: "myapex",
8696 key: "myapex.key",
8697 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008698 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008699 }
8700 `,
8701 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008702 bcpPermittedPackages: map[string][]string{
8703 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008704 "foo.bar",
8705 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008706 "bcp_lib2": []string{
8707 "foo.bar",
8708 },
8709 },
8710 },
8711 {
8712 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8713 expectedError: "",
8714 bp: `
8715 java_library {
8716 name: "bcp_lib_restricted",
8717 srcs: ["lib1/src/*.java"],
8718 apex_available: ["myapex"],
8719 permitted_packages: ["foo.bar"],
8720 sdk_version: "none",
8721 min_sdk_version: "29",
8722 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008723 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008724 }
8725 java_library {
8726 name: "bcp_lib_unrestricted",
8727 srcs: ["lib2/src/*.java"],
8728 apex_available: ["myapex"],
8729 permitted_packages: ["foo.bar", "bar.baz"],
8730 sdk_version: "none",
8731 min_sdk_version: "29",
8732 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008733 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008734 }
8735 apex {
8736 name: "myapex",
8737 key: "myapex.key",
8738 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8739 updatable: true,
8740 min_sdk_version: "29",
8741 }
8742 `,
8743 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8744 bcpPermittedPackages: map[string][]string{
8745 "bcp_lib1_non_updateable": []string{
8746 "foo.bar",
8747 },
8748 // 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 +01008749 },
8750 },
8751 }
8752 for _, tc := range testcases {
8753 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008754 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008755 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8756 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008757 })
8758 }
8759}
8760
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008761// TODO(jungjw): Move this to proptools
8762func intPtr(i int) *int {
8763 return &i
8764}
8765
8766func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008767 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008768 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008769 apex_set {
8770 name: "myapex",
8771 set: "myapex.apks",
8772 filename: "foo_v2.apex",
8773 overrides: ["foo"],
8774 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008775 `,
8776 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8777 variables.Platform_sdk_version = intPtr(30)
8778 }),
8779 android.FixtureModifyConfig(func(config android.Config) {
8780 config.Targets[android.Android] = []android.Target{
8781 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8782 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8783 }
8784 }),
8785 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008786
Spandan Das9d6e2092024-09-21 02:50:00 +00008787 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008788
8789 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008790 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008791 actual := extractedApex.Args["abis"]
8792 expected := "ARMEABI_V7A,ARM64_V8A"
8793 if actual != expected {
8794 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8795 }
8796 actual = extractedApex.Args["sdk-version"]
8797 expected = "30"
8798 if actual != expected {
8799 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8800 }
8801
Paul Duffin6717d882021-06-15 19:09:41 +01008802 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008803 a := m.Module().(*ApexSet)
8804 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008805 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008806 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8807 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8808 }
8809}
8810
Anton Hansson805e0a52022-11-25 14:06:46 +00008811func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008812 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008813 ctx := testApex(t, `
8814 apex_set {
8815 name: "myapex",
8816 set: "myapex.apks",
8817 filename: "foo_v2.apex",
8818 overrides: ["foo"],
8819 }
8820 `,
8821 android.FixtureModifyConfig(func(config android.Config) {
8822 config.Targets[android.Android] = []android.Target{
8823 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8824 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8825 }
8826 }),
8827 )
8828
Spandan Das9d6e2092024-09-21 02:50:00 +00008829 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008830
8831 // Check extract_apks tool parameters. No native bridge arch expected
8832 extractedApex := m.Output("extracted/myapex.apks")
8833 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8834}
8835
Jiyong Park7d95a512020-05-10 15:16:24 +09008836func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008837 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008838 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8839 apex {
8840 name: "myapex",
8841 key: "myapex.key",
8842 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008843 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008844 }
8845
8846 apex_key {
8847 name: "myapex.key",
8848 public_key: "testkey.avbpubkey",
8849 private_key: "testkey.pem",
8850 }
8851
8852 cc_library {
8853 name: "mylib",
8854 srcs: ["mylib.cpp"],
8855 static_libs: ["otherlib"],
8856 system_shared_libs: [],
8857 stl: "none",
8858 apex_available: [ "myapex" ],
8859 }
8860
8861 cc_library {
8862 name: "otherlib",
8863 srcs: ["mylib.cpp"],
8864 system_shared_libs: [],
8865 stl: "none",
8866 stubs: {
8867 versions: ["1", "2", "3"],
8868 },
8869 apex_available: [ "myapex" ],
8870 }
8871 `)
8872}
8873
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008874func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008875 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008876 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008877 apex {
8878 name: "myapex",
8879 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008880 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008881 custom_sign_tool: "sign_myapex",
8882 }
8883
8884 apex_key {
8885 name: "myapex.key",
8886 public_key: "testkey.avbpubkey",
8887 private_key: "testkey.pem",
8888 }
8889 `)
8890
Jooyung Han286957d2023-10-30 16:17:56 +09008891 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008892 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008893 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 +09008894}
8895
8896func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008897 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008898 ctx := testApex(t, `
8899 apex {
8900 name: "myapex",
8901 key: "myapex.key",
8902 updatable: false,
8903 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008904 }
8905
8906 apex_key {
8907 name: "myapex.key",
8908 public_key: "testkey.avbpubkey",
8909 private_key: "testkey.pem",
8910 }
8911
8912 prebuilt_apex {
8913 name: "myapex",
8914 prefer: true,
8915 arch: {
8916 arm64: {
8917 src: "myapex-arm64.apex",
8918 },
8919 arm: {
8920 src: "myapex-arm.apex",
8921 },
8922 },
8923 }
8924
8925 apex_set {
8926 name: "myapex_set",
8927 set: "myapex.apks",
8928 filename: "myapex_set.apex",
8929 overrides: ["myapex"],
8930 }
8931 `)
8932
Colin Crossf61d03d2023-11-02 16:56:39 -07008933 content := android.ContentFromFileRuleForTests(t, ctx,
8934 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008935 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 -07008936 content = android.ContentFromFileRuleForTests(t, ctx,
8937 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008938 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 +09008939}
8940
Jooyung Han938b5932020-06-20 12:47:47 +09008941func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008942 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008943 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008944 apex {
8945 name: "myapex",
8946 key: "myapex.key",
8947 apps: ["app"],
8948 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008949 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008950 }
8951
8952 apex_key {
8953 name: "myapex.key",
8954 public_key: "testkey.avbpubkey",
8955 private_key: "testkey.pem",
8956 }
8957
8958 android_app {
8959 name: "app",
8960 srcs: ["foo/bar/MyClass.java"],
8961 package_name: "foo",
8962 sdk_version: "none",
8963 system_modules: "none",
8964 apex_available: [ "myapex" ],
8965 }
8966 `, withFiles(map[string][]byte{
8967 "sub/Android.bp": []byte(`
8968 override_apex {
8969 name: "override_myapex",
8970 base: "myapex",
8971 apps: ["override_app"],
8972 allowed_files: ":allowed",
8973 }
8974 // Overridable "path" property should be referenced indirectly
8975 filegroup {
8976 name: "allowed",
8977 srcs: ["allowed.txt"],
8978 }
8979 override_android_app {
8980 name: "override_app",
8981 base: "app",
8982 package_name: "bar",
8983 }
8984 `),
8985 }))
8986
Jooyung Hana0503a52023-08-23 13:12:50 +09008987 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008988 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8989 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8990 }
8991
Spandan Das50801e22024-05-13 18:29:45 +00008992 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008993 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8994 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8995 }
8996}
8997
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008998func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008999 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009000 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009001 apex {
9002 name: "myapex",
9003 key: "myapex.key",
9004 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009005 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009006 }
9007
9008 apex_key {
9009 name: "myapex.key",
9010 public_key: "testkey.avbpubkey",
9011 private_key: "testkey.pem",
9012 }
9013
9014 cc_library {
9015 name: "mylib",
9016 srcs: ["mylib.cpp"],
9017 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009018 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009019 },
9020 apex_available: ["myapex"],
9021 }
9022
9023 cc_prebuilt_library_shared {
9024 name: "mylib",
9025 prefer: false,
9026 srcs: ["prebuilt.so"],
9027 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009028 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009029 },
9030 apex_available: ["myapex"],
9031 }
9032 `)
9033}
9034
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009035func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009036 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009037 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009038 apex {
9039 name: "myapex",
9040 key: "myapex.key",
9041 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009042 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009043 }
9044 apex_key {
9045 name: "myapex.key",
9046 public_key: "testkey.avbpubkey",
9047 private_key: "testkey.pem",
9048 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009049 `,
9050 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9051 variables.CompressedApex = proptools.BoolPtr(true)
9052 }),
9053 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009054
Jooyung Hana0503a52023-08-23 13:12:50 +09009055 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009056 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9057
Jooyung Hana0503a52023-08-23 13:12:50 +09009058 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009059 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9060
9061 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009062 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009063 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9064
9065 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009066 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009067 var builder strings.Builder
9068 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9069 androidMk := builder.String()
9070 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9071}
9072
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009073func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9074 t.Parallel()
9075 ctx := testApex(t, `
9076 apex {
9077 name: "myapex",
9078 key: "myapex.key",
9079 compressible: true,
9080 updatable: false,
9081 payload_fs_type: "erofs",
9082 }
9083 apex_key {
9084 name: "myapex.key",
9085 public_key: "testkey.avbpubkey",
9086 private_key: "testkey.pem",
9087 }
9088 `,
9089 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9090 variables.CompressedApex = proptools.BoolPtr(true)
9091 }),
9092 )
9093
9094 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9095 if compressRule.Rule != nil {
9096 t.Error("erofs apex should not be compressed")
9097 }
9098}
9099
Jooyung Han26ec8482024-07-31 15:04:05 +09009100func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009101 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009102 for _, compressionEnabled := range []bool{true, false} {
9103 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009104 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009105 ctx := testApex(t, `
9106 apex_set {
9107 name: "com.company.android.myapex",
9108 apex_name: "com.android.myapex",
9109 set: "company-myapex.apks",
9110 }
9111 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9112 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9113 }),
9114 )
9115
9116 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9117 if compressionEnabled {
9118 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9119 } else {
9120 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9121 }
9122 })
9123 }
9124}
9125
Martin Stjernholm2856c662020-12-02 15:03:42 +00009126func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009127 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009128 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009129 apex {
9130 name: "myapex",
9131 key: "myapex.key",
9132 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009133 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009134 }
9135
9136 apex_key {
9137 name: "myapex.key",
9138 public_key: "testkey.avbpubkey",
9139 private_key: "testkey.pem",
9140 }
9141
9142 cc_library {
9143 name: "mylib",
9144 srcs: ["mylib.cpp"],
9145 apex_available: ["myapex"],
9146 shared_libs: ["otherlib"],
9147 system_shared_libs: [],
9148 }
9149
9150 cc_library {
9151 name: "otherlib",
9152 srcs: ["mylib.cpp"],
9153 stubs: {
9154 versions: ["current"],
9155 },
9156 }
9157
9158 cc_prebuilt_library_shared {
9159 name: "otherlib",
9160 prefer: true,
9161 srcs: ["prebuilt.so"],
9162 stubs: {
9163 versions: ["current"],
9164 },
9165 }
9166 `)
9167
Jooyung Hana0503a52023-08-23 13:12:50 +09009168 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009169 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009170 var builder strings.Builder
9171 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9172 androidMk := builder.String()
9173
9174 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9175 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009176 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009177}
9178
Jiyong Parke3867542020-12-03 17:28:25 +09009179func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009181 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
9185 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009186 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009187 }
9188
9189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
9194
9195 cc_library {
9196 name: "mylib",
9197 srcs: ["mylib.cpp"],
9198 system_shared_libs: [],
9199 stl: "none",
9200 apex_available: ["myapex"],
9201 shared_libs: ["mylib2"],
9202 target: {
9203 apex: {
9204 exclude_shared_libs: ["mylib2"],
9205 },
9206 },
9207 }
9208
9209 cc_library {
9210 name: "mylib2",
9211 srcs: ["mylib.cpp"],
9212 system_shared_libs: [],
9213 stl: "none",
9214 }
9215 `)
9216
9217 // Check if mylib is linked to mylib2 for the non-apex target
9218 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9219 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9220
9221 // Make sure that the link doesn't occur for the apex target
9222 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9223 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9224
9225 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009226 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009227 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9228}
9229
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009230func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009231 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009232 bpBase := `
9233 apex {
9234 name: "myapex",
9235 key: "myapex.key",
9236 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009237 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009238 }
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
9244 cc_library {
9245 name: "mylib",
9246 srcs: ["mylib.cpp"],
9247 apex_available: ["myapex"],
9248 shared_libs: ["stublib"],
9249 system_shared_libs: [],
9250 }
9251 apex {
9252 name: "otherapex",
9253 enabled: %s,
9254 key: "myapex.key",
9255 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009256 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009257 }
9258 `
9259
9260 stublibSourceBp := `
9261 cc_library {
9262 name: "stublib",
9263 srcs: ["mylib.cpp"],
9264 apex_available: ["otherapex"],
9265 system_shared_libs: [],
9266 stl: "none",
9267 stubs: {
9268 versions: ["1"],
9269 },
9270 }
9271 `
9272
9273 stublibPrebuiltBp := `
9274 cc_prebuilt_library_shared {
9275 name: "stublib",
9276 srcs: ["prebuilt.so"],
9277 apex_available: ["otherapex"],
9278 stubs: {
9279 versions: ["1"],
9280 },
9281 %s
9282 }
9283 `
9284
9285 tests := []struct {
9286 name string
9287 stublibBp string
9288 usePrebuilt bool
9289 modNames []string // Modules to collect AndroidMkEntries for
9290 otherApexEnabled []string
9291 }{
9292 {
9293 name: "only_source",
9294 stublibBp: stublibSourceBp,
9295 usePrebuilt: false,
9296 modNames: []string{"stublib"},
9297 otherApexEnabled: []string{"true", "false"},
9298 },
9299 {
9300 name: "source_preferred",
9301 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9302 usePrebuilt: false,
9303 modNames: []string{"stublib", "prebuilt_stublib"},
9304 otherApexEnabled: []string{"true", "false"},
9305 },
9306 {
9307 name: "prebuilt_preferred",
9308 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9309 usePrebuilt: true,
9310 modNames: []string{"stublib", "prebuilt_stublib"},
9311 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9312 },
9313 {
9314 name: "only_prebuilt",
9315 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9316 usePrebuilt: true,
9317 modNames: []string{"stublib"},
9318 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9319 },
9320 }
9321
9322 for _, test := range tests {
9323 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009324 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009325 for _, otherApexEnabled := range test.otherApexEnabled {
9326 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009327 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009328 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009329
9330 type modAndMkEntries struct {
9331 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009332 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009333 }
9334 entries := []*modAndMkEntries{}
9335
9336 // Gather shared lib modules that are installable
9337 for _, modName := range test.modNames {
9338 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9339 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9340 continue
9341 }
9342 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009343 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009344 continue
9345 }
Yu Liue70976d2024-10-15 20:45:35 +00009346 info := android.AndroidMkInfoForTest(t, ctx, mod)
9347 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9348 ents = append(ents, info.ExtraInfo...)
9349 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009350 if ent.Disabled {
9351 continue
9352 }
9353 entries = append(entries, &modAndMkEntries{
9354 mod: mod,
9355 mkEntries: ent,
9356 })
9357 }
9358 }
9359 }
9360
9361 var entry *modAndMkEntries = nil
9362 for _, ent := range entries {
9363 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9364 if entry != nil {
9365 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9366 } else {
9367 entry = ent
9368 }
9369 }
9370 }
9371
9372 if entry == nil {
9373 t.Errorf("AndroidMk entry for \"stublib\" missing")
9374 } else {
9375 isPrebuilt := entry.mod.Prebuilt() != nil
9376 if isPrebuilt != test.usePrebuilt {
9377 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9378 }
9379 if !entry.mod.IsStubs() {
9380 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9381 }
9382 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9383 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9384 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009385 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009386 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009387 if !android.InList(expected, cflags) {
9388 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9389 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009390 }
9391 })
9392 }
9393 })
9394 }
9395}
9396
Colin Crossc33e5212021-05-25 18:16:02 -07009397func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009398 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009399 bp := `
9400 apex {
9401 name: "myapex",
9402 key: "myapex.key",
9403 java_libs: ["mylib"],
9404 bootclasspath_fragments: ["mybootclasspathfragment"],
9405 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9406 updatable: false,
9407 }
9408
9409 apex_key {
9410 name: "myapex.key",
9411 public_key: "testkey.avbpubkey",
9412 private_key: "testkey.pem",
9413 }
9414
9415 java_library {
9416 name: "mylib",
9417 srcs: ["mylib.java"],
9418 apex_available: ["myapex"],
9419 compile_dex: true,
9420 }
9421
9422 bootclasspath_fragment {
9423 name: "mybootclasspathfragment",
9424 contents: ["mybootclasspathlib"],
9425 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009426 hidden_api: {
9427 split_packages: ["*"],
9428 },
Colin Crossc33e5212021-05-25 18:16:02 -07009429 }
9430
9431 java_library {
9432 name: "mybootclasspathlib",
9433 srcs: ["mybootclasspathlib.java"],
9434 apex_available: ["myapex"],
9435 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009436 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009437 }
9438
9439 systemserverclasspath_fragment {
9440 name: "mysystemserverclasspathfragment",
9441 contents: ["mysystemserverclasspathlib"],
9442 apex_available: ["myapex"],
9443 }
9444
9445 java_library {
9446 name: "mysystemserverclasspathlib",
9447 srcs: ["mysystemserverclasspathlib.java"],
9448 apex_available: ["myapex"],
9449 compile_dex: true,
9450 }
9451 `
9452
9453 result := android.GroupFixturePreparers(
9454 PrepareForTestWithApexBuildComponents,
9455 prepareForTestWithMyapex,
9456 java.PrepareForTestWithJavaDefaultModules,
9457 android.PrepareForTestWithAndroidBuildComponents,
9458 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009459 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9460 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009461 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009462 ).RunTest(t)
9463
9464 // Make sure jacoco ran on both mylib and mybootclasspathlib
9465 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9466 t.Errorf("Failed to find jacoco rule for mylib")
9467 }
9468 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9469 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9470 }
9471 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9472 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9473 }
9474}
9475
Jiyong Park192600a2021-08-03 07:52:17 +00009476func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009477 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009478 testApexError(t, `executable mybin is static`, `
9479 apex {
9480 name: "myapex",
9481 key: "myapex.key",
9482 binaries: ["mybin"],
9483 min_sdk_version: "29",
9484 }
9485
9486 apex_key {
9487 name: "myapex.key",
9488 public_key: "testkey.avbpubkey",
9489 private_key: "testkey.pem",
9490 }
9491
9492 cc_binary {
9493 name: "mybin",
9494 srcs: ["mylib.cpp"],
9495 relative_install_path: "foo/bar",
9496 static_executable: true,
9497 system_shared_libs: [],
9498 stl: "none",
9499 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009500 min_sdk_version: "29",
9501 }
9502 `)
9503
9504 testApexError(t, `executable mybin.rust is static`, `
9505 apex {
9506 name: "myapex",
9507 key: "myapex.key",
9508 binaries: ["mybin.rust"],
9509 min_sdk_version: "29",
9510 }
9511
9512 apex_key {
9513 name: "myapex.key",
9514 public_key: "testkey.avbpubkey",
9515 private_key: "testkey.pem",
9516 }
9517
9518 rust_binary {
9519 name: "mybin.rust",
9520 srcs: ["foo.rs"],
9521 static_executable: true,
9522 apex_available: ["myapex"],
9523 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009524 }
9525 `)
9526}
9527
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009528func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009529 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009530 ctx := testApex(t, `
9531 apex {
9532 name: "myapex",
9533 key: "myapex.key",
9534 updatable: false,
9535 java_libs: ["foo"],
9536 }
9537
9538 apex_key {
9539 name: "myapex.key",
9540 public_key: "testkey.avbpubkey",
9541 private_key: "testkey.pem",
9542 }
9543
9544 java_library {
9545 name: "foo",
9546 srcs: ["foo.java"],
9547 apex_available: ["myapex"],
9548 installable: true,
9549 }
9550 `,
9551 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9552 )
9553
Jooyung Hana0503a52023-08-23 13:12:50 +09009554 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009555 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9556 var builder strings.Builder
9557 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9558 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009559 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009560}
9561
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009562func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009563 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009564 ctx := testApex(t, `
9565 apex {
9566 name: "myapex",
9567 key: "myapex.key",
9568 updatable: false,
9569 java_libs: ["foo"],
9570 required: ["otherapex"],
9571 }
9572
9573 apex {
9574 name: "otherapex",
9575 key: "myapex.key",
9576 updatable: false,
9577 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009578 }
9579
9580 apex_key {
9581 name: "myapex.key",
9582 public_key: "testkey.avbpubkey",
9583 private_key: "testkey.pem",
9584 }
9585
9586 java_library {
9587 name: "foo",
9588 srcs: ["foo.java"],
9589 apex_available: ["myapex", "otherapex"],
9590 installable: true,
9591 }
9592 `)
9593
Jooyung Hana0503a52023-08-23 13:12:50 +09009594 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009595 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9596 var builder strings.Builder
9597 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9598 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009599 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009600}
9601
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009602func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009603 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009604 ctx := testApex(t, `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 updatable: false,
9609 }
9610
9611 apex_key {
9612 name: "myapex.key",
9613 public_key: "testkey.avbpubkey",
9614 private_key: "testkey.pem",
9615 }
9616 `)
9617
Jooyung Hana0503a52023-08-23 13:12:50 +09009618 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009619 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009620 data := android.AndroidMkDataForTest(t, ctx, bundle)
9621 var builder strings.Builder
9622 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9623 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009624 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009625}
9626
Jooyung Hana6d36672022-02-24 13:58:07 +09009627func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009628 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009629 for _, tc := range []struct {
9630 name string
9631 ref string
9632 expected_data []string
9633 }{
9634 {
9635 name: "test_using_output",
9636 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009637 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009638 },
9639 {
9640 name: "test_using_apex",
9641 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009642 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009643 },
9644 } {
9645 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009646 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009647 ctx := testApex(t, `
9648 apex {
9649 name: "myapex",
9650 key: "myapex.key",
9651 compressible: true,
9652 updatable: false,
9653 }
9654
9655 apex_key {
9656 name: "myapex.key",
9657 public_key: "testkey.avbpubkey",
9658 private_key: "testkey.pem",
9659 }
9660
9661 java_test {
9662 name: "`+tc.name+`",
9663 srcs: ["a.java"],
9664 data: ["`+tc.ref+`"],
9665 }
9666 `,
9667 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9668 variables.CompressedApex = proptools.BoolPtr(true)
9669 }))
9670 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9671 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9672 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9673 })
9674 }
9675}
9676
satayev758968a2021-12-06 11:42:40 +00009677func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009678 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009679 preparer := android.GroupFixturePreparers(
9680 PrepareForTestWithApexBuildComponents,
9681 prepareForTestWithMyapex,
9682 java.PrepareForTestWithJavaSdkLibraryFiles,
9683 java.PrepareForTestWithJavaDefaultModules,
9684 android.PrepareForTestWithAndroidBuildComponents,
9685 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9686 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9687 )
9688
9689 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9690 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009691 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009692 preparer.RunTestWithBp(t, `
9693 apex {
9694 name: "myapex",
9695 key: "myapex.key",
9696 bootclasspath_fragments: ["mybootclasspathfragment"],
9697 min_sdk_version: "30",
9698 updatable: false,
9699 }
9700
9701 apex_key {
9702 name: "myapex.key",
9703 public_key: "testkey.avbpubkey",
9704 private_key: "testkey.pem",
9705 }
9706
9707 bootclasspath_fragment {
9708 name: "mybootclasspathfragment",
9709 contents: ["mybootclasspathlib"],
9710 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009711 hidden_api: {
9712 split_packages: ["*"],
9713 },
satayev758968a2021-12-06 11:42:40 +00009714 }
9715
9716 java_sdk_library {
9717 name: "mybootclasspathlib",
9718 srcs: ["mybootclasspathlib.java"],
9719 apex_available: ["myapex"],
9720 compile_dex: true,
9721 unsafe_ignore_missing_latest_api: true,
9722 min_sdk_version: "31",
9723 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009724 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009725 }
9726
9727 java_library {
9728 name: "util",
9729 srcs: ["a.java"],
9730 apex_available: ["myapex"],
9731 min_sdk_version: "31",
9732 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009733 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009734 }
9735
9736 java_library {
9737 name: "another_util",
9738 srcs: ["a.java"],
9739 min_sdk_version: "31",
9740 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009741 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009742 }
9743 `)
9744 })
9745
9746 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9747 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009748 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009749 preparer.RunTestWithBp(t, `
9750 apex {
9751 name: "myapex",
9752 key: "myapex.key",
9753 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9754 min_sdk_version: "30",
9755 updatable: false,
9756 }
9757
9758 apex_key {
9759 name: "myapex.key",
9760 public_key: "testkey.avbpubkey",
9761 private_key: "testkey.pem",
9762 }
9763
9764 systemserverclasspath_fragment {
9765 name: "mysystemserverclasspathfragment",
9766 contents: ["mysystemserverclasspathlib"],
9767 apex_available: ["myapex"],
9768 }
9769
9770 java_sdk_library {
9771 name: "mysystemserverclasspathlib",
9772 srcs: ["mysystemserverclasspathlib.java"],
9773 apex_available: ["myapex"],
9774 compile_dex: true,
9775 min_sdk_version: "32",
9776 unsafe_ignore_missing_latest_api: true,
9777 static_libs: ["util"],
9778 }
9779
9780 java_library {
9781 name: "util",
9782 srcs: ["a.java"],
9783 apex_available: ["myapex"],
9784 min_sdk_version: "31",
9785 static_libs: ["another_util"],
9786 }
9787
9788 java_library {
9789 name: "another_util",
9790 srcs: ["a.java"],
9791 min_sdk_version: "31",
9792 apex_available: ["myapex"],
9793 }
9794 `)
9795 })
9796
9797 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009798 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009799 preparer.
satayev758968a2021-12-06 11:42:40 +00009800 RunTestWithBp(t, `
9801 apex {
9802 name: "myapex",
9803 key: "myapex.key",
9804 bootclasspath_fragments: ["mybootclasspathfragment"],
9805 min_sdk_version: "30",
9806 updatable: false,
9807 }
9808
9809 apex_key {
9810 name: "myapex.key",
9811 public_key: "testkey.avbpubkey",
9812 private_key: "testkey.pem",
9813 }
9814
9815 bootclasspath_fragment {
9816 name: "mybootclasspathfragment",
9817 contents: ["mybootclasspathlib"],
9818 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009819 hidden_api: {
9820 split_packages: ["*"],
9821 },
satayev758968a2021-12-06 11:42:40 +00009822 }
9823
9824 java_sdk_library {
9825 name: "mybootclasspathlib",
9826 srcs: ["mybootclasspathlib.java"],
9827 apex_available: ["myapex"],
9828 compile_dex: true,
9829 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009830 sdk_version: "current",
9831 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009832 }
9833 `)
9834 })
9835
9836 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009837 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009838 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9839 RunTestWithBp(t, `
9840 apex {
9841 name: "myapex",
9842 key: "myapex.key",
9843 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9844 min_sdk_version: "30",
9845 updatable: false,
9846 }
9847
9848 apex_key {
9849 name: "myapex.key",
9850 public_key: "testkey.avbpubkey",
9851 private_key: "testkey.pem",
9852 }
9853
9854 systemserverclasspath_fragment {
9855 name: "mysystemserverclasspathfragment",
9856 contents: ["mysystemserverclasspathlib"],
9857 apex_available: ["myapex"],
9858 }
9859
9860 java_sdk_library {
9861 name: "mysystemserverclasspathlib",
9862 srcs: ["mysystemserverclasspathlib.java"],
9863 apex_available: ["myapex"],
9864 compile_dex: true,
9865 unsafe_ignore_missing_latest_api: true,
9866 }
9867 `)
9868 })
9869}
9870
Jiakai Zhang6decef92022-01-12 17:56:19 +00009871// Verifies that the APEX depends on all the Make modules in the list.
9872func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9873 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9874 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009875 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009876 }
9877}
9878
9879// Verifies that the APEX does not depend on any of the Make modules in the list.
9880func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9881 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9882 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009883 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009884 }
9885}
9886
Cole Faust24e25c02024-01-19 14:12:17 -08009887func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009888 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009889 bpTemplate := `
9890 apex {
9891 name: "myapex",
9892 key: "myapex.key",
9893 java_libs: ["myjavalib"],
9894 updatable: %v,
9895 min_sdk_version: "29",
9896 }
9897 apex_key {
9898 name: "myapex.key",
9899 }
9900 java_library {
9901 name: "myjavalib",
9902 srcs: ["MyClass.java"],
9903 apex_available: [ "myapex" ],
9904 lint: {
9905 strict_updatability_linting: %v,
9906 %s
9907 },
9908 sdk_version: "current",
9909 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009910 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009911 }
9912 `
9913 fs := android.MockFS{
9914 "lint-baseline.xml": nil,
9915 }
9916
9917 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009918 testCaseName string
9919 apexUpdatable bool
9920 javaStrictUpdtabilityLint bool
9921 lintFileExists bool
9922 disallowedFlagExpectedOnApex bool
9923 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009924 }{
9925 {
Colin Cross87427352024-09-25 15:41:19 -07009926 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9927 apexUpdatable: true,
9928 javaStrictUpdtabilityLint: true,
9929 lintFileExists: false,
9930 disallowedFlagExpectedOnApex: false,
9931 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009932 },
9933 {
Colin Cross87427352024-09-25 15:41:19 -07009934 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9935 apexUpdatable: false,
9936 javaStrictUpdtabilityLint: false,
9937 lintFileExists: true,
9938 disallowedFlagExpectedOnApex: false,
9939 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009940 },
9941 {
Colin Cross87427352024-09-25 15:41:19 -07009942 testCaseName: "non-updatable apex respects strict updatability of javalib",
9943 apexUpdatable: false,
9944 javaStrictUpdtabilityLint: true,
9945 lintFileExists: true,
9946 disallowedFlagExpectedOnApex: false,
9947 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009948 },
9949 {
Colin Cross87427352024-09-25 15:41:19 -07009950 testCaseName: "updatable apex checks strict updatability of javalib",
9951 apexUpdatable: true,
9952 javaStrictUpdtabilityLint: false,
9953 lintFileExists: true,
9954 disallowedFlagExpectedOnApex: true,
9955 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009956 },
9957 }
9958
9959 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009960 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009961 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009962 fixtures := []android.FixturePreparer{}
9963 baselineProperty := ""
9964 if testCase.lintFileExists {
9965 fixtures = append(fixtures, fs.AddToFixture())
9966 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9967 }
9968 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009969
Colin Cross87427352024-09-25 15:41:19 -07009970 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009971
Colin Cross87427352024-09-25 15:41:19 -07009972 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9973 if expectStrictUpdatability {
9974 if m.Rule == nil {
9975 t.Errorf("expected strict updatability check rule on %s", name)
9976 } else {
9977 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9978 m.RuleParams.Command, "--disallowed_issues NewApi")
9979 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9980 m.Inputs.Strings(), "lint-baseline.xml")
9981 }
9982 } else {
9983 if m.Rule != nil {
9984 t.Errorf("expected no strict updatability check rule on %s", name)
9985 }
9986 }
9987 }
9988
9989 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9990 apex := result.ModuleForTests("myapex", "android_common_myapex")
9991 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9992 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9993
9994 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9995 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9996 })
Cole Faust24e25c02024-01-19 14:12:17 -08009997 }
9998}
9999
Cole Faust24e25c02024-01-19 14:12:17 -080010000// checks transtive deps of an apex coming from bootclasspath_fragment
10001func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010002 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010003 bp := `
10004 apex {
10005 name: "myapex",
10006 key: "myapex.key",
10007 bootclasspath_fragments: ["mybootclasspathfragment"],
10008 updatable: true,
10009 min_sdk_version: "29",
10010 }
10011 apex_key {
10012 name: "myapex.key",
10013 }
10014 bootclasspath_fragment {
10015 name: "mybootclasspathfragment",
10016 contents: ["myjavalib"],
10017 apex_available: ["myapex"],
10018 hidden_api: {
10019 split_packages: ["*"],
10020 },
10021 }
10022 java_library {
10023 name: "myjavalib",
10024 srcs: ["MyClass.java"],
10025 apex_available: [ "myapex" ],
10026 sdk_version: "current",
10027 min_sdk_version: "29",
10028 compile_dex: true,
10029 lint: {
10030 baseline_filename: "lint-baseline.xml",
10031 }
10032 }
10033 `
10034 fs := android.MockFS{
10035 "lint-baseline.xml": nil,
10036 }
10037
10038 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010039 apex := result.ModuleForTests("myapex", "android_common_myapex")
10040 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10041 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10042 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10043 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10044 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010045}
Spandan Das66773252022-01-15 00:23:18 +000010046
Jihoon Kang784c0052024-06-25 22:15:39 +000010047func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010048 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010049 bp := `
10050 apex {
10051 name: "myapex",
10052 key: "myapex.key",
10053 bootclasspath_fragments: ["mybootclasspathfragment"],
10054 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010055 java_libs: [
10056 "jacocoagent",
10057 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010058 }
10059 apex_key {
10060 name: "myapex.key",
10061 }
10062 bootclasspath_fragment {
10063 name: "mybootclasspathfragment",
10064 contents: ["foo"],
10065 apex_available: ["myapex"],
10066 hidden_api: {
10067 split_packages: ["*"],
10068 },
10069 }
10070 java_sdk_library {
10071 name: "foo",
10072 srcs: ["MyClass.java"],
10073 apex_available: [ "myapex" ],
10074 sdk_version: "current",
10075 min_sdk_version: "29",
10076 compile_dex: true,
10077 }
10078 `
10079 fs := android.MockFS{
10080 "lint-baseline.xml": nil,
10081 }
10082
10083 result := android.GroupFixturePreparers(
10084 prepareForApexTest,
10085 java.PrepareForTestWithJavaSdkLibraryFiles,
10086 java.PrepareForTestWithJacocoInstrumentation,
10087 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010088 android.FixtureMergeMockFs(fs),
10089 ).RunTestWithBp(t, bp)
10090
10091 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10092 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10093 android.AssertStringDoesContain(t,
10094 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10095 lintReportInputs, "foo.impl")
10096}
10097
Spandan Das42e89502022-05-06 22:12:55 +000010098// updatable apexes should propagate updatable=true to its apps
10099func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010100 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010101 bp := `
10102 apex {
10103 name: "myapex",
10104 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010105 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010106 apps: [
10107 "myapp",
10108 ],
10109 min_sdk_version: "30",
10110 }
10111 apex_key {
10112 name: "myapex.key",
10113 }
10114 android_app {
10115 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010116 apex_available: [
10117 "myapex",
10118 ],
10119 sdk_version: "current",
10120 min_sdk_version: "30",
10121 }
10122 `
Colin Cross99939e92024-10-01 16:02:46 -070010123 _ = android.GroupFixturePreparers(
10124 prepareForApexTest,
10125 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10126 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010127}
10128
Jingwen Chendea7a642023-03-28 11:30:50 +000010129func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010130 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010131 ctx := testApex(t, `
10132 apex {
10133 name: "myapex",
10134 key: "myapex.key",
10135 updatable: false,
10136 }
10137
10138 apex_key {
10139 name: "myapex.key",
10140 public_key: "testkey.avbpubkey",
10141 private_key: "testkey.pem",
10142 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010143 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010144 generateFsRule := mod.Rule("generateFsConfig")
10145 cmd := generateFsRule.RuleParams.Command
10146
10147 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10148}
10149
10150func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010151 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010152 ctx := testApex(t, `
10153 apex {
10154 name: "myapex",
10155 key: "myapex.key",
10156 canned_fs_config: "my_config",
10157 updatable: false,
10158 }
10159
10160 apex_key {
10161 name: "myapex.key",
10162 public_key: "testkey.avbpubkey",
10163 private_key: "testkey.pem",
10164 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010165 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010166 generateFsRule := mod.Rule("generateFsConfig")
10167 cmd := generateFsRule.RuleParams.Command
10168
10169 // Ensure that canned_fs_config has "cat my_config" at the end
10170 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10171}
Spandan Das20fce2d2023-04-12 17:21:39 +000010172
10173func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010174 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010175 testCases := []struct {
10176 desc string
10177 hasStubs bool
10178 apexAvailable string
10179 expectedError string
10180 }{
10181 {
10182 desc: "non-stub library can have multiple apex_available",
10183 hasStubs: false,
10184 apexAvailable: `["myapex", "otherapex"]`,
10185 },
10186 {
10187 desc: "stub library should not be available to anyapex",
10188 hasStubs: true,
10189 apexAvailable: `["//apex_available:anyapex"]`,
10190 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10191 },
10192 {
10193 desc: "stub library should not be available to multiple apexes",
10194 hasStubs: true,
10195 apexAvailable: `["myapex", "otherapex"]`,
10196 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10197 },
10198 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010199 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 +000010200 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010201 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010202 },
10203 }
10204 bpTemplate := `
10205 cc_library {
10206 name: "libfoo",
10207 %v
10208 apex_available: %v,
10209 }
10210 apex {
10211 name: "myapex",
10212 key: "apex.key",
10213 updatable: false,
10214 native_shared_libs: ["libfoo"],
10215 }
10216 apex {
10217 name: "otherapex",
10218 key: "apex.key",
10219 updatable: false,
10220 }
10221 apex_test {
10222 name: "test_myapex",
10223 key: "apex.key",
10224 updatable: false,
10225 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010226 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010227 }
10228 apex_key {
10229 name: "apex.key",
10230 }
10231 `
10232 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010233 t.Run(tc.desc, func(t *testing.T) {
10234 stubs := ""
10235 if tc.hasStubs {
10236 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10237 }
10238 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10239 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10240 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10241 })
10242 if tc.expectedError == "" {
10243 testApex(t, bp, mockFsFixturePreparer)
10244 } else {
10245 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10246 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010247 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010248 }
10249}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010250
10251func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010252 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010253 context := android.GroupFixturePreparers(
10254 android.PrepareForIntegrationTestWithAndroid,
10255 cc.PrepareForIntegrationTestWithCc,
10256 PrepareForTestWithApexBuildComponents,
10257 prepareForTestWithMyapex,
10258 filesystem.PrepareForTestWithFilesystemBuildComponents,
10259 )
10260 result := context.RunTestWithBp(t, `
10261 android_system_image {
10262 name: "myfilesystem",
10263 deps: [
10264 "libfoo",
10265 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010266 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010267 gen_linker_config: true,
10268 linker_config_srcs: ["linker.config.json"],
10269 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010270 }
10271
10272 cc_library {
10273 name: "libfoo",
10274 shared_libs: [
10275 "libbar",
10276 ],
10277 stl: "none",
10278 }
10279
10280 cc_library {
10281 name: "libbar",
10282 stl: "none",
10283 apex_available: ["myapex"],
10284 }
10285
10286 apex {
10287 name: "myapex",
10288 native_shared_libs: ["libbar"],
10289 key: "myapex.key",
10290 updatable: false,
10291 }
10292
10293 apex_key {
10294 name: "myapex.key",
10295 public_key: "testkey.avbpubkey",
10296 private_key: "testkey.pem",
10297 }
10298 `)
10299
Cole Faust3b806d32024-03-11 15:15:03 -070010300 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010301 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10302 inputs.Strings(),
10303 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10304}
Yu Liueae7b362023-11-16 17:05:47 -080010305
10306var apex_default_bp = `
10307 apex_key {
10308 name: "myapex.key",
10309 public_key: "testkey.avbpubkey",
10310 private_key: "testkey.pem",
10311 }
10312
10313 filegroup {
10314 name: "myapex.manifest",
10315 srcs: ["apex_manifest.json"],
10316 }
10317
10318 filegroup {
10319 name: "myapex.androidmanifest",
10320 srcs: ["AndroidManifest.xml"],
10321 }
10322`
10323
10324func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010325 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010326 ctx := testApex(t, apex_default_bp+`
10327 apex {
10328 name: "myapex",
10329 manifest: ":myapex.manifest",
10330 androidManifest: ":myapex.androidmanifest",
10331 key: "myapex.key",
10332 java_libs: [
10333 "my_java_library_foo",
10334 "my_java_library_bar",
10335 ],
10336 updatable: false,
10337 }
10338
10339 java_library {
10340 name: "my_java_library_foo",
10341 srcs: ["foo/bar/MyClass.java"],
10342 sdk_version: "none",
10343 system_modules: "none",
10344 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010345 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010346 "myapex",
10347 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010348 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010349 }
10350
10351 java_library {
10352 name: "my_java_library_bar",
10353 srcs: ["foo/bar/MyClass.java"],
10354 sdk_version: "none",
10355 system_modules: "none",
10356 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010357 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010358 "myapex",
10359 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010360 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010361 }
10362
10363 aconfig_declarations {
10364 name: "my_aconfig_declarations_foo",
10365 package: "com.example.package",
10366 container: "myapex",
10367 srcs: ["foo.aconfig"],
10368 }
10369
10370 java_aconfig_library {
10371 name: "my_java_aconfig_library_foo",
10372 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010373 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010374 "myapex",
10375 ],
10376 }
10377
10378 aconfig_declarations {
10379 name: "my_aconfig_declarations_bar",
10380 package: "com.example.package",
10381 container: "myapex",
10382 srcs: ["bar.aconfig"],
10383 }
10384
10385 java_aconfig_library {
10386 name: "my_java_aconfig_library_bar",
10387 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010388 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010389 "myapex",
10390 ],
10391 }
10392 `)
10393
10394 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10395 s := mod.Rule("apexRule").Args["copy_commands"]
10396 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010397 if len(copyCmds) != 14 {
10398 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010399 }
10400
Jooyung Hana3fddf42024-09-03 13:22:21 +090010401 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10402 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10403 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10404 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010405 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010406
Yu Liubba555e2024-02-17 00:36:42 +000010407 inputs := []string{
10408 "my_aconfig_declarations_foo/intermediate.pb",
10409 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010410 }
Yu Liubba555e2024-02-17 00:36:42 +000010411 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10412 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10413 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10414 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010415 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010416}
10417
10418func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010419 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010420 ctx := testApex(t, apex_default_bp+`
10421 apex {
10422 name: "myapex",
10423 manifest: ":myapex.manifest",
10424 androidManifest: ":myapex.androidmanifest",
10425 key: "myapex.key",
10426 java_libs: [
10427 "my_java_library_foo",
10428 ],
10429 native_shared_libs: [
10430 "my_cc_library_bar",
10431 ],
10432 binaries: [
10433 "my_cc_binary_baz",
10434 ],
10435 updatable: false,
10436 }
10437
10438 java_library {
10439 name: "my_java_library_foo",
10440 srcs: ["foo/bar/MyClass.java"],
10441 sdk_version: "none",
10442 system_modules: "none",
10443 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010444 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010445 "myapex",
10446 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010447 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010448 }
10449
10450 cc_library {
10451 name: "my_cc_library_bar",
10452 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010453 static_libs: [
10454 "my_cc_aconfig_library_bar",
10455 "my_cc_aconfig_library_baz",
10456 ],
Yu Liueae7b362023-11-16 17:05:47 -080010457 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010458 "myapex",
10459 ],
10460 }
10461
10462 cc_binary {
10463 name: "my_cc_binary_baz",
10464 srcs: ["foo/bar/MyClass.cc"],
10465 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010466 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010467 "myapex",
10468 ],
10469 }
10470
10471 aconfig_declarations {
10472 name: "my_aconfig_declarations_foo",
10473 package: "com.example.package",
10474 container: "myapex",
10475 srcs: ["foo.aconfig"],
10476 }
10477
10478 java_aconfig_library {
10479 name: "my_java_aconfig_library_foo",
10480 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010481 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010482 "myapex",
10483 ],
10484 }
10485
10486 aconfig_declarations {
10487 name: "my_aconfig_declarations_bar",
10488 package: "com.example.package",
10489 container: "myapex",
10490 srcs: ["bar.aconfig"],
10491 }
10492
10493 cc_aconfig_library {
10494 name: "my_cc_aconfig_library_bar",
10495 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010496 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010497 "myapex",
10498 ],
10499 }
10500
10501 aconfig_declarations {
10502 name: "my_aconfig_declarations_baz",
10503 package: "com.example.package",
10504 container: "myapex",
10505 srcs: ["baz.aconfig"],
10506 }
10507
10508 cc_aconfig_library {
10509 name: "my_cc_aconfig_library_baz",
10510 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010511 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010512 "myapex",
10513 ],
10514 }
10515
10516 cc_library {
10517 name: "server_configurable_flags",
10518 srcs: ["server_configurable_flags.cc"],
10519 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010520 cc_library {
10521 name: "libbase",
10522 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010523 apex_available: [
10524 "myapex",
10525 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010526 }
10527 cc_library {
10528 name: "libaconfig_storage_read_api_cc",
10529 srcs: ["libaconfig_storage_read_api_cc.cc"],
10530 }
Yu Liueae7b362023-11-16 17:05:47 -080010531 `)
10532
10533 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10534 s := mod.Rule("apexRule").Args["copy_commands"]
10535 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010536 if len(copyCmds) != 18 {
10537 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010538 }
10539
Jooyung Hana3fddf42024-09-03 13:22:21 +090010540 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10541 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10542 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10543 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010544 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010545
Yu Liubba555e2024-02-17 00:36:42 +000010546 inputs := []string{
10547 "my_aconfig_declarations_foo/intermediate.pb",
10548 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10549 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010550 }
Yu Liubba555e2024-02-17 00:36:42 +000010551 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10552 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10553 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10554 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010555 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010556}
10557
Yu Liucec0e412023-11-30 16:45:50 -080010558func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010559 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010560 ctx := testApex(t, apex_default_bp+`
10561 apex {
10562 name: "myapex",
10563 manifest: ":myapex.manifest",
10564 androidManifest: ":myapex.androidmanifest",
10565 key: "myapex.key",
10566 native_shared_libs: [
10567 "libmy_rust_library",
10568 ],
10569 binaries: [
10570 "my_rust_binary",
10571 ],
10572 rust_dyn_libs: [
10573 "libmy_rust_dylib",
10574 ],
10575 updatable: false,
10576 }
10577
10578 rust_library {
10579 name: "libflags_rust", // test mock
10580 crate_name: "flags_rust",
10581 srcs: ["lib.rs"],
10582 apex_available: [
10583 "myapex",
10584 ],
10585 }
10586
10587 rust_library {
10588 name: "liblazy_static", // test mock
10589 crate_name: "lazy_static",
10590 srcs: ["src/lib.rs"],
10591 apex_available: [
10592 "myapex",
10593 ],
10594 }
10595
Ted Bauer02d475c2024-03-27 20:56:26 +000010596 rust_library {
10597 name: "libaconfig_storage_read_api", // test mock
10598 crate_name: "aconfig_storage_read_api",
10599 srcs: ["src/lib.rs"],
10600 apex_available: [
10601 "myapex",
10602 ],
10603 }
10604
Ted Bauer6ef40db2024-03-29 14:04:10 +000010605 rust_library {
10606 name: "liblogger", // test mock
10607 crate_name: "logger",
10608 srcs: ["src/lib.rs"],
10609 apex_available: [
10610 "myapex",
10611 ],
10612 }
10613
10614 rust_library {
10615 name: "liblog_rust", // test mock
10616 crate_name: "log_rust",
10617 srcs: ["src/lib.rs"],
10618 apex_available: [
10619 "myapex",
10620 ],
10621 }
10622
Yu Liucec0e412023-11-30 16:45:50 -080010623 rust_ffi_shared {
10624 name: "libmy_rust_library",
10625 srcs: ["src/lib.rs"],
10626 rustlibs: ["libmy_rust_aconfig_library_foo"],
10627 crate_name: "my_rust_library",
10628 apex_available: [
10629 "myapex",
10630 ],
10631 }
10632
10633 rust_library_dylib {
10634 name: "libmy_rust_dylib",
10635 srcs: ["foo/bar/MyClass.rs"],
10636 rustlibs: ["libmy_rust_aconfig_library_bar"],
10637 crate_name: "my_rust_dylib",
10638 apex_available: [
10639 "myapex",
10640 ],
10641 }
10642
10643 rust_binary {
10644 name: "my_rust_binary",
10645 srcs: ["foo/bar/MyClass.rs"],
10646 rustlibs: [
10647 "libmy_rust_aconfig_library_baz",
10648 "libmy_rust_dylib",
10649 ],
10650 apex_available: [
10651 "myapex",
10652 ],
10653 }
10654
10655 aconfig_declarations {
10656 name: "my_aconfig_declarations_foo",
10657 package: "com.example.package",
10658 container: "myapex",
10659 srcs: ["foo.aconfig"],
10660 }
10661
10662 aconfig_declarations {
10663 name: "my_aconfig_declarations_bar",
10664 package: "com.example.package",
10665 container: "myapex",
10666 srcs: ["bar.aconfig"],
10667 }
10668
10669 aconfig_declarations {
10670 name: "my_aconfig_declarations_baz",
10671 package: "com.example.package",
10672 container: "myapex",
10673 srcs: ["baz.aconfig"],
10674 }
10675
10676 rust_aconfig_library {
10677 name: "libmy_rust_aconfig_library_foo",
10678 aconfig_declarations: "my_aconfig_declarations_foo",
10679 crate_name: "my_rust_aconfig_library_foo",
10680 apex_available: [
10681 "myapex",
10682 ],
10683 }
10684
10685 rust_aconfig_library {
10686 name: "libmy_rust_aconfig_library_bar",
10687 aconfig_declarations: "my_aconfig_declarations_bar",
10688 crate_name: "my_rust_aconfig_library_bar",
10689 apex_available: [
10690 "myapex",
10691 ],
10692 }
10693
10694 rust_aconfig_library {
10695 name: "libmy_rust_aconfig_library_baz",
10696 aconfig_declarations: "my_aconfig_declarations_baz",
10697 crate_name: "my_rust_aconfig_library_baz",
10698 apex_available: [
10699 "myapex",
10700 ],
10701 }
10702 `)
10703
10704 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10705 s := mod.Rule("apexRule").Args["copy_commands"]
10706 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010707 if len(copyCmds) != 38 {
10708 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010709 }
10710
Jooyung Hana3fddf42024-09-03 13:22:21 +090010711 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10712 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10713 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10714 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010715 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010716
Yu Liubba555e2024-02-17 00:36:42 +000010717 inputs := []string{
10718 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010719 "my_aconfig_declarations_bar/intermediate.pb",
10720 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010721 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10722 }
10723 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10724 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10725 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10726 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010727 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010728}
10729
10730func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10731 aconfigRule := mod.Description(desc)
10732 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010733 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010734 if len(aconfigArgs) != len(inputs) {
10735 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010736 }
Yu Liucec0e412023-11-30 16:45:50 -080010737
Yu Liubba555e2024-02-17 00:36:42 +000010738 ensureEquals(t, container, aconfigRule.Args["container"])
10739 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10740
10741 buildParams := aconfigRule.BuildParams
10742 for _, input := range inputs {
10743 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10744 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010745 }
Yu Liubba555e2024-02-17 00:36:42 +000010746
10747 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010748}
10749
Yu Liueae7b362023-11-16 17:05:47 -080010750func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010751 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010752 ctx := testApex(t, apex_default_bp+`
10753 apex {
10754 name: "myapex",
10755 manifest: ":myapex.manifest",
10756 androidManifest: ":myapex.androidmanifest",
10757 key: "myapex.key",
10758 java_libs: [
10759 "my_java_library_foo",
10760 "other_java_library_bar",
10761 ],
10762 updatable: false,
10763 }
10764
10765 java_library {
10766 name: "my_java_library_foo",
10767 srcs: ["foo/bar/MyClass.java"],
10768 sdk_version: "none",
10769 system_modules: "none",
10770 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010771 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010772 "myapex",
10773 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010774 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010775 }
10776
10777 java_library {
10778 name: "other_java_library_bar",
10779 srcs: ["foo/bar/MyClass.java"],
10780 sdk_version: "none",
10781 system_modules: "none",
10782 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010783 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010784 "myapex",
10785 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010786 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010787 }
10788
10789 aconfig_declarations {
10790 name: "my_aconfig_declarations_foo",
10791 package: "com.example.package",
10792 container: "myapex",
10793 srcs: ["foo.aconfig"],
10794 }
10795
10796 java_aconfig_library {
10797 name: "my_java_aconfig_library_foo",
10798 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010799 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010800 "myapex",
10801 ],
10802 }
10803
10804 aconfig_declarations {
10805 name: "other_aconfig_declarations_bar",
10806 package: "com.example.package",
10807 container: "otherapex",
10808 srcs: ["bar.aconfig"],
10809 }
10810
10811 java_aconfig_library {
10812 name: "other_java_aconfig_library_bar",
10813 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010814 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010815 "myapex",
10816 ],
10817 }
10818 `)
10819
10820 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10821 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10822 s := " " + combineAconfigRule.Args["cache_files"]
10823 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10824 if len(aconfigArgs) != 1 {
10825 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10826 }
10827 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10828
10829 buildParams := combineAconfigRule.BuildParams
10830 if len(buildParams.Inputs) != 1 {
10831 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10832 }
10833 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10834 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10835}
10836
10837func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010838 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010839 ctx := testApex(t, apex_default_bp+`
10840 apex {
10841 name: "myapex",
10842 manifest: ":myapex.manifest",
10843 androidManifest: ":myapex.androidmanifest",
10844 key: "myapex.key",
10845 java_libs: [
10846 "my_java_library_foo",
10847 "my_java_library_bar",
10848 ],
10849 updatable: false,
10850 }
10851
10852 java_library {
10853 name: "my_java_library_foo",
10854 srcs: ["foo/bar/MyClass.java"],
10855 sdk_version: "none",
10856 system_modules: "none",
10857 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010858 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010859 "myapex",
10860 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010861 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010862 }
10863
10864 java_library {
10865 name: "my_java_library_bar",
10866 srcs: ["foo/bar/MyClass.java"],
10867 sdk_version: "none",
10868 system_modules: "none",
10869 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010870 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010871 "myapex",
10872 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010873 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010874 }
10875
10876 aconfig_declarations {
10877 name: "my_aconfig_declarations_foo",
10878 package: "com.example.package",
10879 container: "myapex",
10880 srcs: ["foo.aconfig"],
10881 }
10882
10883 java_aconfig_library {
10884 name: "my_java_aconfig_library_foo",
10885 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010886 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010887 "myapex",
10888 ],
10889 }
10890
10891 java_aconfig_library {
10892 name: "my_java_aconfig_library_bar",
10893 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010894 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010895 "myapex",
10896 ],
10897 }
10898 `)
10899
10900 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10901 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10902 s := " " + combineAconfigRule.Args["cache_files"]
10903 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10904 if len(aconfigArgs) != 1 {
10905 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10906 }
10907 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10908
10909 buildParams := combineAconfigRule.BuildParams
10910 if len(buildParams.Inputs) != 1 {
10911 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10912 }
10913 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10914 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10915}
Spandan Das5be63332023-12-13 00:06:32 +000010916
10917// Test that the boot jars come from the _selected_ apex prebuilt
10918// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10919func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010920 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010921 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10922 t.Helper()
10923 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10924 foundLibfooJar := false
10925 base := stem + ".jar"
10926 for _, output := range s.AllOutputs() {
10927 if filepath.Base(output) == base {
10928 foundLibfooJar = true
10929 buildRule := s.Output(output)
10930 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10931 }
10932 }
10933 if !foundLibfooJar {
10934 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10935 }
10936 }
10937
Spandan Das64c9e0c2023-12-20 20:13:34 +000010938 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10939 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10940 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10941 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10942 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10943 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)
10944 }
10945
10946 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10947 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10948 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10949 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10950 }
10951
Spandan Das5be63332023-12-13 00:06:32 +000010952 bp := `
10953 // Source APEX.
10954
10955 java_library {
10956 name: "framework-foo",
10957 srcs: ["foo.java"],
10958 installable: true,
10959 apex_available: [
10960 "com.android.foo",
10961 ],
10962 }
10963
10964 bootclasspath_fragment {
10965 name: "foo-bootclasspath-fragment",
10966 contents: ["framework-foo"],
10967 apex_available: [
10968 "com.android.foo",
10969 ],
10970 hidden_api: {
10971 split_packages: ["*"],
10972 },
10973 }
10974
10975 apex_key {
10976 name: "com.android.foo.key",
10977 public_key: "com.android.foo.avbpubkey",
10978 private_key: "com.android.foo.pem",
10979 }
10980
10981 apex {
10982 name: "com.android.foo",
10983 key: "com.android.foo.key",
10984 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10985 updatable: false,
10986 }
10987
10988 // Prebuilt APEX.
10989
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010990 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010991 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010992 public: {
10993 jars: ["foo.jar"],
10994 },
Spandan Das5be63332023-12-13 00:06:32 +000010995 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010996 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010997 }
10998
10999 prebuilt_bootclasspath_fragment {
11000 name: "foo-bootclasspath-fragment",
11001 contents: ["framework-foo"],
11002 hidden_api: {
11003 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11004 metadata: "my-bootclasspath-fragment/metadata.csv",
11005 index: "my-bootclasspath-fragment/index.csv",
11006 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11007 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11008 },
11009 apex_available: [
11010 "com.android.foo",
11011 ],
11012 }
11013
11014 prebuilt_apex {
11015 name: "com.android.foo",
11016 apex_name: "com.android.foo",
11017 src: "com.android.foo-arm.apex",
11018 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11019 }
11020
11021 // Another Prebuilt ART APEX
11022 prebuilt_apex {
11023 name: "com.android.foo.v2",
11024 apex_name: "com.android.foo", // Used to determine the API domain
11025 src: "com.android.foo-arm.apex",
11026 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11027 }
11028
11029 // APEX contribution modules
11030
11031 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011032 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011033 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011034 contents: ["com.android.foo"],
11035 }
11036
11037 apex_contributions {
11038 name: "foo.prebuilt.contributions",
11039 api_domain: "com.android.foo",
11040 contents: ["prebuilt_com.android.foo"],
11041 }
11042
11043 apex_contributions {
11044 name: "foo.prebuilt.v2.contributions",
11045 api_domain: "com.android.foo",
11046 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011047 }
11048 `
11049
11050 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011051 desc string
11052 selectedApexContributions string
11053 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011054 }{
11055 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011056 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11057 selectedApexContributions: "foo.source.contributions",
11058 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011059 },
11060 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011061 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11062 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011063 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 +000011064 },
11065 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011066 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11067 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011068 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 +000011069 },
11070 }
11071
11072 fragment := java.ApexVariantReference{
11073 Apex: proptools.StringPtr("com.android.foo"),
11074 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11075 }
11076
11077 for _, tc := range testCases {
11078 preparer := android.GroupFixturePreparers(
11079 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11080 android.FixtureMergeMockFs(map[string][]byte{
11081 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11082 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011083 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11084 // file creation.
11085 java.FixtureConfigureBootJars("platform:foo"),
11086 android.FixtureModifyMockFS(func(fs android.MockFS) {
11087 fs["platform/Android.bp"] = []byte(`
11088 java_library {
11089 name: "foo",
11090 srcs: ["Test.java"],
11091 compile_dex: true,
11092 }
11093 `)
11094 fs["platform/Test.java"] = nil
11095 }),
11096
Colin Crossa66b4632024-08-08 15:50:47 -070011097 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011098 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011099 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011100 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011101 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11102 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011103 }
11104}
Spandan Das3576e762024-01-03 18:57:03 +000011105
11106// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11107// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11108func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011109 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011110 // for a mainline module family, check that only the flagged soong module is visible to make
11111 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11112 variation := func(moduleName string) string {
11113 ret := "android_common_com.android.foo"
11114 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011115 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011116 }
11117 return ret
11118 }
11119
11120 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11121 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11122
11123 for _, hiddenModuleName := range hiddenModuleNames {
11124 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11125 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11126
11127 }
11128 }
11129
11130 bp := `
11131 apex_key {
11132 name: "com.android.foo.key",
11133 public_key: "com.android.foo.avbpubkey",
11134 private_key: "com.android.foo.pem",
11135 }
11136
11137 // AOSP source apex
11138 apex {
11139 name: "com.android.foo",
11140 key: "com.android.foo.key",
11141 updatable: false,
11142 }
11143
11144 // Google source apex
11145 override_apex {
11146 name: "com.google.android.foo",
11147 base: "com.android.foo",
11148 key: "com.android.foo.key",
11149 }
11150
11151 // Prebuilt Google APEX.
11152
11153 prebuilt_apex {
11154 name: "com.google.android.foo",
11155 apex_name: "com.android.foo",
11156 src: "com.android.foo-arm.apex",
11157 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11158 }
11159
11160 // Another Prebuilt Google APEX
11161 prebuilt_apex {
11162 name: "com.google.android.foo.v2",
11163 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011164 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011165 src: "com.android.foo-arm.apex",
11166 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11167 }
11168
11169 // APEX contribution modules
11170
11171 apex_contributions {
11172 name: "foo.source.contributions",
11173 api_domain: "com.android.foo",
11174 contents: ["com.google.android.foo"],
11175 }
11176
11177 apex_contributions {
11178 name: "foo.prebuilt.contributions",
11179 api_domain: "com.android.foo",
11180 contents: ["prebuilt_com.google.android.foo"],
11181 }
11182
11183 apex_contributions {
11184 name: "foo.prebuilt.v2.contributions",
11185 api_domain: "com.android.foo",
11186 contents: ["prebuilt_com.google.android.foo.v2"],
11187 }
11188
11189 // This is an incompatible module because it selects multiple versions of the same mainline module
11190 apex_contributions {
11191 name: "foo.prebuilt.duplicate.contributions",
11192 api_domain: "com.android.foo",
11193 contents: [
11194 "prebuilt_com.google.android.foo",
11195 "prebuilt_com.google.android.foo.v2",
11196 ],
11197 }
11198 `
11199
11200 testCases := []struct {
11201 desc string
11202 selectedApexContributions string
11203 expectedVisibleModuleName string
11204 expectedHiddenModuleNames []string
11205 expectedError string
11206 }{
11207 {
11208 desc: "Source apex is selected, prebuilts should be hidden from make",
11209 selectedApexContributions: "foo.source.contributions",
11210 expectedVisibleModuleName: "com.google.android.foo",
11211 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11212 },
11213 {
11214 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11215 selectedApexContributions: "foo.prebuilt.contributions",
11216 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11217 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11218 },
11219 {
11220 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11221 selectedApexContributions: "foo.prebuilt.v2.contributions",
11222 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11223 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11224 },
11225 {
11226 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11227 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11228 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11229 },
11230 }
11231
11232 for _, tc := range testCases {
11233 preparer := android.GroupFixturePreparers(
11234 android.FixtureMergeMockFs(map[string][]byte{
11235 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11236 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011237 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011238 )
11239 if tc.expectedError != "" {
11240 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11241 testApex(t, bp, preparer)
11242 return
11243 }
11244 ctx := testApex(t, bp, preparer)
11245
Spandan Das3576e762024-01-03 18:57:03 +000011246 // Check that
11247 // 1. The contents of the selected apex_contributions are visible to make
11248 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11249 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11250 }
11251}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011252
Spandan Das85bd4622024-08-01 00:51:20 +000011253// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11254func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011255 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011256 // for a mainline module family, check that only the flagged soong module is visible to make
11257 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11258 variation := func(moduleName string) string {
11259 ret := "android_common_com.android.adservices"
11260 if moduleName == "com.google.android.foo" {
11261 ret = "android_common_com.google.android.foo_com.google.android.foo"
11262 }
11263 return ret
11264 }
11265
11266 for _, visibleModuleName := range visibleModuleNames {
11267 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11268 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11269 }
11270
11271 for _, hiddenModuleName := range hiddenModuleNames {
11272 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11273 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11274
11275 }
11276 }
11277
11278 bp := `
11279 apex_key {
11280 name: "com.android.adservices.key",
11281 public_key: "com.android.adservices.avbpubkey",
11282 private_key: "com.android.adservices.pem",
11283 }
11284
11285 // AOSP source apex
11286 apex {
11287 name: "com.android.adservices",
11288 key: "com.android.adservices.key",
11289 updatable: false,
11290 }
11291
11292 // Prebuilt Google APEX.
11293
11294 prebuilt_apex {
11295 name: "com.google.android.adservices",
11296 apex_name: "com.android.adservices",
11297 src: "com.android.foo-arm.apex",
11298 }
11299
11300 // Another Prebuilt Google APEX
11301 prebuilt_apex {
11302 name: "com.google.android.adservices.v2",
11303 apex_name: "com.android.adservices",
11304 src: "com.android.foo-arm.apex",
11305 }
11306
11307 // APEX contribution modules
11308
11309
11310 apex_contributions {
11311 name: "adservices.prebuilt.contributions",
11312 api_domain: "com.android.adservices",
11313 contents: ["prebuilt_com.google.android.adservices"],
11314 }
11315
11316 apex_contributions {
11317 name: "adservices.prebuilt.v2.contributions",
11318 api_domain: "com.android.adservices",
11319 contents: ["prebuilt_com.google.android.adservices.v2"],
11320 }
11321 `
11322
11323 testCases := []struct {
11324 desc string
11325 selectedApexContributions string
11326 expectedVisibleModuleNames []string
11327 expectedHiddenModuleNames []string
11328 }{
11329 {
11330 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11331 selectedApexContributions: "",
11332 expectedVisibleModuleNames: []string{"com.android.adservices"},
11333 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11334 },
11335 {
11336 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11337 selectedApexContributions: "adservices.prebuilt.contributions",
11338 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11339 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11340 },
11341 {
11342 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11343 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11344 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11345 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11346 },
11347 }
11348
11349 for _, tc := range testCases {
11350 preparer := android.GroupFixturePreparers(
11351 android.FixtureMergeMockFs(map[string][]byte{
11352 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11353 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011354 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011355 )
11356 ctx := testApex(t, bp, preparer)
11357
11358 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11359 }
11360}
11361
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011362func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011363 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011364 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11365 for _, moduleName := range moduleNames {
11366 ret += fmt.Sprintf(`
11367 aconfig_declarations {
11368 name: "%[1]s",
11369 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011370 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011371 srcs: [
11372 "%[1]s.aconfig",
11373 ],
11374 }
11375 java_aconfig_library {
11376 name: "%[1]s-lib",
11377 aconfig_declarations: "%[1]s",
11378 }
11379 `, moduleName)
11380 }
11381 return ret
11382 }
11383
11384 result := android.GroupFixturePreparers(
11385 prepareForApexTest,
11386 java.PrepareForTestWithJavaSdkLibraryFiles,
11387 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011388 ).RunTestWithBp(t, `
11389 java_library {
11390 name: "baz-java-lib",
11391 static_libs: [
11392 "baz-lib",
11393 ],
11394 }
11395 filegroup {
11396 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011397 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011398 ":qux-lib{.generated_srcjars}",
11399 ],
11400 }
11401 filegroup {
11402 name: "qux-another-filegroup",
11403 srcs: [
11404 ":qux-filegroup",
11405 ],
11406 }
11407 java_library {
11408 name: "quux-java-lib",
11409 srcs: [
11410 "a.java",
11411 ],
11412 libs: [
11413 "quux-lib",
11414 ],
11415 }
11416 java_sdk_library {
11417 name: "foo",
11418 srcs: [
11419 ":qux-another-filegroup",
11420 ],
11421 api_packages: ["foo"],
11422 system: {
11423 enabled: true,
11424 },
11425 module_lib: {
11426 enabled: true,
11427 },
11428 test: {
11429 enabled: true,
11430 },
11431 static_libs: [
11432 "bar-lib",
11433 ],
11434 libs: [
11435 "baz-java-lib",
11436 "quux-java-lib",
11437 ],
11438 aconfig_declarations: [
11439 "bar",
11440 ],
11441 }
11442 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11443
11444 m := result.ModuleForTests("foo.stubs.source", "android_common")
11445 outDir := "out/soong/.intermediates"
11446
11447 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11448 // textproto files
11449 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11450
11451 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11452 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11453 // to aconfig.
11454 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11455 "passed as an input",
11456 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11457
11458 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11459 // to metalava as classpath. Thus the cache file provided by the associated
11460 // aconfig_declarations module "baz" should be passed to aconfig.
11461 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11462 "java_aconfig_library passed as an input",
11463 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11464
11465 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11466 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11467 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11468 "input",
11469 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11470
11471 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11472 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11473 // aconfig_declarations module "quux" should not be passed to aconfig.
11474 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11475 "depend on java_aconfig_library not passed as an input",
11476 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11477}
Cole Faust7c991b42024-05-15 11:17:55 -070011478
11479func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011480 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011481 ctx := testApex(t, `
11482 apex {
11483 name: "myapex",
11484 key: "myapex.key",
11485 prebuilts: ["myetc", "myetc2"],
11486 min_sdk_version: "29",
11487 }
11488 apex_key {
11489 name: "myapex.key",
11490 public_key: "testkey.avbpubkey",
11491 private_key: "testkey.pem",
11492 }
11493
11494 prebuilt_etc {
11495 name: "myetc",
11496 src: "myprebuilt",
11497 filename: "myfilename",
11498 }
11499 prebuilt_etc {
11500 name: "myetc2",
11501 sub_dir: "mysubdir",
11502 src: "myprebuilt",
11503 filename: "myfilename",
11504 }
11505 `, withFiles(android.MockFS{
11506 "packages/modules/common/build/allowed_deps.txt": nil,
11507 }))
11508
11509 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11510 data := android.AndroidMkDataForTest(t, ctx, ab)
11511 var builder strings.Builder
11512 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11513 androidMk := builder.String()
11514
11515 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11516 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11517}
Spandan Das50801e22024-05-13 18:29:45 +000011518
11519func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011520 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011521 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11522 args := module.Rule("apexRule").Args
11523 optFlags := args["opt_flags"]
11524 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11525 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11526 }
11527 }
11528
11529 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11530 t.Helper()
11531 found := false
11532 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11533 if dep == wantDep {
11534 found = true
11535 }
11536 })
11537 if !found {
11538 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11539 }
11540 }
11541
11542 ctx := testApex(t, `
11543 apex {
11544 name: "com.android.apex30",
11545 min_sdk_version: "30",
11546 key: "apex30.key",
11547 java_libs: ["javalib"],
11548 }
11549
11550 java_library {
11551 name: "javalib",
11552 srcs: ["A.java"],
11553 apex_available: ["com.android.apex30"],
11554 min_sdk_version: "30",
11555 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011556 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011557 }
11558
11559 override_apex {
11560 name: "com.mycompany.android.apex30",
11561 base: "com.android.apex30",
11562 }
11563
11564 override_apex {
11565 name: "com.mycompany.android.apex31",
11566 base: "com.android.apex30",
11567 min_sdk_version: "31",
11568 }
11569
11570 apex_key {
11571 name: "apex30.key",
11572 public_key: "testkey.avbpubkey",
11573 private_key: "testkey.pem",
11574 }
11575
11576 `, android.FixtureMergeMockFs(android.MockFS{
11577 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11578 }),
11579 )
11580
11581 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11582 checkMinSdkVersion(t, baseModule, "30")
11583
11584 // Override module, but uses same min_sdk_version
11585 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11586 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11587 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11588 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11589
11590 // Override module, uses different min_sdk_version
11591 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11592 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11593 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11594 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11595}
Spandan Das0b28fa02024-05-28 23:40:17 +000011596
11597func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011598 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011599 context := android.GroupFixturePreparers(
11600 android.PrepareForIntegrationTestWithAndroid,
11601 PrepareForTestWithApexBuildComponents,
11602 android.FixtureMergeMockFs(android.MockFS{
11603 "system/sepolicy/apex/foo-file_contexts": nil,
11604 }),
11605 )
11606 res := context.RunTestWithBp(t, `
11607 apex {
11608 name: "foo",
11609 key: "myapex.key",
11610 apex_available_name: "com.android.foo",
11611 variant_version: "0",
11612 updatable: false,
11613 }
11614 apex_key {
11615 name: "myapex.key",
11616 public_key: "testkey.avbpubkey",
11617 private_key: "testkey.pem",
11618 }
11619 prebuilt_apex {
11620 name: "foo",
11621 src: "foo.apex",
11622 prefer: true,
11623 }
11624 override_apex {
11625 name: "myoverrideapex",
11626 base: "foo",
11627 }
11628 `)
11629
11630 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11631}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011632
11633func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011634 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011635 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`, `
11636 apex {
11637 name: "myapex",
11638 key: "myapex.key",
11639 updatable: true,
11640 min_sdk_version: "current",
11641 }
11642
11643 apex_key {
11644 name: "myapex.key",
11645 public_key: "testkey.avbpubkey",
11646 private_key: "testkey.pem",
11647 }
11648 `)
11649}
Spandan Das2f68f192024-07-22 19:25:50 +000011650
11651func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011652 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011653 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11654 result := android.GroupFixturePreparers(
11655 prepareForApexTest,
11656 android.PrepareForTestWithAndroidMk,
11657 android.PrepareForTestWithMakevars,
11658 android.FixtureMergeMockFs(fs),
11659 ).RunTest(t)
11660
11661 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011662 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011663
11664 installRules := result.InstallMakeRulesForTesting(t)
11665
11666 var installedlibRule *android.InstallMakeRule
11667 for i, rule := range installRules {
11668 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11669 if installedlibRule != nil {
11670 t.Errorf("Duplicate install rules for %s", rule.Target)
11671 }
11672 installedlibRule = &installRules[i]
11673 }
11674 }
11675 if installedlibRule == nil {
11676 t.Errorf("No install rule found for installedlib")
11677 return
11678 }
11679
11680 if expectLibfooOnSystemLib {
11681 android.AssertStringListContains(t,
11682 "installedlib doesn't have install dependency on libfoo impl",
11683 installedlibRule.OrderOnlyDeps,
11684 "out/target/product/test_device/system/lib/libfoo.so")
11685 } else {
11686 android.AssertStringListDoesNotContain(t,
11687 "installedlib has install dependency on libfoo stub",
11688 installedlibRule.Deps,
11689 "out/target/product/test_device/system/lib/libfoo.so")
11690 android.AssertStringListDoesNotContain(t,
11691 "installedlib has order-only install dependency on libfoo stub",
11692 installedlibRule.OrderOnlyDeps,
11693 "out/target/product/test_device/system/lib/libfoo.so")
11694 }
11695 }
11696
11697 prebuiltLibfooBp := []byte(`
11698 cc_prebuilt_library {
11699 name: "libfoo",
11700 prefer: true,
11701 srcs: ["libfoo.so"],
11702 stubs: {
11703 versions: ["1"],
11704 },
11705 apex_available: ["apexfoo"],
11706 }
11707 `)
11708
11709 apexfooBp := []byte(`
11710 apex {
11711 name: "apexfoo",
11712 key: "apexfoo.key",
11713 native_shared_libs: ["libfoo"],
11714 updatable: false,
11715 compile_multilib: "both",
11716 }
11717 apex_key {
11718 name: "apexfoo.key",
11719 public_key: "testkey.avbpubkey",
11720 private_key: "testkey.pem",
11721 }
11722 `)
11723
11724 installedlibBp := []byte(`
11725 cc_library {
11726 name: "installedlib",
11727 shared_libs: ["libfoo"],
11728 }
11729 `)
11730
11731 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011732 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011733 testFunc(
11734 t,
11735 /*expectLibfooOnSystemLib=*/ false,
11736 android.MockFS{
11737 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11738 "apexfoo/Android.bp": apexfooBp,
11739 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11740 "Android.bp": installedlibBp,
11741 },
11742 )
11743 })
11744
11745 disabledSourceLibfooBp := []byte(`
11746 cc_library {
11747 name: "libfoo",
11748 enabled: false,
11749 stubs: {
11750 versions: ["1"],
11751 },
11752 apex_available: ["apexfoo"],
11753 }
11754 `)
11755
11756 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011757 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011758 testFunc(
11759 t,
11760 /*expectLibfooOnSystemLib=*/ false,
11761 android.MockFS{
11762 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11763 "impl/Android.bp": disabledSourceLibfooBp,
11764 "apexfoo/Android.bp": apexfooBp,
11765 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11766 "Android.bp": installedlibBp,
11767 },
11768 )
11769 })
11770}
Jihoon Kange246bb72024-09-18 22:26:22 +000011771
11772func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011773 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011774 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11775 // in libs of android_app and java_library does not lead to class loader context device/host
11776 // path mismatch errors.
11777 android.GroupFixturePreparers(
11778 prepareForApexTest,
11779 android.PrepareForIntegrationTestWithAndroid,
11780 PrepareForTestWithApexBuildComponents,
11781 android.FixtureModifyEnv(func(env map[string]string) {
11782 env["DISABLE_CONTAINER_CHECK"] = "true"
11783 }),
11784 withFiles(filesForSdkLibrary),
11785 android.FixtureMergeMockFs(android.MockFS{
11786 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11787 }),
11788 ).RunTestWithBp(t, `
11789 apex {
11790 name: "com.android.foo30",
11791 key: "myapex.key",
11792 updatable: true,
11793 bootclasspath_fragments: [
11794 "foo-bootclasspath-fragment",
11795 ],
11796 java_libs: [
11797 "bar",
11798 ],
11799 apps: [
11800 "bar-app",
11801 ],
11802 min_sdk_version: "30",
11803 }
11804 apex_key {
11805 name: "myapex.key",
11806 public_key: "testkey.avbpubkey",
11807 private_key: "testkey.pem",
11808 }
11809 bootclasspath_fragment {
11810 name: "foo-bootclasspath-fragment",
11811 contents: [
11812 "framework-foo",
11813 ],
11814 apex_available: [
11815 "com.android.foo30",
11816 ],
11817 hidden_api: {
11818 split_packages: ["*"]
11819 },
11820 }
11821
11822 java_sdk_library {
11823 name: "framework-foo",
11824 srcs: [
11825 "A.java"
11826 ],
11827 unsafe_ignore_missing_latest_api: true,
11828 apex_available: [
11829 "com.android.foo30",
11830 ],
11831 compile_dex: true,
11832 sdk_version: "core_current",
11833 shared_library: false,
11834 }
11835
11836 java_library {
11837 name: "bar",
11838 srcs: [
11839 "A.java"
11840 ],
11841 libs: [
11842 "framework-foo.impl",
11843 ],
11844 apex_available: [
11845 "com.android.foo30",
11846 ],
11847 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011848 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011849 }
11850
11851 java_library {
11852 name: "baz",
11853 srcs: [
11854 "A.java"
11855 ],
11856 libs: [
11857 "bar",
11858 ],
11859 sdk_version: "core_current",
11860 }
11861
11862 android_app {
11863 name: "bar-app",
11864 srcs: [
11865 "A.java"
11866 ],
11867 libs: [
11868 "baz",
11869 "framework-foo.impl",
11870 ],
11871 apex_available: [
11872 "com.android.foo30",
11873 ],
11874 sdk_version: "core_current",
11875 min_sdk_version: "30",
11876 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011877 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011878 }
11879 `)
11880}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011881
11882// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11883func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011884 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011885 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11886 apex {
11887 name: "myapex",
11888 key: "myapex.key",
11889 systemserverclasspath_fragments: [
11890 "mysystemserverclasspathfragment",
11891 ],
11892 min_sdk_version: "29",
11893 updatable: true,
11894 system_ext_specific: true,
11895 }
11896
11897 apex_key {
11898 name: "myapex.key",
11899 public_key: "testkey.avbpubkey",
11900 private_key: "testkey.pem",
11901 }
11902
11903 java_library {
11904 name: "foo",
11905 srcs: ["b.java"],
11906 min_sdk_version: "29",
11907 installable: true,
11908 apex_available: [
11909 "myapex",
11910 ],
11911 sdk_version: "current",
11912 }
11913
11914 systemserverclasspath_fragment {
11915 name: "mysystemserverclasspathfragment",
11916 contents: [
11917 "foo",
11918 ],
11919 apex_available: [
11920 "myapex",
11921 ],
11922 }
11923 `,
11924 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11925 )
11926}
Spandan Das72d86c62024-10-15 19:27:41 +000011927
11928// partitions should not package the artifacts that are included inside the apex.
11929func TestFilesystemWithApexDeps(t *testing.T) {
11930 t.Parallel()
11931 result := testApex(t, `
11932 android_filesystem {
11933 name: "myfilesystem",
11934 deps: ["myapex"],
11935 }
11936 apex {
11937 name: "myapex",
11938 key: "myapex.key",
11939 binaries: ["binfoo"],
11940 native_shared_libs: ["libfoo"],
11941 apps: ["appfoo"],
11942 updatable: false,
11943 }
11944 apex_key {
11945 name: "myapex.key",
11946 }
11947 cc_binary {
11948 name: "binfoo",
11949 apex_available: ["myapex"],
11950 }
11951 cc_library {
11952 name: "libfoo",
11953 apex_available: ["myapex"],
11954 }
11955 android_app {
11956 name: "appfoo",
11957 sdk_version: "current",
11958 apex_available: ["myapex"],
11959 }
11960 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11961
11962 partition := result.ModuleForTests("myfilesystem", "android_common")
11963 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11964 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11965}
Colin Crossb614cd42024-10-11 12:52:21 -070011966
11967func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11968 t.Parallel()
11969
11970 extractDepenencyPathFromErrors := func(errs []error) []string {
11971 i := slices.IndexFunc(errs, func(err error) bool {
11972 return strings.Contains(err.Error(), "dependency path:")
11973 })
11974 if i < 0 {
11975 return nil
11976 }
11977 var dependencyPath []string
11978 for _, err := range errs[i+1:] {
11979 s := err.Error()
11980 lastSpace := strings.LastIndexByte(s, ' ')
11981 if lastSpace >= 0 {
11982 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11983 }
11984 }
11985 return dependencyPath
11986 }
11987
11988 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11989 return func(t *testing.T, result *android.TestResult) {
11990 t.Helper()
11991 if len(result.Errs) == 0 {
11992 t.Fatalf("expected errors")
11993 }
11994 t.Log("found errors:")
11995 for _, err := range result.Errs {
11996 t.Log(err)
11997 }
11998 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11999 t.Fatalf("expected error %q, got %q", w, g)
12000 }
12001 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12002 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12003 t.Errorf("expected dependency path %q, got %q", w, g)
12004 }
12005 }
12006 }
12007
12008 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12009 return func(bp *bpmodify.Blueprint) {
12010 m := bp.ModulesByName(module)
12011 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12012 if err != nil {
12013 panic(err)
12014 }
12015 props.AddStringToList(lib)
12016 }
12017 }
12018
12019 bpTemplate := `
12020 apex {
12021 name: "myapex",
12022 key: "myapex.key",
12023 native_shared_libs: ["mylib"],
12024 rust_dyn_libs: ["libmyrust"],
12025 binaries: ["mybin", "myrustbin"],
12026 jni_libs: ["libjni"],
12027 apps: ["myapp"],
12028 updatable: false,
12029 }
12030
12031 apex {
12032 name: "otherapex",
12033 key: "myapex.key",
12034 native_shared_libs: ["libotherapex"],
12035 updatable: false,
12036 }
12037
12038 apex_key {
12039 name: "myapex.key",
12040 public_key: "testkey.avbpubkey",
12041 private_key: "testkey.pem",
12042 }
12043
12044 cc_library {
12045 name: "mylib",
12046 srcs: ["foo.cpp"],
12047 apex_available: ["myapex"],
12048 }
12049
12050 cc_binary {
12051 name: "mybin",
12052 srcs: ["foo.cpp"],
12053 apex_available: ["myapex"],
12054 }
12055
12056 rust_library {
12057 name: "libmyrust",
12058 crate_name: "myrust",
12059 srcs: ["src/lib.rs"],
12060 rustlibs: ["libmyrust_transitive_dylib"],
12061 rlibs: ["libmyrust_transitive_rlib"],
12062 apex_available: ["myapex"],
12063 }
12064
12065 rust_library{
12066 name: "libmyrust_transitive_dylib",
12067 crate_name: "myrust_transitive_dylib",
12068 srcs: ["src/lib.rs"],
12069 apex_available: ["myapex"],
12070 }
12071
12072 rust_library {
12073 name: "libmyrust_transitive_rlib",
12074 crate_name: "myrust_transitive_rlib",
12075 srcs: ["src/lib.rs"],
12076 apex_available: ["myapex"],
12077 }
12078
12079 rust_binary {
12080 name: "myrustbin",
12081 srcs: ["src/main.rs"],
12082 apex_available: ["myapex"],
12083 }
12084
12085 cc_library {
12086 name: "libbar",
12087 sdk_version: "current",
12088 srcs: ["bar.cpp"],
12089 apex_available: ["myapex"],
12090 stl: "none",
12091 }
12092
12093 android_app {
12094 name: "myapp",
12095 jni_libs: ["libembeddedjni"],
12096 use_embedded_native_libs: true,
12097 sdk_version: "current",
12098 apex_available: ["myapex"],
12099 }
12100
12101 cc_library {
12102 name: "libembeddedjni",
12103 sdk_version: "current",
12104 srcs: ["bar.cpp"],
12105 apex_available: ["myapex"],
12106 stl: "none",
12107 }
12108
12109 cc_library {
12110 name: "libjni",
12111 sdk_version: "current",
12112 srcs: ["bar.cpp"],
12113 apex_available: ["myapex"],
12114 stl: "none",
12115 }
12116
12117 cc_library {
12118 name: "libotherapex",
12119 sdk_version: "current",
12120 srcs: ["otherapex.cpp"],
12121 apex_available: ["otherapex"],
12122 stubs: {
12123 symbol_file: "libotherapex.map.txt",
12124 versions: ["1", "2", "3"],
12125 },
12126 stl: "none",
12127 }
12128
12129 cc_library {
12130 name: "libplatform",
12131 sdk_version: "current",
12132 srcs: ["libplatform.cpp"],
12133 stubs: {
12134 symbol_file: "libplatform.map.txt",
12135 versions: ["1", "2", "3"],
12136 },
12137 stl: "none",
12138 system_shared_libs: [],
12139 }
12140 `
12141
12142 testCases := []struct {
12143 name string
12144 bpModifier func(bp *bpmodify.Blueprint)
12145 dependencyPath []string
12146 }{
12147 {
12148 name: "library dependency in other apex",
12149 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12150 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12151 },
12152 {
12153 name: "transitive library dependency in other apex",
12154 bpModifier: func(bp *bpmodify.Blueprint) {
12155 addToSharedLibs("mylib", "libbar")(bp)
12156 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12157 },
12158 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12159 },
12160 {
12161 name: "library dependency in platform",
12162 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12163 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12164 },
12165 {
12166 name: "jni library dependency in other apex",
12167 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12168 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12169 },
12170 {
12171 name: "transitive jni library dependency in other apex",
12172 bpModifier: func(bp *bpmodify.Blueprint) {
12173 addToSharedLibs("libjni", "libbar")(bp)
12174 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12175 },
12176 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12177 },
12178 {
12179 name: "jni library dependency in platform",
12180 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12181 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12182 },
12183 {
12184 name: "transitive jni library dependency in platform",
12185 bpModifier: func(bp *bpmodify.Blueprint) {
12186 addToSharedLibs("libjni", "libbar")(bp)
12187 addToSharedLibs("libbar", "libplatform#impl")(bp)
12188 },
12189 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12190 },
Spandan Das10c41362024-12-03 01:33:09 +000012191 {
12192 name: "app jni library dependency in other apex",
12193 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12194 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12195 },
12196 {
12197 name: "transitive app jni library dependency in other apex",
12198 bpModifier: func(bp *bpmodify.Blueprint) {
12199 addToSharedLibs("libembeddedjni", "libbar")(bp)
12200 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12201 },
12202 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12203 },
12204 {
12205 name: "app jni library dependency in platform",
12206 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12207 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12208 },
12209 {
12210 name: "transitive app jni library dependency in platform",
12211 bpModifier: func(bp *bpmodify.Blueprint) {
12212 addToSharedLibs("libembeddedjni", "libbar")(bp)
12213 addToSharedLibs("libbar", "libplatform#impl")(bp)
12214 },
12215 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12216 },
Colin Crossb614cd42024-10-11 12:52:21 -070012217 {
12218 name: "binary dependency in other apex",
12219 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12220 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12221 },
12222 {
12223 name: "transitive binary dependency in other apex",
12224 bpModifier: func(bp *bpmodify.Blueprint) {
12225 addToSharedLibs("mybin", "libbar")(bp)
12226 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12227 },
12228 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12229 },
12230 {
12231 name: "binary dependency in platform",
12232 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12233 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12234 },
12235 {
12236 name: "transitive binary dependency in platform",
12237 bpModifier: func(bp *bpmodify.Blueprint) {
12238 addToSharedLibs("mybin", "libbar")(bp)
12239 addToSharedLibs("libbar", "libplatform#impl")(bp)
12240 },
12241 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12242 },
12243
12244 {
12245 name: "rust library dependency in other apex",
12246 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12247 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12248 },
12249 {
12250 name: "transitive rust library dependency in other apex",
12251 bpModifier: func(bp *bpmodify.Blueprint) {
12252 addToSharedLibs("libmyrust", "libbar")(bp)
12253 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12254 },
12255 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12256 },
12257 {
12258 name: "rust library dependency in platform",
12259 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12260 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12261 },
12262 {
12263 name: "transitive rust library dependency in platform",
12264 bpModifier: func(bp *bpmodify.Blueprint) {
12265 addToSharedLibs("libmyrust", "libbar")(bp)
12266 addToSharedLibs("libbar", "libplatform#impl")(bp)
12267 },
12268 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12269 },
12270 {
12271 name: "transitive rust library dylib dependency in other apex",
12272 bpModifier: func(bp *bpmodify.Blueprint) {
12273 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12274 },
12275 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12276 },
12277 {
12278 name: "transitive rust library dylib dependency in platform",
12279 bpModifier: func(bp *bpmodify.Blueprint) {
12280 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12281 },
12282 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12283 },
12284 {
12285 name: "transitive rust library rlib dependency in other apex",
12286 bpModifier: func(bp *bpmodify.Blueprint) {
12287 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12288 },
12289 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12290 },
12291 {
12292 name: "transitive rust library rlib dependency in platform",
12293 bpModifier: func(bp *bpmodify.Blueprint) {
12294 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12295 },
12296 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12297 },
12298 {
12299 name: "rust binary dependency in other apex",
12300 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12301 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12302 },
12303 {
12304 name: "transitive rust binary dependency in other apex",
12305 bpModifier: func(bp *bpmodify.Blueprint) {
12306 addToSharedLibs("myrustbin", "libbar")(bp)
12307 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12308 },
12309 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12310 },
12311 {
12312 name: "rust binary dependency in platform",
12313 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12314 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12315 },
12316 {
12317 name: "transitive rust binary dependency in platform",
12318 bpModifier: func(bp *bpmodify.Blueprint) {
12319 addToSharedLibs("myrustbin", "libbar")(bp)
12320 addToSharedLibs("libbar", "libplatform#impl")(bp)
12321 },
12322 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12323 },
12324 }
12325
12326 for _, testCase := range testCases {
12327 t.Run(testCase.name, func(t *testing.T) {
12328 t.Parallel()
12329 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12330 if err != nil {
12331 t.Fatal(err)
12332 }
12333 if testCase.bpModifier != nil {
12334 func() {
12335 defer func() {
12336 if r := recover(); r != nil {
12337 t.Fatalf("panic in bpModifier: %v", r)
12338 }
12339 }()
12340 testCase.bpModifier(bp)
12341 }()
12342 }
12343 android.GroupFixturePreparers(
12344 android.PrepareForTestWithAndroidBuildComponents,
12345 cc.PrepareForTestWithCcBuildComponents,
12346 java.PrepareForTestWithDexpreopt,
12347 rust.PrepareForTestWithRustDefaultModules,
12348 PrepareForTestWithApexBuildComponents,
12349 prepareForTestWithMyapex,
12350 prepareForTestWithOtherapex,
12351 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12352 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12353 }),
12354 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12355 RunTestWithBp(t, bp.String())
12356 })
12357 }
12358}