blob: 465789c1289588d399f9a83fb27f77f1ced5dc1c [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
Chan Wanga8c8e202025-01-10 10:23:21 +00002132func TestTrackAllowedDepsForAndroidApex(t *testing.T) {
2133 t.Parallel()
2134 ctx := testApex(t, `
2135 apex {
2136 name: "com.android.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: ["com.android.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: ["com.android.myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }),
2181 android.FixtureMergeMockFs(android.MockFS{
2182 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2183 }))
2184
2185 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2186 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2187
2188 android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs,
2189 "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt")
2190 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2191 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2192
2193 myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex")
2194 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2195 myapex.Output("depsinfo/flatlist.txt")), "\n")
2196 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2197 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2198 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2199 flatlist, "mylib:(minSdkVersion:29)")
2200 android.AssertStringListContains(t, "track platform-available lib",
2201 flatlist, "yourlib(minSdkVersion:29)")
2202}
2203
2204func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002205 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002206 ctx := testApex(t, `
2207 apex {
2208 name: "myapex",
2209 key: "myapex.key",
2210 updatable: true,
2211 native_shared_libs: [
2212 "mylib",
2213 "yourlib",
2214 ],
2215 min_sdk_version: "29",
2216 }
2217
2218 apex {
2219 name: "myapex2",
2220 key: "myapex.key",
2221 updatable: false,
2222 native_shared_libs: ["yourlib"],
2223 }
2224
2225 apex_key {
2226 name: "myapex.key",
2227 public_key: "testkey.avbpubkey",
2228 private_key: "testkey.pem",
2229 }
2230
2231 cc_library {
2232 name: "mylib",
2233 srcs: ["mylib.cpp"],
2234 shared_libs: ["libbar"],
2235 min_sdk_version: "29",
2236 apex_available: ["myapex"],
2237 }
2238
2239 cc_library {
2240 name: "libbar",
2241 stubs: { versions: ["29", "30"] },
2242 }
2243
2244 cc_library {
2245 name: "yourlib",
2246 srcs: ["mylib.cpp"],
2247 min_sdk_version: "29",
2248 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2249 }
2250 `, withFiles(android.MockFS{
2251 "packages/modules/common/build/allowed_deps.txt": nil,
2252 }))
2253
2254 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2255 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Chan Wanga8c8e202025-01-10 10:23:21 +00002256 android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002257 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002258 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002259 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002260}
2261
2262func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002263 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002264 ctx := testApex(t, `
2265 apex {
Chan Wanga8c8e202025-01-10 10:23:21 +00002266 name: "com.android.myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002267 key: "myapex.key",
2268 updatable: true,
2269 min_sdk_version: "29",
2270 }
2271
2272 apex_key {
2273 name: "myapex.key",
2274 public_key: "testkey.avbpubkey",
2275 private_key: "testkey.pem",
2276 }
Chan Wanga8c8e202025-01-10 10:23:21 +00002277 `,
2278 android.FixtureMergeMockFs(android.MockFS{
2279 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2280 }))
Jooyung Han4495f842023-04-25 16:39:59 +09002281 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2282 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2283 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2284 }
2285}
2286
Jooyung Han03b51852020-02-26 22:45:42 +09002287func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002288 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002289 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002290 apex {
2291 name: "myapex",
2292 key: "myapex.key",
2293 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002294 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002295 }
2296
2297 apex_key {
2298 name: "myapex.key",
2299 public_key: "testkey.avbpubkey",
2300 private_key: "testkey.pem",
2301 }
2302
2303 cc_library {
2304 name: "libx",
2305 system_shared_libs: [],
2306 stl: "none",
2307 apex_available: [ "myapex" ],
2308 stubs: {
2309 versions: ["1", "2"],
2310 },
2311 }
2312
2313 cc_library {
2314 name: "libz",
2315 shared_libs: ["libx"],
2316 system_shared_libs: [],
2317 stl: "none",
2318 }
2319 `)
2320
2321 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002322 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002323 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2324 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2325 }
2326 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002327 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002328 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2329 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2330 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002331 expectLink("libz", "shared", "libx", "shared_current")
2332 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002333 expectNoLink("libz", "shared", "libz", "shared_1")
2334 expectNoLink("libz", "shared", "libz", "shared")
2335}
2336
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002337var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2338 func(variables android.FixtureProductVariables) {
2339 variables.SanitizeDevice = []string{"hwaddress"}
2340 },
2341)
2342
Jooyung Han75568392020-03-20 04:29:24 +09002343func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002344 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002345 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002346 apex {
2347 name: "myapex",
2348 key: "myapex.key",
2349 native_shared_libs: ["libx"],
2350 min_sdk_version: "29",
2351 }
2352
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358
2359 cc_library {
2360 name: "libx",
2361 shared_libs: ["libbar"],
2362 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002363 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002364 }
2365
2366 cc_library {
2367 name: "libbar",
2368 stubs: {
2369 versions: ["29", "30"],
2370 },
2371 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002372 `,
2373 prepareForTestWithSantitizeHwaddress,
2374 )
Jooyung Han03b51852020-02-26 22:45:42 +09002375 expectLink := func(from, from_variant, to, to_variant string) {
2376 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2377 libFlags := ld.Args["libFlags"]
2378 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2379 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002380 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002381}
2382
Jooyung Han75568392020-03-20 04:29:24 +09002383func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002384 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002385 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002386 apex {
2387 name: "myapex",
2388 key: "myapex.key",
2389 native_shared_libs: ["libx"],
2390 min_sdk_version: "29",
2391 }
2392
2393 apex_key {
2394 name: "myapex.key",
2395 public_key: "testkey.avbpubkey",
2396 private_key: "testkey.pem",
2397 }
2398
2399 cc_library {
2400 name: "libx",
2401 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002402 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002403 }
Jooyung Han75568392020-03-20 04:29:24 +09002404 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002405
2406 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002407 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002408 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002409 // note that platform variant is not.
2410 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002411 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002412}
2413
Jooyung Han749dc692020-04-15 11:03:39 +09002414func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002415 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002416 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002417 apex {
2418 name: "myapex",
2419 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002420 native_shared_libs: ["mylib"],
2421 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002422 }
2423
2424 apex_key {
2425 name: "myapex.key",
2426 public_key: "testkey.avbpubkey",
2427 private_key: "testkey.pem",
2428 }
Jooyung Han749dc692020-04-15 11:03:39 +09002429
2430 cc_library {
2431 name: "mylib",
2432 srcs: ["mylib.cpp"],
2433 system_shared_libs: [],
2434 stl: "none",
2435 apex_available: [
2436 "myapex",
2437 ],
2438 min_sdk_version: "30",
2439 }
2440 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002441
2442 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2443 apex {
2444 name: "myapex",
2445 key: "myapex.key",
2446 native_shared_libs: ["libfoo.ffi"],
2447 min_sdk_version: "29",
2448 }
2449
2450 apex_key {
2451 name: "myapex.key",
2452 public_key: "testkey.avbpubkey",
2453 private_key: "testkey.pem",
2454 }
2455
2456 rust_ffi_shared {
2457 name: "libfoo.ffi",
2458 srcs: ["foo.rs"],
2459 crate_name: "foo",
2460 apex_available: [
2461 "myapex",
2462 ],
2463 min_sdk_version: "30",
2464 }
2465 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002466
2467 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 java_libs: ["libfoo"],
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 java_import {
2482 name: "libfoo",
2483 jars: ["libfoo.jar"],
2484 apex_available: [
2485 "myapex",
2486 ],
2487 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002488 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002489 }
2490 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002491
2492 // Skip check for modules compiling against core API surface
2493 testApex(t, `
2494 apex {
2495 name: "myapex",
2496 key: "myapex.key",
2497 java_libs: ["libfoo"],
2498 min_sdk_version: "29",
2499 }
2500
2501 apex_key {
2502 name: "myapex.key",
2503 public_key: "testkey.avbpubkey",
2504 private_key: "testkey.pem",
2505 }
2506
2507 java_library {
2508 name: "libfoo",
2509 srcs: ["Foo.java"],
2510 apex_available: [
2511 "myapex",
2512 ],
2513 // Compile against core API surface
2514 sdk_version: "core_current",
2515 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002516 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002517 }
2518 `)
2519
Jooyung Han749dc692020-04-15 11:03:39 +09002520}
2521
2522func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002523 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002524 testApex(t, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["libfoo"],
2529 java_libs: ["libbar"],
2530 min_sdk_version: "29",
2531 }
2532
2533 apex_key {
2534 name: "myapex.key",
2535 public_key: "testkey.avbpubkey",
2536 private_key: "testkey.pem",
2537 }
2538
2539 cc_library {
2540 name: "libfoo",
2541 srcs: ["mylib.cpp"],
2542 shared_libs: ["libfoo_dep"],
2543 apex_available: ["myapex"],
2544 min_sdk_version: "29",
2545 }
2546
2547 cc_library {
2548 name: "libfoo_dep",
2549 srcs: ["mylib.cpp"],
2550 apex_available: ["myapex"],
2551 min_sdk_version: "29",
2552 }
2553
2554 java_library {
2555 name: "libbar",
2556 sdk_version: "current",
2557 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002558 static_libs: [
2559 "libbar_dep",
2560 "libbar_import_dep",
2561 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002562 apex_available: ["myapex"],
2563 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002564 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002565 }
2566
2567 java_library {
2568 name: "libbar_dep",
2569 sdk_version: "current",
2570 srcs: ["a.java"],
2571 apex_available: ["myapex"],
2572 min_sdk_version: "29",
2573 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002574
2575 java_import {
2576 name: "libbar_import_dep",
2577 jars: ["libbar.jar"],
2578 apex_available: ["myapex"],
2579 min_sdk_version: "29",
2580 }
Jooyung Han03b51852020-02-26 22:45:42 +09002581 `)
2582}
2583
Colin Cross8ca61c12022-10-06 21:00:14 -07002584func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002585 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002586 // Tests that an apex dependency with min_sdk_version higher than the
2587 // min_sdk_version of the apex is allowed as long as the dependency's
2588 // min_sdk_version is less than or equal to the api level that the
2589 // architecture was introduced in. In this case, arm64 didn't exist
2590 // until api level 21, so the arm64 code will never need to run on
2591 // an api level 20 device, even if other architectures of the apex
2592 // will.
2593 testApex(t, `
2594 apex {
2595 name: "myapex",
2596 key: "myapex.key",
2597 native_shared_libs: ["libfoo"],
2598 min_sdk_version: "20",
2599 }
2600
2601 apex_key {
2602 name: "myapex.key",
2603 public_key: "testkey.avbpubkey",
2604 private_key: "testkey.pem",
2605 }
2606
2607 cc_library {
2608 name: "libfoo",
2609 srcs: ["mylib.cpp"],
2610 apex_available: ["myapex"],
2611 min_sdk_version: "21",
2612 stl: "none",
2613 }
2614 `)
2615}
2616
Artur Satayev8cf899a2020-04-15 17:29:42 +01002617func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002618 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002619 testCases := []struct {
2620 name string
2621 expectedError string
2622 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002623 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002624 }{
2625 {
2626 name: "Non-updatable apex with non-stable dep",
2627 bp: `
2628 apex {
2629 name: "myapex",
2630 java_libs: ["myjar"],
2631 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002632 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 java_library {
2640 name: "myjar",
2641 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002642 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002643 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002644 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002645 }
2646 `,
2647 },
2648 {
2649 name: "Updatable apex with stable dep",
2650 bp: `
2651 apex {
2652 name: "myapex",
2653 java_libs: ["myjar"],
2654 key: "myapex.key",
2655 updatable: true,
2656 min_sdk_version: "29",
2657 }
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663 java_library {
2664 name: "myjar",
2665 srcs: ["foo/bar/MyClass.java"],
2666 sdk_version: "current",
2667 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002668 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002669 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002670 }
2671 `,
2672 },
2673 {
2674 name: "Updatable apex with non-stable dep",
2675 expectedError: "cannot depend on \"myjar\"",
2676 bp: `
2677 apex {
2678 name: "myapex",
2679 java_libs: ["myjar"],
2680 key: "myapex.key",
2681 updatable: true,
2682 }
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688 java_library {
2689 name: "myjar",
2690 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002691 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002692 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002693 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002694 }
2695 `,
2696 },
2697 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002698 name: "Updatable apex with non-stable legacy core platform dep",
2699 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2700 bp: `
2701 apex {
2702 name: "myapex",
2703 java_libs: ["myjar-uses-legacy"],
2704 key: "myapex.key",
2705 updatable: true,
2706 }
2707 apex_key {
2708 name: "myapex.key",
2709 public_key: "testkey.avbpubkey",
2710 private_key: "testkey.pem",
2711 }
2712 java_library {
2713 name: "myjar-uses-legacy",
2714 srcs: ["foo/bar/MyClass.java"],
2715 sdk_version: "core_platform",
2716 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002717 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002718 }
2719 `,
2720 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2721 },
2722 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002723 name: "Updatable apex with non-stable transitive dep",
2724 // This is not actually detecting that the transitive dependency is unstable, rather it is
2725 // detecting that the transitive dependency is building against a wider API surface than the
2726 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002727 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002728 bp: `
2729 apex {
2730 name: "myapex",
2731 java_libs: ["myjar"],
2732 key: "myapex.key",
2733 updatable: true,
2734 }
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740 java_library {
2741 name: "myjar",
2742 srcs: ["foo/bar/MyClass.java"],
2743 sdk_version: "current",
2744 apex_available: ["myapex"],
2745 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002746 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002747 }
2748 java_library {
2749 name: "transitive-jar",
2750 srcs: ["foo/bar/MyClass.java"],
2751 sdk_version: "core_platform",
2752 apex_available: ["myapex"],
2753 }
2754 `,
2755 },
2756 }
2757
2758 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002759 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2760 continue
2761 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002762 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002763 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002764 errorHandler := android.FixtureExpectsNoErrors
2765 if test.expectedError != "" {
2766 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002767 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002768 android.GroupFixturePreparers(
2769 java.PrepareForTestWithJavaDefaultModules,
2770 PrepareForTestWithApexBuildComponents,
2771 prepareForTestWithMyapex,
2772 android.OptionalFixturePreparer(test.preparer),
2773 ).
2774 ExtendWithErrorHandler(errorHandler).
2775 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002776 })
2777 }
2778}
2779
Jooyung Han749dc692020-04-15 11:03:39 +09002780func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2781 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2782 apex {
2783 name: "myapex",
2784 key: "myapex.key",
2785 native_shared_libs: ["mylib"],
2786 min_sdk_version: "29",
2787 }
2788
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794
2795 cc_library {
2796 name: "mylib",
2797 srcs: ["mylib.cpp"],
2798 shared_libs: ["mylib2"],
2799 system_shared_libs: [],
2800 stl: "none",
2801 apex_available: [
2802 "myapex",
2803 ],
2804 min_sdk_version: "29",
2805 }
2806
2807 // indirect part of the apex
2808 cc_library {
2809 name: "mylib2",
2810 srcs: ["mylib.cpp"],
2811 system_shared_libs: [],
2812 stl: "none",
2813 apex_available: [
2814 "myapex",
2815 ],
2816 min_sdk_version: "30",
2817 }
2818 `)
2819}
2820
2821func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002822 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002823 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2824 apex {
2825 name: "myapex",
2826 key: "myapex.key",
2827 apps: ["AppFoo"],
2828 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002829 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002830 }
2831
2832 apex_key {
2833 name: "myapex.key",
2834 public_key: "testkey.avbpubkey",
2835 private_key: "testkey.pem",
2836 }
2837
2838 android_app {
2839 name: "AppFoo",
2840 srcs: ["foo/bar/MyClass.java"],
2841 sdk_version: "current",
2842 min_sdk_version: "29",
2843 system_modules: "none",
2844 stl: "none",
2845 static_libs: ["bar"],
2846 apex_available: [ "myapex" ],
2847 }
2848
2849 java_library {
2850 name: "bar",
2851 sdk_version: "current",
2852 srcs: ["a.java"],
2853 apex_available: [ "myapex" ],
2854 }
2855 `)
2856}
2857
2858func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002859 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002860 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002861 apex {
2862 name: "myapex",
2863 key: "myapex.key",
2864 native_shared_libs: ["mylib"],
2865 min_sdk_version: "29",
2866 }
2867
2868 apex_key {
2869 name: "myapex.key",
2870 public_key: "testkey.avbpubkey",
2871 private_key: "testkey.pem",
2872 }
2873
Colin Crossea91a172024-11-05 16:14:05 -08002874 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002875 cc_library {
2876 name: "mylib",
2877 srcs: ["mylib.cpp"],
2878 shared_libs: ["mylib2"],
2879 system_shared_libs: [],
2880 stl: "none",
2881 apex_available: ["myapex", "otherapex"],
2882 min_sdk_version: "29",
2883 }
2884
2885 cc_library {
2886 name: "mylib2",
2887 srcs: ["mylib.cpp"],
2888 system_shared_libs: [],
2889 stl: "none",
2890 apex_available: ["otherapex"],
2891 stubs: { versions: ["29", "30"] },
2892 min_sdk_version: "30",
2893 }
2894
2895 apex {
2896 name: "otherapex",
2897 key: "myapex.key",
2898 native_shared_libs: ["mylib", "mylib2"],
2899 min_sdk_version: "30",
2900 }
2901 `)
2902 expectLink := func(from, from_variant, to, to_variant string) {
2903 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2904 libFlags := ld.Args["libFlags"]
2905 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2906 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002907 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002908 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002909}
2910
Jooyung Haned124c32021-01-26 11:43:46 +09002911func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002912 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002913 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2914 func(variables android.FixtureProductVariables) {
2915 variables.Platform_sdk_codename = proptools.StringPtr("S")
2916 variables.Platform_version_active_codenames = []string{"S"}
2917 },
2918 )
Jooyung Haned124c32021-01-26 11:43:46 +09002919 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2920 apex {
2921 name: "myapex",
2922 key: "myapex.key",
2923 native_shared_libs: ["libfoo"],
2924 min_sdk_version: "S",
2925 }
2926 apex_key {
2927 name: "myapex.key",
2928 public_key: "testkey.avbpubkey",
2929 private_key: "testkey.pem",
2930 }
2931 cc_library {
2932 name: "libfoo",
2933 shared_libs: ["libbar"],
2934 apex_available: ["myapex"],
2935 min_sdk_version: "29",
2936 }
2937 cc_library {
2938 name: "libbar",
2939 apex_available: ["myapex"],
2940 }
2941 `, withSAsActiveCodeNames)
2942}
2943
2944func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002945 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002946 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2947 variables.Platform_sdk_codename = proptools.StringPtr("S")
2948 variables.Platform_version_active_codenames = []string{"S", "T"}
2949 })
Colin Cross1c460562021-02-16 17:55:47 -08002950 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002951 apex {
2952 name: "myapex",
2953 key: "myapex.key",
2954 native_shared_libs: ["libfoo"],
2955 min_sdk_version: "S",
2956 }
2957 apex_key {
2958 name: "myapex.key",
2959 public_key: "testkey.avbpubkey",
2960 private_key: "testkey.pem",
2961 }
2962 cc_library {
2963 name: "libfoo",
2964 shared_libs: ["libbar"],
2965 apex_available: ["myapex"],
2966 min_sdk_version: "S",
2967 }
2968 cc_library {
2969 name: "libbar",
2970 stubs: {
2971 symbol_file: "libbar.map.txt",
2972 versions: ["30", "S", "T"],
2973 },
2974 }
2975 `, withSAsActiveCodeNames)
2976
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002977 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002978 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2979 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002980 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002981}
2982
Jiyong Park7c2ee712018-12-07 00:42:25 +09002983func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002984 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002985 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002986 apex {
2987 name: "myapex",
2988 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002989 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002990 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002991 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002992 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002993 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002994 }
2995
2996 apex_key {
2997 name: "myapex.key",
2998 public_key: "testkey.avbpubkey",
2999 private_key: "testkey.pem",
3000 }
3001
3002 prebuilt_etc {
3003 name: "myetc",
3004 src: "myprebuilt",
3005 sub_dir: "foo/bar",
3006 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003007
3008 cc_library {
3009 name: "mylib",
3010 srcs: ["mylib.cpp"],
3011 relative_install_path: "foo/bar",
3012 system_shared_libs: [],
3013 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003014 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003015 }
3016
3017 cc_binary {
3018 name: "mybin",
3019 srcs: ["mylib.cpp"],
3020 relative_install_path: "foo/bar",
3021 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003022 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003023 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003024 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003025
3026 rust_binary {
3027 name: "mybin.rust",
3028 srcs: ["foo.rs"],
3029 relative_install_path: "rust_subdir",
3030 apex_available: [ "myapex" ],
3031 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003032 `)
3033
Jooyung Hana0503a52023-08-23 13:12:50 +09003034 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003035 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003036
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003037 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003038 ensureContains(t, cmd, "/etc ")
3039 ensureContains(t, cmd, "/etc/foo ")
3040 ensureContains(t, cmd, "/etc/foo/bar ")
3041 ensureContains(t, cmd, "/lib64 ")
3042 ensureContains(t, cmd, "/lib64/foo ")
3043 ensureContains(t, cmd, "/lib64/foo/bar ")
3044 ensureContains(t, cmd, "/lib ")
3045 ensureContains(t, cmd, "/lib/foo ")
3046 ensureContains(t, cmd, "/lib/foo/bar ")
3047 ensureContains(t, cmd, "/bin ")
3048 ensureContains(t, cmd, "/bin/foo ")
3049 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003050 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003051}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003052
Jooyung Han35155c42020-02-06 17:33:20 +09003053func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003054 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003055 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003056 apex {
3057 name: "myapex",
3058 key: "myapex.key",
3059 multilib: {
3060 both: {
3061 native_shared_libs: ["mylib"],
3062 binaries: ["mybin"],
3063 },
3064 },
3065 compile_multilib: "both",
3066 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003067 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003068 }
3069
3070 apex_key {
3071 name: "myapex.key",
3072 public_key: "testkey.avbpubkey",
3073 private_key: "testkey.pem",
3074 }
3075
3076 cc_library {
3077 name: "mylib",
3078 relative_install_path: "foo/bar",
3079 system_shared_libs: [],
3080 stl: "none",
3081 apex_available: [ "myapex" ],
3082 native_bridge_supported: true,
3083 }
3084
3085 cc_binary {
3086 name: "mybin",
3087 relative_install_path: "foo/bar",
3088 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003089 stl: "none",
3090 apex_available: [ "myapex" ],
3091 native_bridge_supported: true,
3092 compile_multilib: "both", // default is "first" for binary
3093 multilib: {
3094 lib64: {
3095 suffix: "64",
3096 },
3097 },
3098 }
Spandan Das45e40012024-12-02 22:45:48 +00003099 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003100 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003101 "bin/foo/bar/mybin",
3102 "bin/foo/bar/mybin64",
3103 "bin/arm/foo/bar/mybin",
3104 "bin/arm64/foo/bar/mybin64",
3105 "lib/foo/bar/mylib.so",
3106 "lib/arm/foo/bar/mylib.so",
3107 "lib64/foo/bar/mylib.so",
3108 "lib64/arm64/foo/bar/mylib.so",
3109 })
3110}
3111
Jooyung Han85d61762020-06-24 23:50:26 +09003112func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003113 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003114 result := android.GroupFixturePreparers(
3115 prepareForApexTest,
3116 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3117 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003118 apex {
3119 name: "myapex",
3120 key: "myapex.key",
3121 binaries: ["mybin"],
3122 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003123 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003124 }
3125 apex_key {
3126 name: "myapex.key",
3127 public_key: "testkey.avbpubkey",
3128 private_key: "testkey.pem",
3129 }
3130 cc_binary {
3131 name: "mybin",
3132 vendor: true,
3133 shared_libs: ["libfoo"],
3134 }
3135 cc_library {
3136 name: "libfoo",
3137 proprietary: true,
3138 }
3139 `)
3140
Jooyung Hana0503a52023-08-23 13:12:50 +09003141 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003142 "bin/mybin",
3143 "lib64/libfoo.so",
3144 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3145 "lib64/libc++.so",
3146 })
3147
Jooyung Hana0503a52023-08-23 13:12:50 +09003148 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003149 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003150 name := apexBundle.BaseModuleName()
3151 prefix := "TARGET_"
3152 var builder strings.Builder
3153 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003154 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003155 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003156 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003157
Jooyung Hana0503a52023-08-23 13:12:50 +09003158 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003159 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3160 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003161}
3162
Justin Yun13decfb2021-03-08 19:25:55 +09003163func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003164 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003165 ctx := testApex(t, `
3166 apex {
3167 name: "myapex",
3168 key: "myapex.key",
3169 updatable: false,
3170 product_specific: true,
3171 binaries: ["foo"],
3172 }
3173
3174 apex_key {
3175 name: "myapex.key",
3176 public_key: "testkey.avbpubkey",
3177 private_key: "testkey.pem",
3178 }
3179
3180 cc_binary {
3181 name: "foo",
3182 product_available: true,
3183 apex_available: ["myapex"],
3184 srcs: ["foo.cpp"],
3185 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003186 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003187
3188 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003189 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003190 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3191 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3192 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3193 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3194}
3195
Jooyung Han8e5685d2020-09-21 11:02:57 +09003196func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003197 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003198 testCases := []struct {
3199 name string
3200 additionalProp string
3201 }{
3202 {"system apex with prebuilt_firmware", ""},
3203 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3204 }
3205 for _, tc := range testCases {
3206 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003207 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003208 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003209 apex {
3210 name: "myapex",
3211 key: "myapex.key",
3212 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003213 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003214 `+tc.additionalProp+`
3215 }
3216 apex_key {
3217 name: "myapex.key",
3218 public_key: "testkey.avbpubkey",
3219 private_key: "testkey.pem",
3220 }
3221 prebuilt_firmware {
3222 name: "myfirmware",
3223 src: "myfirmware.bin",
3224 filename_from_src: true,
3225 `+tc.additionalProp+`
3226 }
3227 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003228 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003229 "etc/firmware/myfirmware.bin",
3230 })
3231 })
3232 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003233}
3234
Jooyung Hanefb184e2020-06-25 17:14:25 +09003235func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003236 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003237 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003238 apex {
3239 name: "myapex",
3240 key: "myapex.key",
3241 vendor: true,
3242 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003243 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
3252 cc_library {
3253 name: "mylib",
3254 vendor_available: true,
3255 }
3256 `)
3257
Jooyung Hana0503a52023-08-23 13:12:50 +09003258 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003259 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003260 name := apexBundle.BaseModuleName()
3261 prefix := "TARGET_"
3262 var builder strings.Builder
3263 data.Custom(&builder, name, prefix, "", data)
3264 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003265 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 +09003266}
3267
Jooyung Han2ed99d02020-06-24 23:26:26 +09003268func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003269 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003270 apex {
3271 name: "myapex",
3272 key: "myapex.key",
3273 vintf_fragments: ["fragment.xml"],
3274 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003275 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003276 }
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282 cc_binary {
3283 name: "mybin",
3284 }
3285 `)
3286
Jooyung Hana0503a52023-08-23 13:12:50 +09003287 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003288 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003289 name := apexBundle.BaseModuleName()
3290 prefix := "TARGET_"
3291 var builder strings.Builder
3292 data.Custom(&builder, name, prefix, "", data)
3293 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003294 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003295 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003296}
3297
Jiyong Park16e91a02018-12-20 18:18:08 +09003298func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003299 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003300 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003301 apex {
3302 name: "myapex",
3303 key: "myapex.key",
3304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003305 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003306 }
3307
3308 apex_key {
3309 name: "myapex.key",
3310 public_key: "testkey.avbpubkey",
3311 private_key: "testkey.pem",
3312 }
3313
3314 cc_library {
3315 name: "mylib",
3316 srcs: ["mylib.cpp"],
3317 system_shared_libs: [],
3318 stl: "none",
3319 stubs: {
3320 versions: ["1", "2", "3"],
3321 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003322 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003323 }
3324
3325 cc_binary {
3326 name: "not_in_apex",
3327 srcs: ["mylib.cpp"],
3328 static_libs: ["mylib"],
3329 static_executable: true,
3330 system_shared_libs: [],
3331 stl: "none",
3332 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003333 `)
3334
Colin Cross7113d202019-11-20 16:39:12 -08003335 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003336
3337 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003338 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003339}
Jiyong Park9335a262018-12-24 11:31:58 +09003340
3341func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003342 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003343 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003344 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003345 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003346 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003347 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003348 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003349 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003350 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003351 }
3352
3353 cc_library {
3354 name: "mylib",
3355 srcs: ["mylib.cpp"],
3356 system_shared_libs: [],
3357 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003358 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003359 }
3360
3361 apex_key {
3362 name: "myapex.key",
3363 public_key: "testkey.avbpubkey",
3364 private_key: "testkey.pem",
3365 }
3366
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003367 android_app_certificate {
3368 name: "myapex.certificate",
3369 certificate: "testkey",
3370 }
3371
3372 android_app_certificate {
3373 name: "myapex.certificate.override",
3374 certificate: "testkey.override",
3375 }
3376
Jiyong Park9335a262018-12-24 11:31:58 +09003377 `)
3378
3379 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003380 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003381
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003382 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3383 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003384 "vendor/foo/devkeys/testkey.avbpubkey")
3385 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003386 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3387 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003388 "vendor/foo/devkeys/testkey.pem")
3389 }
3390
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003391 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003392 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003393 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003394 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003395 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003396 }
3397}
Jiyong Park58e364a2019-01-19 19:24:06 +09003398
Jooyung Hanf121a652019-12-17 14:30:11 +09003399func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003400 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003401 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003402 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003403 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003404 apex {
3405 name: "myapex",
3406 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003407 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003408 }
3409 apex_key {
3410 name: "myapex.key",
3411 public_key: "testkey.avbpubkey",
3412 private_key: "testkey.pem",
3413 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003414 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003415 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3416 if actual := rule.Args["certificates"]; actual != expected {
3417 t.Errorf("certificates should be %q, not %q", expected, actual)
3418 }
3419 })
3420 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003421 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003422 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003423 apex {
3424 name: "myapex_keytest",
3425 key: "myapex.key",
3426 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003427 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003428 }
3429 apex_key {
3430 name: "myapex.key",
3431 public_key: "testkey.avbpubkey",
3432 private_key: "testkey.pem",
3433 }
3434 android_app_certificate {
3435 name: "myapex.certificate.override",
3436 certificate: "testkey.override",
3437 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003438 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003439 expected := "testkey.override.x509.pem testkey.override.pk8"
3440 if actual := rule.Args["certificates"]; actual != expected {
3441 t.Errorf("certificates should be %q, not %q", expected, actual)
3442 }
3443 })
3444 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003445 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003446 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 apex {
3448 name: "myapex",
3449 key: "myapex.key",
3450 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003451 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003452 }
3453 apex_key {
3454 name: "myapex.key",
3455 public_key: "testkey.avbpubkey",
3456 private_key: "testkey.pem",
3457 }
3458 android_app_certificate {
3459 name: "myapex.certificate",
3460 certificate: "testkey",
3461 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003462 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003463 expected := "testkey.x509.pem testkey.pk8"
3464 if actual := rule.Args["certificates"]; actual != expected {
3465 t.Errorf("certificates should be %q, not %q", expected, actual)
3466 }
3467 })
3468 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003469 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003470 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003471 apex {
3472 name: "myapex_keytest",
3473 key: "myapex.key",
3474 file_contexts: ":myapex-file_contexts",
3475 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003476 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003477 }
3478 apex_key {
3479 name: "myapex.key",
3480 public_key: "testkey.avbpubkey",
3481 private_key: "testkey.pem",
3482 }
3483 android_app_certificate {
3484 name: "myapex.certificate.override",
3485 certificate: "testkey.override",
3486 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003487 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003488 expected := "testkey.override.x509.pem testkey.override.pk8"
3489 if actual := rule.Args["certificates"]; actual != expected {
3490 t.Errorf("certificates should be %q, not %q", expected, actual)
3491 }
3492 })
3493 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003494 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003495 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003496 apex {
3497 name: "myapex",
3498 key: "myapex.key",
3499 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003500 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003501 }
3502 apex_key {
3503 name: "myapex.key",
3504 public_key: "testkey.avbpubkey",
3505 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003506 }`,
3507 android.MockFS{
3508 "vendor/foo/devkeys/testkey.x509.pem": nil,
3509 }.AddToFixture(),
3510 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003511 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003512 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3513 if actual := rule.Args["certificates"]; actual != expected {
3514 t.Errorf("certificates should be %q, not %q", expected, actual)
3515 }
3516 })
3517 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003518 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003519 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003520 apex {
3521 name: "myapex_keytest",
3522 key: "myapex.key",
3523 file_contexts: ":myapex-file_contexts",
3524 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003525 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003526 }
3527 apex_key {
3528 name: "myapex.key",
3529 public_key: "testkey.avbpubkey",
3530 private_key: "testkey.pem",
3531 }
3532 android_app_certificate {
3533 name: "myapex.certificate.override",
3534 certificate: "testkey.override",
3535 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003536 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003537 expected := "testkey.override.x509.pem testkey.override.pk8"
3538 if actual := rule.Args["certificates"]; actual != expected {
3539 t.Errorf("certificates should be %q, not %q", expected, actual)
3540 }
3541 })
3542}
3543
Jiyong Park58e364a2019-01-19 19:24:06 +09003544func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003545 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003546 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003547 apex {
3548 name: "myapex",
3549 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003550 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003551 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003552 }
3553
3554 apex {
3555 name: "otherapex",
3556 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003557 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003558 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003559 }
3560
3561 apex_key {
3562 name: "myapex.key",
3563 public_key: "testkey.avbpubkey",
3564 private_key: "testkey.pem",
3565 }
3566
3567 cc_library {
3568 name: "mylib",
3569 srcs: ["mylib.cpp"],
3570 system_shared_libs: [],
3571 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003572 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003573 "myapex",
3574 "otherapex",
3575 ],
Jooyung Han24282772020-03-21 23:20:55 +09003576 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003577 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003578 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003579 cc_library {
3580 name: "mylib2",
3581 srcs: ["mylib.cpp"],
3582 system_shared_libs: [],
3583 stl: "none",
3584 apex_available: [
3585 "myapex",
3586 "otherapex",
3587 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003588 static_libs: ["mylib3"],
3589 recovery_available: true,
3590 min_sdk_version: "29",
3591 }
3592 cc_library {
3593 name: "mylib3",
3594 srcs: ["mylib.cpp"],
3595 system_shared_libs: [],
3596 stl: "none",
3597 apex_available: [
3598 "myapex",
3599 "otherapex",
3600 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003601 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003602 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003603 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003604 `)
3605
Jooyung Hanc87a0592020-03-02 17:44:33 +09003606 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003607 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003608 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003609
Vinh Tranf9754732023-01-19 22:41:46 -05003610 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003611 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003612 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003613
Vinh Tranf9754732023-01-19 22:41:46 -05003614 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003615 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003616 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003617
Colin Crossaede88c2020-08-11 12:17:01 -07003618 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3619 // each variant defines additional macros to distinguish which apex variant it is built for
3620
3621 // non-APEX variant does not have __ANDROID_APEX__ defined
3622 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3623 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3624
Vinh Tranf9754732023-01-19 22:41:46 -05003625 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003626 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3627 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003628
Jooyung Hanc87a0592020-03-02 17:44:33 +09003629 // non-APEX variant does not have __ANDROID_APEX__ defined
3630 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3631 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3632
Vinh Tranf9754732023-01-19 22:41:46 -05003633 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003634 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003635 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003636}
Jiyong Park7e636d02019-01-28 16:16:54 +09003637
3638func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003639 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003640 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003641 apex {
3642 name: "myapex",
3643 key: "myapex.key",
3644 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003645 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003646 }
3647
3648 apex_key {
3649 name: "myapex.key",
3650 public_key: "testkey.avbpubkey",
3651 private_key: "testkey.pem",
3652 }
3653
3654 cc_library_headers {
3655 name: "mylib_headers",
3656 export_include_dirs: ["my_include"],
3657 system_shared_libs: [],
3658 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003659 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003660 }
3661
3662 cc_library {
3663 name: "mylib",
3664 srcs: ["mylib.cpp"],
3665 system_shared_libs: [],
3666 stl: "none",
3667 header_libs: ["mylib_headers"],
3668 export_header_lib_headers: ["mylib_headers"],
3669 stubs: {
3670 versions: ["1", "2", "3"],
3671 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003672 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003673 }
3674
3675 cc_library {
3676 name: "otherlib",
3677 srcs: ["mylib.cpp"],
3678 system_shared_libs: [],
3679 stl: "none",
3680 shared_libs: ["mylib"],
3681 }
3682 `)
3683
Colin Cross7113d202019-11-20 16:39:12 -08003684 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003685
3686 // Ensure that the include path of the header lib is exported to 'otherlib'
3687 ensureContains(t, cFlags, "-Imy_include")
3688}
Alex Light9670d332019-01-29 18:07:33 -08003689
Jiyong Park7cd10e32020-01-14 09:22:18 +09003690type fileInApex struct {
3691 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003692 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003693 isLink bool
3694}
3695
Jooyung Han1724d582022-12-21 10:17:44 +09003696func (f fileInApex) String() string {
3697 return f.src + ":" + f.path
3698}
3699
3700func (f fileInApex) match(expectation string) bool {
3701 parts := strings.Split(expectation, ":")
3702 if len(parts) == 1 {
3703 match, _ := path.Match(parts[0], f.path)
3704 return match
3705 }
3706 if len(parts) == 2 {
3707 matchSrc, _ := path.Match(parts[0], f.src)
3708 matchDst, _ := path.Match(parts[1], f.path)
3709 return matchSrc && matchDst
3710 }
3711 panic("invalid expected file specification: " + expectation)
3712}
3713
Jooyung Hana57af4a2020-01-23 05:36:59 +00003714func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003716 module := ctx.ModuleForTests(moduleName, variant)
3717 apexRule := module.MaybeRule("apexRule")
3718 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003720 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003721 for _, cmd := range strings.Split(copyCmds, "&&") {
3722 cmd = strings.TrimSpace(cmd)
3723 if cmd == "" {
3724 continue
3725 }
3726 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003727 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003728 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003729 switch terms[0] {
3730 case "mkdir":
3731 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003732 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003733 t.Fatal("copyCmds contains invalid cp command", cmd)
3734 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003735 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003736 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003737 isLink = false
3738 case "ln":
3739 if len(terms) != 3 && len(terms) != 4 {
3740 // ln LINK TARGET or ln -s LINK TARGET
3741 t.Fatal("copyCmds contains invalid ln command", cmd)
3742 }
3743 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003744 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003745 isLink = true
3746 default:
3747 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3748 }
3749 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003750 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003752 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003753 }
Jooyung Han1724d582022-12-21 10:17:44 +09003754 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003755 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003756 }
3757 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003758 return ret
3759}
3760
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003761func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003762 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003763 var failed bool
3764 var surplus []string
3765 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003766 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003767 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003768 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003769 if file.match(expected) {
3770 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003772 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003773 }
3774 }
Jooyung Han1724d582022-12-21 10:17:44 +09003775 if !matchFound {
3776 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003777 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003778 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003779
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003781 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003782 t.Log("surplus files", surplus)
3783 failed = true
3784 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003785
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003786 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003787 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003788 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003789 if !filesMatched[expected] {
3790 missing = append(missing, expected)
3791 }
3792 }
3793 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003794 t.Log("missing files", missing)
3795 failed = true
3796 }
3797 if failed {
3798 t.Fail()
3799 }
3800}
3801
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003802func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3803 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3804}
3805
3806func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003807 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003808 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3809 if deapexer.Output != nil {
3810 outputs = append(outputs, deapexer.Output.String())
3811 }
3812 for _, output := range deapexer.ImplicitOutputs {
3813 outputs = append(outputs, output.String())
3814 }
3815 actualFiles := make([]fileInApex, 0, len(outputs))
3816 for _, output := range outputs {
3817 dir := "/deapexer/"
3818 pos := strings.LastIndex(output, dir)
3819 if pos == -1 {
3820 t.Fatal("Unknown deapexer output ", output)
3821 }
3822 path := output[pos+len(dir):]
3823 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3824 }
3825 assertFileListEquals(t, files, actualFiles)
3826}
3827
Jooyung Han39edb6c2019-11-06 16:53:07 +09003828func vndkLibrariesTxtFiles(vers ...string) (result string) {
3829 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003830 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003831 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003832 prebuilt_etc {
3833 name: "` + txt + `.libraries.` + v + `.txt",
3834 src: "dummy.txt",
3835 }
3836 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003837 }
3838 }
3839 return
3840}
3841
Jooyung Han344d5432019-08-23 11:17:39 +09003842func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003843 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003844 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003845 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003846 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003847 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003848 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003849 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003850 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003851 }
3852
3853 apex_key {
3854 name: "myapex.key",
3855 public_key: "testkey.avbpubkey",
3856 private_key: "testkey.pem",
3857 }
3858
Jooyung Han31c470b2019-10-18 16:26:59 +09003859 vndk_prebuilt_shared {
3860 name: "libvndk27",
3861 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003862 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003863 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003864 vndk: {
3865 enabled: true,
3866 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 target_arch: "arm64",
3868 arch: {
3869 arm: {
3870 srcs: ["libvndk27_arm.so"],
3871 },
3872 arm64: {
3873 srcs: ["libvndk27_arm64.so"],
3874 },
3875 },
Colin Cross2807f002021-03-02 10:15:29 -08003876 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003877 }
3878
3879 vndk_prebuilt_shared {
3880 name: "libvndk27",
3881 version: "27",
3882 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003883 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003884 vndk: {
3885 enabled: true,
3886 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003887 target_arch: "x86_64",
3888 arch: {
3889 x86: {
3890 srcs: ["libvndk27_x86.so"],
3891 },
3892 x86_64: {
3893 srcs: ["libvndk27_x86_64.so"],
3894 },
3895 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003896 }
3897 `+vndkLibrariesTxtFiles("27"),
3898 withFiles(map[string][]byte{
3899 "libvndk27_arm.so": nil,
3900 "libvndk27_arm64.so": nil,
3901 "libvndk27_x86.so": nil,
3902 "libvndk27_x86_64.so": nil,
3903 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003904
Jooyung Hana0503a52023-08-23 13:12:50 +09003905 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003906 "lib/libvndk27_arm.so",
3907 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003908 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 })
Jooyung Han344d5432019-08-23 11:17:39 +09003910}
3911
Jooyung Han90eee022019-10-01 20:02:42 +09003912func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003914 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003915 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003916 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003917 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003918 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003919 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003920 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003921 }
3922 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003923 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003924 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003925 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003926 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003927 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003928 }
3929 apex_key {
3930 name: "myapex.key",
3931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003933 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003934
3935 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003936 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003937 apexManifestRule := module.Rule("apexManifestRule")
3938 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003939 }
3940
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003941 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003942 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003943}
3944
Jooyung Han344d5432019-08-23 11:17:39 +09003945func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003946 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003947 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003948 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003949 name: "com.android.vndk.v30",
3950 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003951 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003952 native_bridge_supported: true,
3953 }
3954
3955 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003956 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003957 public_key: "testkey.avbpubkey",
3958 private_key: "testkey.pem",
3959 }
3960
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003961 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003962 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003963 version: "30",
3964 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003965 srcs: ["mylib.cpp"],
3966 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003967 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003968 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003969 vndk: {
3970 enabled: true,
3971 },
Jooyung Han344d5432019-08-23 11:17:39 +09003972 }
3973 `)
3974}
3975
Jooyung Han31c470b2019-10-18 16:26:59 +09003976func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003977 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003979 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003980 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003981 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003982 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003984 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 }
3986
3987 apex_key {
3988 name: "myapex.key",
3989 public_key: "testkey.avbpubkey",
3990 private_key: "testkey.pem",
3991 }
3992
3993 vndk_prebuilt_shared {
3994 name: "libvndk27",
3995 version: "27",
3996 target_arch: "arm",
3997 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003998 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003999 vndk: {
4000 enabled: true,
4001 },
4002 arch: {
4003 arm: {
4004 srcs: ["libvndk27.so"],
4005 }
4006 },
4007 }
4008
4009 vndk_prebuilt_shared {
4010 name: "libvndk27",
4011 version: "27",
4012 target_arch: "arm",
4013 binder32bit: true,
4014 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004015 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004016 vndk: {
4017 enabled: true,
4018 },
4019 arch: {
4020 arm: {
4021 srcs: ["libvndk27binder32.so"],
4022 }
4023 },
Colin Cross2807f002021-03-02 10:15:29 -08004024 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004025 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004026 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004027 withFiles(map[string][]byte{
4028 "libvndk27.so": nil,
4029 "libvndk27binder32.so": nil,
4030 }),
4031 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004032 android.FixtureModifyConfig(func(config android.Config) {
4033 target := android.Target{
4034 Os: android.Android,
4035 Arch: android.Arch{
4036 ArchType: android.Arm,
4037 ArchVariant: "armv7-a-neon",
4038 Abi: []string{"armeabi-v7a"},
4039 },
4040 NativeBridge: android.NativeBridgeDisabled,
4041 NativeBridgeHostArchName: "",
4042 NativeBridgeRelativePath: "",
4043 }
4044 config.Targets[android.Android] = []android.Target{target}
4045 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004046 }),
4047 )
4048
Jooyung Hana0503a52023-08-23 13:12:50 +09004049 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004051 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 })
4053}
4054
Jooyung Hane1633032019-08-01 17:41:43 +09004055func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004056 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004057 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004058 apex {
4059 name: "myapex_nodep",
4060 key: "myapex.key",
4061 native_shared_libs: ["lib_nodep"],
4062 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004063 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004064 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004065 }
4066
4067 apex {
4068 name: "myapex_dep",
4069 key: "myapex.key",
4070 native_shared_libs: ["lib_dep"],
4071 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004072 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004073 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004074 }
4075
4076 apex {
4077 name: "myapex_provider",
4078 key: "myapex.key",
4079 native_shared_libs: ["libfoo"],
4080 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004081 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004082 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004083 }
4084
4085 apex {
4086 name: "myapex_selfcontained",
4087 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004088 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004089 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004090 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004091 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004092 }
4093
4094 apex_key {
4095 name: "myapex.key",
4096 public_key: "testkey.avbpubkey",
4097 private_key: "testkey.pem",
4098 }
4099
4100 cc_library {
4101 name: "lib_nodep",
4102 srcs: ["mylib.cpp"],
4103 system_shared_libs: [],
4104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004105 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004106 }
4107
4108 cc_library {
4109 name: "lib_dep",
4110 srcs: ["mylib.cpp"],
4111 shared_libs: ["libfoo"],
4112 system_shared_libs: [],
4113 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004114 apex_available: [
4115 "myapex_dep",
4116 "myapex_provider",
4117 "myapex_selfcontained",
4118 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004119 }
4120
4121 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004122 name: "lib_dep_on_bar",
4123 srcs: ["mylib.cpp"],
4124 shared_libs: ["libbar"],
4125 system_shared_libs: [],
4126 stl: "none",
4127 apex_available: [
4128 "myapex_selfcontained",
4129 ],
4130 }
4131
4132
4133 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004134 name: "libfoo",
4135 srcs: ["mytest.cpp"],
4136 stubs: {
4137 versions: ["1"],
4138 },
4139 system_shared_libs: [],
4140 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004141 apex_available: [
4142 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004143 ],
4144 }
4145
4146 cc_library {
4147 name: "libbar",
4148 srcs: ["mytest.cpp"],
4149 stubs: {
4150 versions: ["1"],
4151 },
4152 system_shared_libs: [],
4153 stl: "none",
4154 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004155 "myapex_selfcontained",
4156 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004157 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004158
Jooyung Hane1633032019-08-01 17:41:43 +09004159 `)
4160
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004161 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004162 var provideNativeLibs, requireNativeLibs []string
4163
Jooyung Hana0503a52023-08-23 13:12:50 +09004164 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004165 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4166 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004167 ensureListEmpty(t, provideNativeLibs)
4168 ensureListEmpty(t, requireNativeLibs)
4169
Jooyung Hana0503a52023-08-23 13:12:50 +09004170 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004171 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4172 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004173 ensureListEmpty(t, provideNativeLibs)
4174 ensureListContains(t, requireNativeLibs, "libfoo.so")
4175
Jooyung Hana0503a52023-08-23 13:12:50 +09004176 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004177 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4178 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004179 ensureListContains(t, provideNativeLibs, "libfoo.so")
4180 ensureListEmpty(t, requireNativeLibs)
4181
Jooyung Hana0503a52023-08-23 13:12:50 +09004182 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004183 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4184 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004185 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004186 ensureListEmpty(t, requireNativeLibs)
4187}
4188
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004189func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004190 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004191 ctx := testApex(t, `
4192 apex {
4193 name: "myapex",
4194 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004195 native_shared_libs: ["mylib"],
4196 updatable: false,
4197 }
4198
4199 apex_key {
4200 name: "myapex.key",
4201 public_key: "testkey.avbpubkey",
4202 private_key: "testkey.pem",
4203 }
4204
4205 cc_library {
4206 name: "mylib",
4207 srcs: ["mylib.cpp"],
4208 system_shared_libs: [],
4209 stl: "none",
4210 apex_available: [
4211 "//apex_available:platform",
4212 "myapex",
4213 ],
4214 }
4215 `, android.FixtureMergeEnv(map[string]string{
4216 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4217 }))
4218
Jooyung Hana0503a52023-08-23 13:12:50 +09004219 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004220 apexManifestRule := module.Rule("apexManifestRule")
4221 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4222}
4223
Vinh Tran8f5310f2022-10-07 18:16:47 -04004224func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004225 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004226 testCases := []struct {
4227 compileMultiLibProp string
4228 containedLibs []string
4229 notContainedLibs []string
4230 }{
4231 {
4232 containedLibs: []string{
4233 "image.apex/lib64/mylib.so",
4234 "image.apex/lib/mylib.so",
4235 },
4236 compileMultiLibProp: `compile_multilib: "both",`,
4237 },
4238 {
4239 containedLibs: []string{"image.apex/lib64/mylib.so"},
4240 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4241 compileMultiLibProp: `compile_multilib: "first",`,
4242 },
4243 {
4244 containedLibs: []string{"image.apex/lib64/mylib.so"},
4245 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4246 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4247 },
4248 {
4249 containedLibs: []string{"image.apex/lib64/mylib.so"},
4250 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4251 compileMultiLibProp: `compile_multilib: "64",`,
4252 },
4253 {
4254 containedLibs: []string{"image.apex/lib/mylib.so"},
4255 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4256 compileMultiLibProp: `compile_multilib: "32",`,
4257 },
4258 }
4259 for _, testCase := range testCases {
4260 ctx := testApex(t, fmt.Sprintf(`
4261 apex {
4262 name: "myapex",
4263 key: "myapex.key",
4264 %s
4265 native_shared_libs: ["mylib"],
4266 updatable: false,
4267 }
4268 apex_key {
4269 name: "myapex.key",
4270 public_key: "testkey.avbpubkey",
4271 private_key: "testkey.pem",
4272 }
4273 cc_library {
4274 name: "mylib",
4275 srcs: ["mylib.cpp"],
4276 apex_available: [
4277 "//apex_available:platform",
4278 "myapex",
4279 ],
4280 }
4281 `, testCase.compileMultiLibProp),
4282 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004283 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004284 apexRule := module.Rule("apexRule")
4285 copyCmds := apexRule.Args["copy_commands"]
4286 for _, containedLib := range testCase.containedLibs {
4287 ensureContains(t, copyCmds, containedLib)
4288 }
4289 for _, notContainedLib := range testCase.notContainedLibs {
4290 ensureNotContains(t, copyCmds, notContainedLib)
4291 }
4292 }
4293}
4294
Alex Light0851b882019-02-07 13:20:53 -08004295func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004296 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004297 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004298 apex {
4299 name: "myapex",
4300 key: "myapex.key",
4301 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004302 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004303 }
4304
4305 apex_key {
4306 name: "myapex.key",
4307 public_key: "testkey.avbpubkey",
4308 private_key: "testkey.pem",
4309 }
4310
4311 cc_library {
4312 name: "mylib_common",
4313 srcs: ["mylib.cpp"],
4314 system_shared_libs: [],
4315 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004316 apex_available: [
4317 "//apex_available:platform",
4318 "myapex",
4319 ],
Alex Light0851b882019-02-07 13:20:53 -08004320 }
4321 `)
4322
Jooyung Hana0503a52023-08-23 13:12:50 +09004323 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004324 apexRule := module.Rule("apexRule")
4325 copyCmds := apexRule.Args["copy_commands"]
4326
4327 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4328 t.Log("Apex was a test apex!")
4329 t.Fail()
4330 }
4331 // Ensure that main rule creates an output
4332 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4333
4334 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004335 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004336
4337 // Ensure that both direct and indirect deps are copied into apex
4338 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4339
Colin Cross7113d202019-11-20 16:39:12 -08004340 // Ensure that the platform variant ends with _shared
4341 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004342
Colin Cross56a83212020-09-15 18:30:11 -07004343 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004344 t.Log("Found mylib_common not in any apex!")
4345 t.Fail()
4346 }
4347}
4348
4349func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004350 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004351 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004352 apex_test {
4353 name: "myapex",
4354 key: "myapex.key",
4355 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004356 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004357 }
4358
4359 apex_key {
4360 name: "myapex.key",
4361 public_key: "testkey.avbpubkey",
4362 private_key: "testkey.pem",
4363 }
4364
4365 cc_library {
4366 name: "mylib_common_test",
4367 srcs: ["mylib.cpp"],
4368 system_shared_libs: [],
4369 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004370 // TODO: remove //apex_available:platform
4371 apex_available: [
4372 "//apex_available:platform",
4373 "myapex",
4374 ],
Alex Light0851b882019-02-07 13:20:53 -08004375 }
4376 `)
4377
Jooyung Hana0503a52023-08-23 13:12:50 +09004378 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004379 apexRule := module.Rule("apexRule")
4380 copyCmds := apexRule.Args["copy_commands"]
4381
4382 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4383 t.Log("Apex was not a test apex!")
4384 t.Fail()
4385 }
4386 // Ensure that main rule creates an output
4387 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4388
4389 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004390 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004391
4392 // Ensure that both direct and indirect deps are copied into apex
4393 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4394
Colin Cross7113d202019-11-20 16:39:12 -08004395 // Ensure that the platform variant ends with _shared
4396 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004397}
4398
Jooyung Han85707de2023-12-01 14:21:13 +09004399func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004400 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004401 ctx := testApex(t, `
4402 apex {
4403 name: "myapex",
4404 key: "myapex.key",
4405 updatable: false,
4406 binaries: ["mybin"],
4407 }
4408 apex {
4409 name: "myvendorapex",
4410 key: "myapex.key",
4411 file_contexts: "myvendorapex_file_contexts",
4412 vendor: true,
4413 updatable: false,
4414 binaries: ["mybin"],
4415 }
4416 apex_key {
4417 name: "myapex.key",
4418 public_key: "testkey.avbpubkey",
4419 private_key: "testkey.pem",
4420 }
4421 cc_binary {
4422 name: "mybin",
4423 vendor_available: true,
4424 system_shared_libs: [],
4425 stl: "none",
4426 shared_libs: ["libz"],
4427 apex_available: ["//apex_available:anyapex"],
4428 }
4429 cc_library {
4430 name: "libz",
4431 vendor_available: true,
4432 system_shared_libs: [],
4433 stl: "none",
4434 stubs: {
4435 versions: ["28", "30"],
4436 },
4437 target: {
4438 vendor: {
4439 no_stubs: true,
4440 },
4441 },
4442 }
4443 `, withFiles(map[string][]byte{
4444 "myvendorapex_file_contexts": nil,
4445 }))
4446
4447 // libz provides stubs for core variant.
4448 {
4449 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4450 "bin/mybin",
4451 })
4452 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4453 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4454 }
4455 // libz doesn't provide stubs for vendor variant.
4456 {
4457 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4458 "bin/mybin",
4459 "lib64/libz.so",
4460 })
4461 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4462 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4463 }
4464}
4465
Alex Light9670d332019-01-29 18:07:33 -08004466func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004467 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004468 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004469 apex {
4470 name: "myapex",
4471 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004472 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004473 multilib: {
4474 first: {
4475 native_shared_libs: ["mylib_common"],
4476 }
4477 },
4478 target: {
4479 android: {
4480 multilib: {
4481 first: {
4482 native_shared_libs: ["mylib"],
4483 }
4484 }
4485 },
4486 host: {
4487 multilib: {
4488 first: {
4489 native_shared_libs: ["mylib2"],
4490 }
4491 }
4492 }
4493 }
4494 }
4495
4496 apex_key {
4497 name: "myapex.key",
4498 public_key: "testkey.avbpubkey",
4499 private_key: "testkey.pem",
4500 }
4501
4502 cc_library {
4503 name: "mylib",
4504 srcs: ["mylib.cpp"],
4505 system_shared_libs: [],
4506 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004507 // TODO: remove //apex_available:platform
4508 apex_available: [
4509 "//apex_available:platform",
4510 "myapex",
4511 ],
Alex Light9670d332019-01-29 18:07:33 -08004512 }
4513
4514 cc_library {
4515 name: "mylib_common",
4516 srcs: ["mylib.cpp"],
4517 system_shared_libs: [],
4518 stl: "none",
4519 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004520 // TODO: remove //apex_available:platform
4521 apex_available: [
4522 "//apex_available:platform",
4523 "myapex",
4524 ],
Alex Light9670d332019-01-29 18:07:33 -08004525 }
4526
4527 cc_library {
4528 name: "mylib2",
4529 srcs: ["mylib.cpp"],
4530 system_shared_libs: [],
4531 stl: "none",
4532 compile_multilib: "first",
4533 }
4534 `)
4535
Jooyung Hana0503a52023-08-23 13:12:50 +09004536 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004537 copyCmds := apexRule.Args["copy_commands"]
4538
4539 // Ensure that main rule creates an output
4540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4541
4542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4545 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004546
4547 // Ensure that both direct and indirect deps are copied into apex
4548 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4549 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4550 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4551
Colin Cross7113d202019-11-20 16:39:12 -08004552 // Ensure that the platform variant ends with _shared
4553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4554 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4555 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004556}
Jiyong Park04480cf2019-02-06 00:16:29 +09004557
Jiyong Park59140302020-12-14 18:44:04 +09004558func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004559 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004560 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004561 apex {
4562 name: "myapex",
4563 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004564 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004565 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004566 arch: {
4567 arm64: {
4568 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004569 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004570 },
4571 x86_64: {
4572 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004573 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004574 },
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 {
Colin Cross70572ed2022-11-02 13:14:20 -07004585 name: "mylib.generic",
4586 srcs: ["mylib.cpp"],
4587 system_shared_libs: [],
4588 stl: "none",
4589 // TODO: remove //apex_available:platform
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
4594 }
4595
4596 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004597 name: "mylib.arm64",
4598 srcs: ["mylib.cpp"],
4599 system_shared_libs: [],
4600 stl: "none",
4601 // TODO: remove //apex_available:platform
4602 apex_available: [
4603 "//apex_available:platform",
4604 "myapex",
4605 ],
4606 }
4607
4608 cc_library {
4609 name: "mylib.x64",
4610 srcs: ["mylib.cpp"],
4611 system_shared_libs: [],
4612 stl: "none",
4613 // TODO: remove //apex_available:platform
4614 apex_available: [
4615 "//apex_available:platform",
4616 "myapex",
4617 ],
4618 }
4619 `)
4620
Jooyung Hana0503a52023-08-23 13:12:50 +09004621 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004622 copyCmds := apexRule.Args["copy_commands"]
4623
4624 // Ensure that apex variant is created for the direct dep
4625 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004626 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004627 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4628
4629 // Ensure that both direct and indirect deps are copied into apex
4630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4631 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4632}
4633
Jiyong Park04480cf2019-02-06 00:16:29 +09004634func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004635 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004636 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004637 apex {
4638 name: "myapex",
4639 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004640 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004641 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004642 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004643 }
4644
4645 apex_key {
4646 name: "myapex.key",
4647 public_key: "testkey.avbpubkey",
4648 private_key: "testkey.pem",
4649 }
4650
4651 sh_binary {
4652 name: "myscript",
4653 src: "mylib.cpp",
4654 filename: "myscript.sh",
4655 sub_dir: "script",
4656 }
4657 `)
4658
Jooyung Hana0503a52023-08-23 13:12:50 +09004659 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004660 copyCmds := apexRule.Args["copy_commands"]
4661
4662 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4663}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004664
Jooyung Han91df2082019-11-20 01:49:42 +09004665func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004666 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004667 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004668 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004669 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004670 {"", "system"},
4671 {"product_specific: true", "product"},
4672 {"soc_specific: true", "vendor"},
4673 {"proprietary: true", "vendor"},
4674 {"vendor: true", "vendor"},
4675 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004676 }
4677 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004678 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004679 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004680 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004681 apex {
4682 name: "myapex",
4683 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004684 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004685 `+tc.propName+`
4686 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004687
Jooyung Han91df2082019-11-20 01:49:42 +09004688 apex_key {
4689 name: "myapex.key",
4690 public_key: "testkey.avbpubkey",
4691 private_key: "testkey.pem",
4692 }
4693 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004694
Jooyung Hana0503a52023-08-23 13:12:50 +09004695 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08004696 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004697 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004698 if actual != expected {
4699 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4700 }
Jooyung Han91df2082019-11-20 01:49:42 +09004701 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004702 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004703}
Jiyong Park67882562019-03-21 01:11:21 +09004704
Jooyung Han580eb4f2020-06-24 19:33:06 +09004705func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004706 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004707 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004708 apex {
4709 name: "myapex",
4710 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004711 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004712 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004713
Jooyung Han580eb4f2020-06-24 19:33:06 +09004714 apex_key {
4715 name: "myapex.key",
4716 public_key: "testkey.avbpubkey",
4717 private_key: "testkey.pem",
4718 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004719 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004720 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004721 rule := module.Output("file_contexts")
4722 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4723}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004724
Jooyung Han580eb4f2020-06-24 19:33:06 +09004725func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004726 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004727 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004728 apex {
4729 name: "myapex",
4730 key: "myapex.key",
4731 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004732 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004733 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004734
Jooyung Han580eb4f2020-06-24 19:33:06 +09004735 apex_key {
4736 name: "myapex.key",
4737 public_key: "testkey.avbpubkey",
4738 private_key: "testkey.pem",
4739 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004740 `, withFiles(map[string][]byte{
4741 "my_own_file_contexts": nil,
4742 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004743}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004744
Jooyung Han580eb4f2020-06-24 19:33:06 +09004745func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004746 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004747 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004748 apex {
4749 name: "myapex",
4750 key: "myapex.key",
4751 product_specific: true,
4752 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004753 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004754 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004755
Jooyung Han580eb4f2020-06-24 19:33:06 +09004756 apex_key {
4757 name: "myapex.key",
4758 public_key: "testkey.avbpubkey",
4759 private_key: "testkey.pem",
4760 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004761 `)
4762
Colin Cross1c460562021-02-16 17:55:47 -08004763 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004764 apex {
4765 name: "myapex",
4766 key: "myapex.key",
4767 product_specific: true,
4768 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004769 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004770 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004771
Jooyung Han580eb4f2020-06-24 19:33:06 +09004772 apex_key {
4773 name: "myapex.key",
4774 public_key: "testkey.avbpubkey",
4775 private_key: "testkey.pem",
4776 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004777 `, withFiles(map[string][]byte{
4778 "product_specific_file_contexts": nil,
4779 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004780 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004781 rule := module.Output("file_contexts")
4782 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4783}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004784
Jooyung Han580eb4f2020-06-24 19:33:06 +09004785func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004786 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004787 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004788 apex {
4789 name: "myapex",
4790 key: "myapex.key",
4791 product_specific: true,
4792 file_contexts: ":my-file-contexts",
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 Han580eb4f2020-06-24 19:33:06 +09004802 filegroup {
4803 name: "my-file-contexts",
4804 srcs: ["product_specific_file_contexts"],
4805 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806 `, withFiles(map[string][]byte{
4807 "product_specific_file_contexts": nil,
4808 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004809 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 rule := module.Output("file_contexts")
4811 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812}
4813
Jiyong Park67882562019-03-21 01:11:21 +09004814func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004815 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004816 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004817 apex_key {
4818 name: "myapex.key",
4819 public_key: ":my.avbpubkey",
4820 private_key: ":my.pem",
4821 product_specific: true,
4822 }
4823
4824 filegroup {
4825 name: "my.avbpubkey",
4826 srcs: ["testkey2.avbpubkey"],
4827 }
4828
4829 filegroup {
4830 name: "my.pem",
4831 srcs: ["testkey2.pem"],
4832 }
4833 `)
4834
4835 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4836 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004837 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004838 if actual_pubkey != expected_pubkey {
4839 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4840 }
4841 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004842 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004843 if actual_privkey != expected_privkey {
4844 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4845 }
4846}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004847
4848func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004849 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004850 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004851 prebuilt_apex {
4852 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004853 arch: {
4854 arm64: {
4855 src: "myapex-arm64.apex",
4856 },
4857 arm: {
4858 src: "myapex-arm.apex",
4859 },
4860 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004861 }
4862 `)
4863
Wei Li340ee8e2022-03-18 17:33:24 -07004864 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4865 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004866
Jiyong Parkc95714e2019-03-29 14:23:10 +09004867 expectedInput := "myapex-arm64.apex"
4868 if prebuilt.inputApex.String() != expectedInput {
4869 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4870 }
Wei Li340ee8e2022-03-18 17:33:24 -07004871 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4872 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4873 rule := testingModule.Rule("genProvenanceMetaData")
4874 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4875 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4876 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4877 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004878
4879 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4880 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004881}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004882
Paul Duffinc0609c62021-03-01 17:27:16 +00004883func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004884 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004885 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004886 prebuilt_apex {
4887 name: "myapex",
4888 }
4889 `)
4890}
4891
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004892func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004894 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004895 prebuilt_apex {
4896 name: "myapex",
4897 src: "myapex-arm.apex",
4898 filename: "notmyapex.apex",
4899 }
4900 `)
4901
Wei Li340ee8e2022-03-18 17:33:24 -07004902 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4903 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004904
4905 expected := "notmyapex.apex"
4906 if p.installFilename != expected {
4907 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4908 }
Wei Li340ee8e2022-03-18 17:33:24 -07004909 rule := testingModule.Rule("genProvenanceMetaData")
4910 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4911 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4912 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4913 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004914}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004915
Samiul Islam7c02e262021-09-08 17:48:28 +01004916func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004917 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004918 testApex(t, `
4919 apex_set {
4920 name: "com.company.android.myapex",
4921 apex_name: "com.android.myapex",
4922 set: "company-myapex.apks",
4923 filename: "com.company.android.myapex.apex"
4924 }
4925 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4926
4927 testApex(t, `
4928 apex_set {
4929 name: "com.company.android.myapex",
4930 apex_name: "com.android.myapex",
4931 set: "company-myapex.apks",
4932 filename: "com.company.android.myapex.capex"
4933 }
4934 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4935
4936 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4937 apex_set {
4938 name: "com.company.android.myapex",
4939 apex_name: "com.android.myapex",
4940 set: "company-myapex.apks",
4941 filename: "some-random-suffix"
4942 }
4943 `)
4944}
4945
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004946func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004947 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004949 prebuilt_apex {
4950 name: "myapex.prebuilt",
4951 src: "myapex-arm.apex",
4952 overrides: [
4953 "myapex",
4954 ],
4955 }
4956 `)
4957
Wei Li340ee8e2022-03-18 17:33:24 -07004958 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4959 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004960
4961 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004962 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004963 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004964 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004965 }
Wei Li340ee8e2022-03-18 17:33:24 -07004966 rule := testingModule.Rule("genProvenanceMetaData")
4967 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4968 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4969 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4970 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004971}
4972
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004973func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004974 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004975 testApex(t, `
4976 prebuilt_apex {
4977 name: "com.company.android.myapex",
4978 apex_name: "com.android.myapex",
4979 src: "company-myapex-arm.apex",
4980 }
4981 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4982
4983 testApex(t, `
4984 apex_set {
4985 name: "com.company.android.myapex",
4986 apex_name: "com.android.myapex",
4987 set: "company-myapex.apks",
4988 }
4989 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4990}
4991
4992func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004993 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004994 _ = android.GroupFixturePreparers(
4995 java.PrepareForTestWithJavaDefaultModules,
4996 PrepareForTestWithApexBuildComponents,
4997 android.FixtureWithRootAndroidBp(`
4998 platform_bootclasspath {
4999 name: "platform-bootclasspath",
5000 fragments: [
5001 {
5002 apex: "com.android.art",
5003 module: "art-bootclasspath-fragment",
5004 },
5005 ],
5006 }
5007
5008 prebuilt_apex {
5009 name: "com.company.android.art",
5010 apex_name: "com.android.art",
5011 src: "com.company.android.art-arm.apex",
5012 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5013 }
5014
5015 prebuilt_bootclasspath_fragment {
5016 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005017 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005018 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005019 hidden_api: {
5020 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5021 metadata: "my-bootclasspath-fragment/metadata.csv",
5022 index: "my-bootclasspath-fragment/index.csv",
5023 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5024 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5025 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005026 }
5027
5028 java_import {
5029 name: "core-oj",
5030 jars: ["prebuilt.jar"],
5031 }
5032 `),
5033 ).RunTest(t)
5034}
5035
Spandan Das59a4a2b2024-01-09 21:35:56 +00005036// A minimal context object for use with DexJarBuildPath
5037type moduleErrorfTestCtx struct {
5038}
5039
5040func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5041}
5042
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005043func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005044 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005045 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005046 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005047 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5048 // is disabled.
5049 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005050
5051 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5052 // file creation.
5053 java.FixtureConfigureBootJars("platform:foo"),
5054 android.FixtureModifyMockFS(func(fs android.MockFS) {
5055 fs["platform/Android.bp"] = []byte(`
5056 java_library {
5057 name: "foo",
5058 srcs: ["Test.java"],
5059 compile_dex: true,
5060 }
5061 `)
5062 fs["platform/Test.java"] = nil
5063 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005064 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005065
Paul Duffin40a3f652021-07-19 13:11:24 +01005066 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005067 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005068 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005069 var rule android.TestingBuildParams
5070
5071 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5072 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005073 }
5074
Paul Duffin40a3f652021-07-19 13:11:24 +01005075 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5076 t.Helper()
5077 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5078 var rule android.TestingBuildParams
5079
5080 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5081 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5082 }
5083
Paul Duffin89f570a2021-06-16 01:42:33 +01005084 fragment := java.ApexVariantReference{
5085 Apex: proptools.StringPtr("myapex"),
5086 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5087 }
5088
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005089 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005090 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005091 bp := `
5092 prebuilt_apex {
5093 name: "myapex",
5094 arch: {
5095 arm64: {
5096 src: "myapex-arm64.apex",
5097 },
5098 arm: {
5099 src: "myapex-arm.apex",
5100 },
5101 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005102 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5103 }
5104
5105 prebuilt_bootclasspath_fragment {
5106 name: "my-bootclasspath-fragment",
5107 contents: ["libfoo", "libbar"],
5108 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005109 hidden_api: {
5110 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5111 metadata: "my-bootclasspath-fragment/metadata.csv",
5112 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005113 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5114 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5115 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005116 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005117 }
5118
Spandan Das52c01a12024-09-20 01:09:48 +00005119 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005120 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005121 public: {
5122 jars: ["libfoo.jar"],
5123 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005124 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005125 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005126 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005127 }
Paul Duffin37856732021-02-26 14:24:15 +00005128
5129 java_sdk_library_import {
5130 name: "libbar",
5131 public: {
5132 jars: ["libbar.jar"],
5133 },
5134 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005135 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005136 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005137 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005138 `
5139
Paul Duffin89f570a2021-06-16 01:42:33 +01005140 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005141
Paul Duffin537ea3d2021-05-14 10:38:00 +01005142 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005143 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005144 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005145 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005146 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005147 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 +01005148 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005149 })
5150
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005151 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005152 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005153 bp := `
5154 apex_set {
5155 name: "myapex",
5156 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005157 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005158 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5159 }
5160
Paul Duffin89f570a2021-06-16 01:42:33 +01005161 prebuilt_bootclasspath_fragment {
5162 name: "my-bootclasspath-fragment",
5163 contents: ["libfoo", "libbar"],
5164 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005165 hidden_api: {
5166 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5167 metadata: "my-bootclasspath-fragment/metadata.csv",
5168 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005169 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5170 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5171 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005172 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005173 }
5174
Liz Kammer2dc72442023-04-20 10:10:48 -04005175 prebuilt_systemserverclasspath_fragment {
5176 name: "my-systemserverclasspath-fragment",
5177 contents: ["libbaz"],
5178 apex_available: ["myapex"],
5179 }
5180
Spandan Das52c01a12024-09-20 01:09:48 +00005181 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005182 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005183 public: {
5184 jars: ["libfoo.jar"],
5185 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005186 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005187 shared_library: false,
5188 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005189 }
5190
Spandan Das52c01a12024-09-20 01:09:48 +00005191
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005192 java_sdk_library_import {
5193 name: "libbar",
5194 public: {
5195 jars: ["libbar.jar"],
5196 },
5197 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005198 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005199 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005200 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005201
5202 java_sdk_library_import {
5203 name: "libbaz",
5204 public: {
5205 jars: ["libbaz.jar"],
5206 },
5207 apex_available: ["myapex"],
5208 shared_library: false,
5209 permitted_packages: ["baz"],
5210 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005211 `
5212
Paul Duffin89f570a2021-06-16 01:42:33 +01005213 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005214
Paul Duffin537ea3d2021-05-14 10:38:00 +01005215 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005216 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005217 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005218 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005219 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005220 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 +01005221 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005222
5223 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5224
5225 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005226 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005227 "myjavalib.myapex",
5228 "libfoo.myapex",
5229 "libbar.myapex",
5230 "libbaz.myapex",
5231 }
5232 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5233 for i, e := range mkEntries {
5234 g := e.OverrideName
5235 if w := overrideNames[i]; w != g {
5236 t.Errorf("Expected override name %q, got %q", w, g)
5237 }
5238 }
5239
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005240 })
5241
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005242 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005243 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005244 bp := `
5245 prebuilt_apex {
5246 name: "myapex",
5247 arch: {
5248 arm64: {
5249 src: "myapex-arm64.apex",
5250 },
5251 arm: {
5252 src: "myapex-arm.apex",
5253 },
5254 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005255 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5256 }
5257
5258 prebuilt_bootclasspath_fragment {
5259 name: "my-bootclasspath-fragment",
5260 contents: ["libfoo", "libbar"],
5261 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005262 hidden_api: {
5263 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5264 metadata: "my-bootclasspath-fragment/metadata.csv",
5265 index: "my-bootclasspath-fragment/index.csv",
5266 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5267 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5268 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005269 }
5270
5271 java_import {
5272 name: "libfoo",
5273 jars: ["libfoo.jar"],
5274 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005275 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005276 }
5277
5278 java_library {
5279 name: "libfoo",
5280 srcs: ["foo/bar/MyClass.java"],
5281 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005282 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 }
Paul Duffin37856732021-02-26 14:24:15 +00005284
5285 java_sdk_library_import {
5286 name: "libbar",
5287 public: {
5288 jars: ["libbar.jar"],
5289 },
5290 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005291 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005292 }
5293
5294 java_sdk_library {
5295 name: "libbar",
5296 srcs: ["foo/bar/MyClass.java"],
5297 unsafe_ignore_missing_latest_api: true,
5298 apex_available: ["myapex"],
5299 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 `
5301
5302 // In this test the source (java_library) libfoo is active since the
5303 // prebuilt (java_import) defaults to prefer:false. However the
5304 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5305 // find the dex boot jar in it. We either need to disable the source libfoo
5306 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005307 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005308 // dexbootjar check is skipped if AllowMissingDependencies is true
5309 preparerAllowMissingDeps := android.GroupFixturePreparers(
5310 preparer,
5311 android.PrepareForTestWithAllowMissingDependencies,
5312 )
5313 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005314 })
5315
5316 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005317 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005318 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005319 apex {
5320 name: "myapex",
5321 key: "myapex.key",
5322 updatable: false,
5323 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5324 }
5325
5326 apex_key {
5327 name: "myapex.key",
5328 public_key: "testkey.avbpubkey",
5329 private_key: "testkey.pem",
5330 }
5331
5332 bootclasspath_fragment {
5333 name: "my-bootclasspath-fragment",
5334 contents: ["libfoo", "libbar"],
5335 apex_available: ["myapex"],
5336 hidden_api: {
5337 split_packages: ["*"],
5338 },
5339 }
5340
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005341 prebuilt_apex {
5342 name: "myapex",
5343 arch: {
5344 arm64: {
5345 src: "myapex-arm64.apex",
5346 },
5347 arm: {
5348 src: "myapex-arm.apex",
5349 },
5350 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005351 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5352 }
5353
5354 prebuilt_bootclasspath_fragment {
5355 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005356 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005357 contents: ["libfoo", "libbar"],
5358 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005359 hidden_api: {
5360 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5361 metadata: "my-bootclasspath-fragment/metadata.csv",
5362 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005363 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5364 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5365 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005366 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005367 }
5368
Spandan Das52c01a12024-09-20 01:09:48 +00005369 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005370 name: "libfoo",
5371 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005372 public: {
5373 jars: ["libfoo.jar"],
5374 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005375 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005376 shared_library: false,
5377 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005378 }
5379
5380 java_library {
5381 name: "libfoo",
5382 srcs: ["foo/bar/MyClass.java"],
5383 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005384 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005385 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005386 }
Paul Duffin37856732021-02-26 14:24:15 +00005387
5388 java_sdk_library_import {
5389 name: "libbar",
5390 prefer: true,
5391 public: {
5392 jars: ["libbar.jar"],
5393 },
5394 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005395 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005396 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005397 }
5398
5399 java_sdk_library {
5400 name: "libbar",
5401 srcs: ["foo/bar/MyClass.java"],
5402 unsafe_ignore_missing_latest_api: true,
5403 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005404 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005405 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005406 `
5407
Paul Duffin89f570a2021-06-16 01:42:33 +01005408 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005409
Paul Duffin537ea3d2021-05-14 10:38:00 +01005410 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005411 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005412 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005413 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005414 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005415 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 +01005416 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005417 })
5418
5419 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005420 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005421 bp := `
5422 apex {
5423 name: "myapex",
5424 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005425 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005426 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005427 }
5428
5429 apex_key {
5430 name: "myapex.key",
5431 public_key: "testkey.avbpubkey",
5432 private_key: "testkey.pem",
5433 }
5434
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005435 bootclasspath_fragment {
5436 name: "my-bootclasspath-fragment",
5437 contents: ["libfoo", "libbar"],
5438 apex_available: ["myapex"],
5439 hidden_api: {
5440 split_packages: ["*"],
5441 },
5442 }
5443
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005444 prebuilt_apex {
5445 name: "myapex",
5446 arch: {
5447 arm64: {
5448 src: "myapex-arm64.apex",
5449 },
5450 arm: {
5451 src: "myapex-arm.apex",
5452 },
5453 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005454 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5455 }
5456
5457 prebuilt_bootclasspath_fragment {
5458 name: "my-bootclasspath-fragment",
5459 contents: ["libfoo", "libbar"],
5460 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005461 hidden_api: {
5462 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5463 metadata: "my-bootclasspath-fragment/metadata.csv",
5464 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005465 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5466 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5467 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005468 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 }
5470
5471 java_import {
5472 name: "libfoo",
5473 jars: ["libfoo.jar"],
5474 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005475 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005476 }
5477
5478 java_library {
5479 name: "libfoo",
5480 srcs: ["foo/bar/MyClass.java"],
5481 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005482 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005483 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005484 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005485 }
Paul Duffin37856732021-02-26 14:24:15 +00005486
5487 java_sdk_library_import {
5488 name: "libbar",
5489 public: {
5490 jars: ["libbar.jar"],
5491 },
5492 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005493 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005494 }
5495
5496 java_sdk_library {
5497 name: "libbar",
5498 srcs: ["foo/bar/MyClass.java"],
5499 unsafe_ignore_missing_latest_api: true,
5500 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005501 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005502 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005503 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005504 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 `
5506
Paul Duffin89f570a2021-06-16 01:42:33 +01005507 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005508
Paul Duffin537ea3d2021-05-14 10:38:00 +01005509 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005510 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005511 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5512 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5514 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 +01005515 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 })
5517
5518 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005519 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005520 bp := `
5521 apex {
5522 name: "myapex",
5523 enabled: false,
5524 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005525 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 }
5527
5528 apex_key {
5529 name: "myapex.key",
5530 public_key: "testkey.avbpubkey",
5531 private_key: "testkey.pem",
5532 }
5533
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005534 bootclasspath_fragment {
5535 name: "my-bootclasspath-fragment",
5536 enabled: false,
5537 contents: ["libfoo", "libbar"],
5538 apex_available: ["myapex"],
5539 hidden_api: {
5540 split_packages: ["*"],
5541 },
5542 }
5543
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 prebuilt_apex {
5545 name: "myapex",
5546 arch: {
5547 arm64: {
5548 src: "myapex-arm64.apex",
5549 },
5550 arm: {
5551 src: "myapex-arm.apex",
5552 },
5553 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005554 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5555 }
5556
5557 prebuilt_bootclasspath_fragment {
5558 name: "my-bootclasspath-fragment",
5559 contents: ["libfoo", "libbar"],
5560 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005561 hidden_api: {
5562 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5563 metadata: "my-bootclasspath-fragment/metadata.csv",
5564 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005565 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5566 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5567 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005568 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005569 }
5570
5571 java_import {
5572 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 jars: ["libfoo.jar"],
5574 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005575 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005576 }
5577
5578 java_library {
5579 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005580 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 srcs: ["foo/bar/MyClass.java"],
5582 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005583 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005584 }
Paul Duffin37856732021-02-26 14:24:15 +00005585
5586 java_sdk_library_import {
5587 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005588 public: {
5589 jars: ["libbar.jar"],
5590 },
5591 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005592 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005593 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005594 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005595 }
5596
5597 java_sdk_library {
5598 name: "libbar",
5599 srcs: ["foo/bar/MyClass.java"],
5600 unsafe_ignore_missing_latest_api: true,
5601 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005602 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005603 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 `
Cole Fausta963b942024-04-11 17:43:00 -07005605 // This test disables libbar, which causes the ComponentDepsMutator to add
5606 // deps on libbar.stubs and other sub-modules that don't exist. We can
5607 // enable AllowMissingDependencies to work around that, but enabling that
5608 // causes extra checks for missing source files to dex_bootjars, so add those
5609 // to the mock fs as well.
5610 preparer2 := android.GroupFixturePreparers(
5611 preparer,
5612 android.PrepareForTestWithAllowMissingDependencies,
5613 android.FixtureMergeMockFs(map[string][]byte{
5614 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005615 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005616 }),
5617 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618
Cole Fausta963b942024-04-11 17:43:00 -07005619 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005620
Paul Duffin537ea3d2021-05-14 10:38:00 +01005621 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005622 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005623 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005624 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005625 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005626 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 +01005627 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005628 })
Spandan Das3a392012024-01-17 18:26:27 +00005629
Spandan Dasf2c10572024-02-27 04:49:52 +00005630 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005631 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005632 bp := `
5633 // Source
5634 apex {
5635 name: "myapex",
5636 enabled: false,
5637 key: "myapex.key",
5638 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5639 }
5640
5641 apex_key {
5642 name: "myapex.key",
5643 public_key: "testkey.avbpubkey",
5644 private_key: "testkey.pem",
5645 }
5646
5647 // Prebuilt
5648 prebuilt_apex {
5649 name: "myapex.v1",
5650 source_apex_name: "myapex",
5651 arch: {
5652 arm64: {
5653 src: "myapex-arm64.apex",
5654 },
5655 arm: {
5656 src: "myapex-arm.apex",
5657 },
5658 },
5659 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5660 prefer: true,
5661 }
5662 prebuilt_apex {
5663 name: "myapex.v2",
5664 source_apex_name: "myapex",
5665 arch: {
5666 arm64: {
5667 src: "myapex-arm64.apex",
5668 },
5669 arm: {
5670 src: "myapex-arm.apex",
5671 },
5672 },
5673 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5674 prefer: true,
5675 }
5676
5677 prebuilt_bootclasspath_fragment {
5678 name: "my-bootclasspath-fragment",
5679 contents: ["libfoo", "libbar"],
5680 apex_available: ["myapex"],
5681 hidden_api: {
5682 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5683 metadata: "my-bootclasspath-fragment/metadata.csv",
5684 index: "my-bootclasspath-fragment/index.csv",
5685 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5686 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5687 },
5688 prefer: true,
5689 }
5690
5691 java_import {
5692 name: "libfoo",
5693 jars: ["libfoo.jar"],
5694 apex_available: ["myapex"],
5695 prefer: true,
5696 }
5697 java_import {
5698 name: "libbar",
5699 jars: ["libbar.jar"],
5700 apex_available: ["myapex"],
5701 prefer: true,
5702 }
5703 `
5704
Spandan Dasf2c10572024-02-27 04:49:52 +00005705 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 +00005706 })
5707
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005708}
5709
Roland Levillain630846d2019-06-26 12:48:34 +01005710func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005711 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005712 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005713 apex_test {
5714 name: "myapex",
5715 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005716 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005717 tests: [
5718 "mytest",
5719 ],
5720 }
5721
5722 apex_key {
5723 name: "myapex.key",
5724 public_key: "testkey.avbpubkey",
5725 private_key: "testkey.pem",
5726 }
5727
Liz Kammer1c14a212020-05-12 15:26:55 -07005728 filegroup {
5729 name: "fg",
5730 srcs: [
5731 "baz",
5732 "bar/baz"
5733 ],
5734 }
5735
Roland Levillain630846d2019-06-26 12:48:34 +01005736 cc_test {
5737 name: "mytest",
5738 gtest: false,
5739 srcs: ["mytest.cpp"],
5740 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005741 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005742 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005743 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005744 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005745 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005746
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005747 cc_library {
5748 name: "mylib",
5749 srcs: ["mylib.cpp"],
5750 system_shared_libs: [],
5751 stl: "none",
5752 }
5753
Liz Kammer5bd365f2020-05-27 15:15:11 -07005754 filegroup {
5755 name: "fg2",
5756 srcs: [
5757 "testdata/baz"
5758 ],
5759 }
Roland Levillain630846d2019-06-26 12:48:34 +01005760 `)
5761
Jooyung Hana0503a52023-08-23 13:12:50 +09005762 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005763 copyCmds := apexRule.Args["copy_commands"]
5764
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005765 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005766 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005767 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005768
Liz Kammer1c14a212020-05-12 15:26:55 -07005769 //Ensure that test data are copied into apex.
5770 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5771 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5772
Roland Levillainf89cd092019-07-29 16:22:59 +01005773 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005774 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005775 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005776 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005777 prefix := "TARGET_"
5778 var builder strings.Builder
5779 data.Custom(&builder, name, prefix, "", data)
5780 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005781 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005782 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005783}
5784
Jooyung Hand48f3c32019-08-23 11:18:57 +09005785func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005786 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005787 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5788 apex {
5789 name: "myapex",
5790 key: "myapex.key",
5791 native_shared_libs: ["libfoo"],
5792 }
5793
5794 apex_key {
5795 name: "myapex.key",
5796 public_key: "testkey.avbpubkey",
5797 private_key: "testkey.pem",
5798 }
5799
5800 cc_library {
5801 name: "libfoo",
5802 stl: "none",
5803 system_shared_libs: [],
5804 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005805 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005806 }
5807 `)
5808 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5809 apex {
5810 name: "myapex",
5811 key: "myapex.key",
5812 java_libs: ["myjar"],
5813 }
5814
5815 apex_key {
5816 name: "myapex.key",
5817 public_key: "testkey.avbpubkey",
5818 private_key: "testkey.pem",
5819 }
5820
5821 java_library {
5822 name: "myjar",
5823 srcs: ["foo/bar/MyClass.java"],
5824 sdk_version: "none",
5825 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005826 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005827 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005828 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005829 }
5830 `)
5831}
5832
Bill Peckhama41a6962021-01-11 10:58:54 -08005833func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005834 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005835 apex {
5836 name: "myapex",
5837 key: "myapex.key",
5838 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005839 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005840 }
5841
5842 apex_key {
5843 name: "myapex.key",
5844 public_key: "testkey.avbpubkey",
5845 private_key: "testkey.pem",
5846 }
5847
5848 java_import {
5849 name: "myjavaimport",
5850 apex_available: ["myapex"],
5851 jars: ["my.jar"],
5852 compile_dex: true,
5853 }
5854 `)
5855
Jooyung Hana0503a52023-08-23 13:12:50 +09005856 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005857 apexRule := module.Rule("apexRule")
5858 copyCmds := apexRule.Args["copy_commands"]
5859 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5860}
5861
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005862func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005863 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005864 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005865 apex {
5866 name: "myapex",
5867 key: "myapex.key",
5868 apps: [
5869 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005870 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005871 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005872 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005873 }
5874
5875 apex_key {
5876 name: "myapex.key",
5877 public_key: "testkey.avbpubkey",
5878 private_key: "testkey.pem",
5879 }
5880
5881 android_app {
5882 name: "AppFoo",
5883 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005884 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005885 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005886 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005887 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005888 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005889 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005890 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005891
5892 android_app {
5893 name: "AppFooPriv",
5894 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005895 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005896 system_modules: "none",
5897 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005898 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005899 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005900 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005901 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005902
5903 cc_library_shared {
5904 name: "libjni",
5905 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005906 shared_libs: ["libfoo"],
5907 stl: "none",
5908 system_shared_libs: [],
5909 apex_available: [ "myapex" ],
5910 sdk_version: "current",
5911 }
5912
5913 cc_library_shared {
5914 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005915 stl: "none",
5916 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005917 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005918 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005919 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005920 `)
5921
Jooyung Hana0503a52023-08-23 13:12:50 +09005922 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005923 apexRule := module.Rule("apexRule")
5924 copyCmds := apexRule.Args["copy_commands"]
5925
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005926 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5927 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005928 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005929
Colin Crossaede88c2020-08-11 12:17:01 -07005930 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005931 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005932 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005933 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005934 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005935 // JNI libraries including transitive deps are
5936 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005937 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005938 // ... embedded inside APK (jnilibs.zip)
5939 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5940 // ... and not directly inside the APEX
5941 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5942 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005943
5944 apexBundle := module.Module().(*apexBundle)
5945 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5946 var builder strings.Builder
5947 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5948 androidMk := builder.String()
5949 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5950 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5951 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5952 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5953 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5954 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 +01005955}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005956
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005957func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005958 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005959 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5960 for _, id := range invalidBuildIds {
5961 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5962 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5963 variables.BuildId = proptools.StringPtr(id)
5964 })
5965 testApexError(t, message, `apex {
5966 name: "myapex",
5967 key: "myapex.key",
5968 apps: ["AppFooPrebuilt"],
5969 updatable: false,
5970 }
5971
5972 apex_key {
5973 name: "myapex.key",
5974 public_key: "testkey.avbpubkey",
5975 private_key: "testkey.pem",
5976 }
5977
5978 android_app_import {
5979 name: "AppFooPrebuilt",
5980 apk: "PrebuiltAppFoo.apk",
5981 presigned: true,
5982 apex_available: ["myapex"],
5983 }
5984 `, fixture)
5985 }
5986}
5987
Dario Frenicde2a032019-10-27 00:29:22 +01005988func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005989 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005990 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005991 apex {
5992 name: "myapex",
5993 key: "myapex.key",
5994 apps: [
5995 "AppFooPrebuilt",
5996 "AppFooPrivPrebuilt",
5997 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005998 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005999 }
6000
6001 apex_key {
6002 name: "myapex.key",
6003 public_key: "testkey.avbpubkey",
6004 private_key: "testkey.pem",
6005 }
6006
6007 android_app_import {
6008 name: "AppFooPrebuilt",
6009 apk: "PrebuiltAppFoo.apk",
6010 presigned: true,
6011 dex_preopt: {
6012 enabled: false,
6013 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006014 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006015 }
6016
6017 android_app_import {
6018 name: "AppFooPrivPrebuilt",
6019 apk: "PrebuiltAppFooPriv.apk",
6020 privileged: true,
6021 presigned: true,
6022 dex_preopt: {
6023 enabled: false,
6024 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006025 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006026 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006027 }
6028 `)
6029
Jooyung Hana0503a52023-08-23 13:12:50 +09006030 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006031 apexRule := module.Rule("apexRule")
6032 copyCmds := apexRule.Args["copy_commands"]
6033
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006034 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6035 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006036}
6037
6038func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006039 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006040 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006041 apex {
6042 name: "myapex",
6043 key: "myapex.key",
6044 apps: [
6045 "AppFoo",
6046 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006047 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006048 }
6049
6050 apex_key {
6051 name: "myapex.key",
6052 public_key: "testkey.avbpubkey",
6053 private_key: "testkey.pem",
6054 }
6055
6056 android_app {
6057 name: "AppFoo",
6058 srcs: ["foo/bar/MyClass.java"],
6059 sdk_version: "none",
6060 system_modules: "none",
6061 apex_available: [ "myapex" ],
6062 }
6063
6064 android_app_import {
6065 name: "AppFoo",
6066 apk: "AppFooPrebuilt.apk",
6067 filename: "AppFooPrebuilt.apk",
6068 presigned: true,
6069 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006070 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006071 }
6072 `, withFiles(map[string][]byte{
6073 "AppFooPrebuilt.apk": nil,
6074 }))
6075
Jooyung Hana0503a52023-08-23 13:12:50 +09006076 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006077 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006078 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006079}
6080
Dario Freni6f3937c2019-12-20 22:58:03 +00006081func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006082 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006083 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006084 apex {
6085 name: "myapex",
6086 key: "myapex.key",
6087 apps: [
6088 "TesterHelpAppFoo",
6089 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006090 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006091 }
6092
6093 apex_key {
6094 name: "myapex.key",
6095 public_key: "testkey.avbpubkey",
6096 private_key: "testkey.pem",
6097 }
6098
6099 android_test_helper_app {
6100 name: "TesterHelpAppFoo",
6101 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006102 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006103 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006104 }
6105
6106 `)
6107
Jooyung Hana0503a52023-08-23 13:12:50 +09006108 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006109 apexRule := module.Rule("apexRule")
6110 copyCmds := apexRule.Args["copy_commands"]
6111
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006112 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006113}
6114
Jooyung Han18020ea2019-11-13 10:50:48 +09006115func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006116 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006117 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006118 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006123 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006124 }
6125
6126 apex_key {
6127 name: "myapex.key",
6128 public_key: "testkey.avbpubkey",
6129 private_key: "testkey.pem",
6130 }
6131
6132 apex {
6133 name: "otherapex",
6134 key: "myapex.key",
6135 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006136 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006137 }
6138
6139 cc_defaults {
6140 name: "libfoo-defaults",
6141 apex_available: ["otherapex"],
6142 }
6143
6144 cc_library {
6145 name: "libfoo",
6146 defaults: ["libfoo-defaults"],
6147 stl: "none",
6148 system_shared_libs: [],
6149 }`)
6150}
6151
Paul Duffine52e66f2020-03-30 17:54:29 +01006152func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006153 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006154 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006155 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006156 apex {
6157 name: "myapex",
6158 key: "myapex.key",
6159 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006160 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006161 }
6162
6163 apex_key {
6164 name: "myapex.key",
6165 public_key: "testkey.avbpubkey",
6166 private_key: "testkey.pem",
6167 }
6168
6169 apex {
6170 name: "otherapex",
6171 key: "otherapex.key",
6172 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006173 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006174 }
6175
6176 apex_key {
6177 name: "otherapex.key",
6178 public_key: "testkey.avbpubkey",
6179 private_key: "testkey.pem",
6180 }
6181
6182 cc_library {
6183 name: "libfoo",
6184 stl: "none",
6185 system_shared_libs: [],
6186 apex_available: ["otherapex"],
6187 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006188
6189 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6190 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6191 testApex(t, `
6192 apex {
6193 name: "com.sdv.myapex",
6194 key: "myapex.key",
6195 native_shared_libs: ["libfoo"],
6196 updatable: false,
6197 product_specific: true,
6198 }
6199
6200 apex_key {
6201 name: "myapex.key",
6202 public_key: "testkey.avbpubkey",
6203 private_key: "testkey.pem",
6204 }
6205
6206 apex {
6207 name: "com.any.otherapex",
6208 key: "otherapex.key",
6209 native_shared_libs: ["libfoo"],
6210 updatable: false,
6211 }
6212
6213 apex_key {
6214 name: "otherapex.key",
6215 public_key: "testkey.avbpubkey",
6216 private_key: "testkey.pem",
6217 }
6218
6219 cc_library {
6220 name: "libfoo",
6221 stl: "none",
6222 system_shared_libs: [],
6223 apex_available: ["com.any.otherapex"],
6224 product_specific: true,
6225 }`,
6226 android.FixtureMergeMockFs(android.MockFS{
6227 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6228 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6229 }))
6230
6231 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6232 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6233 apex {
6234 name: "com.sdv.myapex",
6235 key: "myapex.key",
6236 native_shared_libs: ["libfoo"],
6237 updatable: false,
6238 }
6239
6240 apex_key {
6241 name: "myapex.key",
6242 public_key: "testkey.avbpubkey",
6243 private_key: "testkey.pem",
6244 }
6245
6246 apex {
6247 name: "com.any.otherapex",
6248 key: "otherapex.key",
6249 native_shared_libs: ["libfoo"],
6250 updatable: false,
6251 }
6252
6253 apex_key {
6254 name: "otherapex.key",
6255 public_key: "testkey.avbpubkey",
6256 private_key: "testkey.pem",
6257 }
6258
6259 cc_library {
6260 name: "libfoo",
6261 stl: "none",
6262 system_shared_libs: [],
6263 apex_available: ["com.any.otherapex"],
6264 }`,
6265 android.FixtureMergeMockFs(android.MockFS{
6266 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6267 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6268 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006269}
Jiyong Park127b40b2019-09-30 16:04:35 +09006270
Paul Duffine52e66f2020-03-30 17:54:29 +01006271func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006272 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006273 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006274 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006275.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006276.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006277.*via tag cc\.dependencyTag.*
6278.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006279.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006280.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006281.*via tag cc\.dependencyTag.*
6282.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006283.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006284.*-> libbaz.*link:shared.*
6285.*via tag cc\.dependencyTag.*
6286.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006287 apex {
6288 name: "myapex",
6289 key: "myapex.key",
6290 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006291 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006292 }
6293
6294 apex_key {
6295 name: "myapex.key",
6296 public_key: "testkey.avbpubkey",
6297 private_key: "testkey.pem",
6298 }
6299
Jiyong Park127b40b2019-09-30 16:04:35 +09006300 cc_library {
6301 name: "libfoo",
6302 stl: "none",
6303 shared_libs: ["libbar"],
6304 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006305 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006306 }
6307
6308 cc_library {
6309 name: "libbar",
6310 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006311 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006312 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006313 apex_available: ["myapex"],
6314 }
6315
6316 cc_library {
6317 name: "libbaz",
6318 stl: "none",
6319 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006320 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006321
6322 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6323 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6324 testApex(t, `
6325 apex {
6326 name: "com.sdv.myapex",
6327 key: "myapex.key",
6328 native_shared_libs: ["libfoo"],
6329 updatable: false,
6330 product_specific: true,
6331 }
6332
6333 apex_key {
6334 name: "myapex.key",
6335 public_key: "testkey.avbpubkey",
6336 private_key: "testkey.pem",
6337 }
6338
6339 cc_library {
6340 name: "libfoo",
6341 stl: "none",
6342 shared_libs: ["libbar"],
6343 system_shared_libs: [],
6344 apex_available: ["com.sdv.myapex"],
6345 product_specific: true,
6346 }
6347
6348 cc_library {
6349 name: "libbar",
6350 stl: "none",
6351 shared_libs: ["libbaz"],
6352 system_shared_libs: [],
6353 apex_available: ["com.sdv.myapex"],
6354 product_specific: true,
6355 }
6356
6357 cc_library {
6358 name: "libbaz",
6359 stl: "none",
6360 system_shared_libs: [],
6361 product_specific: true,
6362 }`,
6363 android.FixtureMergeMockFs(android.MockFS{
6364 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6365 }))
6366
6367 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6368 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6369 apex {
6370 name: "com.sdv.myapex",
6371 key: "myapex.key",
6372 native_shared_libs: ["libfoo"],
6373 updatable: false,
6374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
6382 cc_library {
6383 name: "libfoo",
6384 stl: "none",
6385 shared_libs: ["libbar"],
6386 system_shared_libs: [],
6387 apex_available: ["com.sdv.myapex"],
6388 }
6389
6390 cc_library {
6391 name: "libbar",
6392 stl: "none",
6393 shared_libs: ["libbaz"],
6394 system_shared_libs: [],
6395 apex_available: ["com.sdv.myapex"],
6396 }
6397
6398 cc_library {
6399 name: "libbaz",
6400 stl: "none",
6401 system_shared_libs: [],
6402 }`,
6403 android.FixtureMergeMockFs(android.MockFS{
6404 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6405 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006406}
Jiyong Park127b40b2019-09-30 16:04:35 +09006407
Liz Kammer5f108fa2023-05-11 14:33:17 -04006408func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006409 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006410 testApex(t, `
6411 apex {
6412 name: "myapex",
6413 key: "myapex.key",
6414 native_shared_libs: ["libfoo"],
6415 updatable: false,
6416 }
6417
6418 apex_key {
6419 name: "myapex.key",
6420 public_key: "testkey.avbpubkey",
6421 private_key: "testkey.pem",
6422 }
6423
6424 cc_library {
6425 name: "libfoo",
6426 stl: "none",
6427 static_libs: ["libbar"],
6428 system_shared_libs: [],
6429 apex_available: ["myapex"],
6430 }
6431
6432 cc_library {
6433 name: "libbar",
6434 stl: "none",
6435 shared_libs: ["libbaz"],
6436 system_shared_libs: [],
6437 apex_available: ["myapex"],
6438 }
6439
6440 cc_library {
6441 name: "libbaz",
6442 stl: "none",
6443 system_shared_libs: [],
6444 }`)
6445
6446 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6447 apex {
6448 name: "myapex",
6449 key: "myapex.key",
6450 native_shared_libs: ["libfoo"],
6451 updatable: false,
6452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 cc_library {
6461 name: "libfoo",
6462 stl: "none",
6463 static_libs: ["libbar"],
6464 system_shared_libs: [],
6465 apex_available: ["myapex"],
6466 }
6467
6468 cc_library {
6469 name: "libbar",
6470 stl: "none",
6471 system_shared_libs: [],
6472 }`)
6473}
6474
Paul Duffine52e66f2020-03-30 17:54:29 +01006475func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006476 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006477 testApexError(t, "\"otherapex\" is not a valid module name", `
6478 apex {
6479 name: "myapex",
6480 key: "myapex.key",
6481 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006482 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006483 }
6484
6485 apex_key {
6486 name: "myapex.key",
6487 public_key: "testkey.avbpubkey",
6488 private_key: "testkey.pem",
6489 }
6490
6491 cc_library {
6492 name: "libfoo",
6493 stl: "none",
6494 system_shared_libs: [],
6495 apex_available: ["otherapex"],
6496 }`)
6497
Paul Duffine52e66f2020-03-30 17:54:29 +01006498 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006499 apex {
6500 name: "myapex",
6501 key: "myapex.key",
6502 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006503 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006504 }
6505
6506 apex_key {
6507 name: "myapex.key",
6508 public_key: "testkey.avbpubkey",
6509 private_key: "testkey.pem",
6510 }
6511
6512 cc_library {
6513 name: "libfoo",
6514 stl: "none",
6515 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006516 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006517 apex_available: ["myapex"],
6518 }
6519
6520 cc_library {
6521 name: "libbar",
6522 stl: "none",
6523 system_shared_libs: [],
6524 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006525 }
6526
6527 cc_library {
6528 name: "libbaz",
6529 stl: "none",
6530 system_shared_libs: [],
6531 stubs: {
6532 versions: ["10", "20", "30"],
6533 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006534 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006535}
Jiyong Park127b40b2019-09-30 16:04:35 +09006536
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006537func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006538 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006539 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006540 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006541 testApexError(t, "expected an integer between 0-9; got -1", `
6542 apex {
6543 name: "myapex",
6544 key: "myapex.key",
6545 apex_available_name: "com.android.foo",
6546 variant_version: "-1",
6547 updatable: false,
6548 }
6549 apex_key {
6550 name: "myapex.key",
6551 public_key: "testkey.avbpubkey",
6552 private_key: "testkey.pem",
6553 }
6554 `)
6555 })
6556
6557 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006558 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006559 testApexError(t, "expected an integer between 0-9; got 10", `
6560 apex {
6561 name: "myapex",
6562 key: "myapex.key",
6563 apex_available_name: "com.android.foo",
6564 variant_version: "10",
6565 updatable: false,
6566 }
6567 apex_key {
6568 name: "myapex.key",
6569 public_key: "testkey.avbpubkey",
6570 private_key: "testkey.pem",
6571 }
6572 `)
6573 })
6574}
6575
6576func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006577 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006578 context := android.GroupFixturePreparers(
6579 android.PrepareForIntegrationTestWithAndroid,
6580 PrepareForTestWithApexBuildComponents,
6581 android.FixtureMergeMockFs(android.MockFS{
6582 "system/sepolicy/apex/foo-file_contexts": nil,
6583 "system/sepolicy/apex/bar-file_contexts": nil,
6584 }),
6585 )
6586 result := context.RunTestWithBp(t, `
6587 apex {
6588 name: "foo",
6589 key: "myapex.key",
6590 apex_available_name: "com.android.foo",
6591 variant_version: "0",
6592 updatable: false,
6593 }
6594 apex {
6595 name: "bar",
6596 key: "myapex.key",
6597 apex_available_name: "com.android.foo",
6598 variant_version: "3",
6599 updatable: false,
6600 }
6601 apex_key {
6602 name: "myapex.key",
6603 public_key: "testkey.avbpubkey",
6604 private_key: "testkey.pem",
6605 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006606 override_apex {
6607 name: "myoverrideapex",
6608 base: "bar",
6609 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006610 `)
6611
Jooyung Hana0503a52023-08-23 13:12:50 +09006612 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006613 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006614 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6615 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6616 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6617 }
6618
Jooyung Hana0503a52023-08-23 13:12:50 +09006619 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006620 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006621 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6622 barActualDefaultVersion := barManifestRule.Args["default_version"]
6623 if barActualDefaultVersion != barExpectedDefaultVersion {
6624 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6625 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006626
Spandan Das50801e22024-05-13 18:29:45 +00006627 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006628 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6629 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6630 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6631 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006632}
6633
Sam Delmericoca816532023-06-02 14:09:50 -04006634func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006635 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006636 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 -07006637 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006638 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6639 apex {
6640 name: "myapex_sminus",
6641 key: "myapex.key",
6642 apps: ["AppFoo"],
6643 apex_available_name: "myapex",
6644 updatable: false,
6645 }
6646 apex {
6647 name: "myapex",
6648 key: "myapex.key",
6649 apps: ["AppFoo"],
6650 updatable: false,
6651 }
6652 apex_key {
6653 name: "myapex.key",
6654 public_key: "testkey.avbpubkey",
6655 private_key: "testkey.pem",
6656 }
6657 android_app {
6658 name: "AppFoo",
6659 srcs: ["foo/bar/MyClass.java"],
6660 sdk_version: "none",
6661 system_modules: "none",
6662 apex_available: [ "myapex_sminus" ],
6663 }`,
6664 android.FixtureMergeMockFs(android.MockFS{
6665 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6666 }),
6667 )
6668 })
6669
6670 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 -07006671 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006672 testApex(t, `
6673 apex {
6674 name: "myapex_sminus",
6675 key: "myapex.key",
6676 apps: ["AppFoo"],
6677 apex_available_name: "myapex",
6678 updatable: false,
6679 }
6680 apex {
6681 name: "myapex",
6682 key: "myapex.key",
6683 apps: ["AppFoo"],
6684 updatable: false,
6685 }
6686 apex_key {
6687 name: "myapex.key",
6688 public_key: "testkey.avbpubkey",
6689 private_key: "testkey.pem",
6690 }
6691 android_app {
6692 name: "AppFoo",
6693 srcs: ["foo/bar/MyClass.java"],
6694 sdk_version: "none",
6695 system_modules: "none",
6696 apex_available: [ "myapex" ],
6697 }`,
6698 android.FixtureMergeMockFs(android.MockFS{
6699 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6700 }),
6701 )
6702 })
6703
6704 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006705 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006706 testApex(t, `
6707 override_apex {
6708 name: "myoverrideapex_sminus",
6709 base: "myapex_sminus",
6710 key: "myapex.key",
6711 apps: ["AppFooOverride"],
6712 }
6713 override_apex {
6714 name: "myoverrideapex",
6715 base: "myapex",
6716 key: "myapex.key",
6717 apps: ["AppFooOverride"],
6718 }
6719 apex {
6720 name: "myapex_sminus",
6721 key: "myapex.key",
6722 apps: ["AppFoo"],
6723 apex_available_name: "myapex",
6724 updatable: false,
6725 }
6726 apex {
6727 name: "myapex",
6728 key: "myapex.key",
6729 apps: ["AppFoo"],
6730 updatable: false,
6731 }
6732 apex_key {
6733 name: "myapex.key",
6734 public_key: "testkey.avbpubkey",
6735 private_key: "testkey.pem",
6736 }
6737 android_app {
6738 name: "AppFooOverride",
6739 srcs: ["foo/bar/MyClass.java"],
6740 sdk_version: "none",
6741 system_modules: "none",
6742 apex_available: [ "myapex" ],
6743 }
6744 android_app {
6745 name: "AppFoo",
6746 srcs: ["foo/bar/MyClass.java"],
6747 sdk_version: "none",
6748 system_modules: "none",
6749 apex_available: [ "myapex" ],
6750 }`,
6751 android.FixtureMergeMockFs(android.MockFS{
6752 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6753 }),
6754 )
6755 })
6756}
6757
6758func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006759 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006760 context := android.GroupFixturePreparers(
6761 android.PrepareForIntegrationTestWithAndroid,
6762 PrepareForTestWithApexBuildComponents,
6763 java.PrepareForTestWithDexpreopt,
6764 android.FixtureMergeMockFs(android.MockFS{
6765 "system/sepolicy/apex/myapex-file_contexts": nil,
6766 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6767 }),
6768 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6769 variables.BuildId = proptools.StringPtr("buildid")
6770 }),
6771 )
6772 context.RunTestWithBp(t, `
6773 override_apex {
6774 name: "myoverrideapex_sminus",
6775 base: "myapex_sminus",
6776 }
6777 override_apex {
6778 name: "myoverrideapex",
6779 base: "myapex",
6780 }
6781 apex {
6782 name: "myapex",
6783 key: "myapex.key",
6784 apps: ["AppFoo"],
6785 updatable: false,
6786 }
6787 apex {
6788 name: "myapex_sminus",
6789 apex_available_name: "myapex",
6790 key: "myapex.key",
6791 apps: ["AppFoo_sminus"],
6792 updatable: false,
6793 }
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799 android_app {
6800 name: "AppFoo",
6801 srcs: ["foo/bar/MyClass.java"],
6802 sdk_version: "none",
6803 system_modules: "none",
6804 apex_available: [ "myapex" ],
6805 }
6806 android_app {
6807 name: "AppFoo_sminus",
6808 srcs: ["foo/bar/MyClass.java"],
6809 sdk_version: "none",
6810 min_sdk_version: "29",
6811 system_modules: "none",
6812 apex_available: [ "myapex" ],
6813 }`)
6814}
6815
Jiyong Park89e850a2020-04-07 16:37:39 +09006816func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006817 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006818 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006819 apex {
6820 name: "myapex",
6821 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006822 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006823 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006824 }
6825
6826 apex_key {
6827 name: "myapex.key",
6828 public_key: "testkey.avbpubkey",
6829 private_key: "testkey.pem",
6830 }
6831
6832 cc_library {
6833 name: "libfoo",
6834 stl: "none",
6835 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006836 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006837 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006838 }
6839
6840 cc_library {
6841 name: "libfoo2",
6842 stl: "none",
6843 system_shared_libs: [],
6844 shared_libs: ["libbaz"],
6845 apex_available: ["//apex_available:platform"],
6846 }
6847
6848 cc_library {
6849 name: "libbar",
6850 stl: "none",
6851 system_shared_libs: [],
6852 apex_available: ["myapex"],
6853 }
6854
6855 cc_library {
6856 name: "libbaz",
6857 stl: "none",
6858 system_shared_libs: [],
6859 apex_available: ["myapex"],
6860 stubs: {
6861 versions: ["1"],
6862 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006863 }`)
6864
Jiyong Park89e850a2020-04-07 16:37:39 +09006865 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6866 // because it depends on libbar which isn't available to platform
6867 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6868 if libfoo.NotAvailableForPlatform() != true {
6869 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6870 }
6871
6872 // libfoo2 however can be available to platform because it depends on libbaz which provides
6873 // stubs
6874 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6875 if libfoo2.NotAvailableForPlatform() == true {
6876 t.Errorf("%q should be available to platform", libfoo2.String())
6877 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006878}
Jiyong Parka90ca002019-10-07 15:47:24 +09006879
Paul Duffine52e66f2020-03-30 17:54:29 +01006880func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006881 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006882 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006883 apex {
6884 name: "myapex",
6885 key: "myapex.key",
6886 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006887 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006888 }
6889
6890 apex_key {
6891 name: "myapex.key",
6892 public_key: "testkey.avbpubkey",
6893 private_key: "testkey.pem",
6894 }
6895
6896 cc_library {
6897 name: "libfoo",
6898 stl: "none",
6899 system_shared_libs: [],
6900 apex_available: ["myapex"],
6901 static: {
6902 apex_available: ["//apex_available:platform"],
6903 },
6904 }`)
6905
Jiyong Park89e850a2020-04-07 16:37:39 +09006906 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6907 if libfooShared.NotAvailableForPlatform() != true {
6908 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6909 }
6910 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6911 if libfooStatic.NotAvailableForPlatform() != false {
6912 t.Errorf("%q should be available to platform", libfooStatic.String())
6913 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006914}
6915
Jooyung Han9a419e22024-08-16 17:14:21 +09006916func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006917 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006918
6919 for _, tc := range []struct {
6920 name string
6921 apexAvailable string
6922 expectedError string
6923 }{
6924 {
6925 name: "prefix matches correctly",
6926 apexAvailable: "com.foo.*",
6927 },
6928 {
6929 name: "prefix doesn't match",
6930 apexAvailable: "com.bar.*",
6931 expectedError: `Consider .* "com.foo\.\*"`,
6932 },
6933 {
6934 name: "short prefix",
6935 apexAvailable: "com.*",
6936 expectedError: "requires two or more components",
6937 },
6938 {
6939 name: "wildcard not in the end",
6940 apexAvailable: "com.*.foo",
6941 expectedError: "should end with .*",
6942 },
6943 {
6944 name: "wildcard in the middle",
6945 apexAvailable: "com.foo*.*",
6946 expectedError: "not allowed in the middle",
6947 },
6948 {
6949 name: "hint with prefix pattern",
6950 apexAvailable: "//apex_available:platform",
6951 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6952 },
6953 } {
6954 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006955 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006956 errorHandler := android.FixtureExpectsNoErrors
6957 if tc.expectedError != "" {
6958 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6959 }
6960 context := android.GroupFixturePreparers(
6961 prepareForApexTest,
6962 android.FixtureMergeMockFs(android.MockFS{
6963 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6964 }),
6965 ).ExtendWithErrorHandler(errorHandler)
6966
6967 context.RunTestWithBp(t, `
6968 apex {
6969 name: "com.foo.bar",
6970 key: "myapex.key",
6971 native_shared_libs: ["libfoo"],
6972 updatable: false,
6973 }
6974
6975 apex_key {
6976 name: "myapex.key",
6977 public_key: "testkey.avbpubkey",
6978 private_key: "testkey.pem",
6979 }
6980
6981 cc_library {
6982 name: "libfoo",
6983 stl: "none",
6984 system_shared_libs: [],
6985 apex_available: ["`+tc.apexAvailable+`"],
6986 }`)
6987 })
6988 }
6989 testApexError(t, `Consider adding "com.foo" to`, `
6990 apex {
6991 name: "com.foo", // too short for a partner apex
6992 key: "myapex.key",
6993 native_shared_libs: ["libfoo"],
6994 updatable: false,
6995 }
6996
6997 apex_key {
6998 name: "myapex.key",
6999 public_key: "testkey.avbpubkey",
7000 private_key: "testkey.pem",
7001 }
7002
7003 cc_library {
7004 name: "libfoo",
7005 stl: "none",
7006 system_shared_libs: [],
7007 }
7008 `)
7009}
7010
Jooyung Hanb9518072024-11-22 14:05:20 +09007011func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7012 t.Parallel()
7013 ctx := testApex(t, `
7014 apex_test {
7015 name: "myapex",
7016 key: "myapex.key",
7017 skip_validations: {
7018 host_apex_verifier: true,
7019 },
7020 updatable: false,
7021 }
7022 apex_key {
7023 name: "myapex.key",
7024 public_key: "testkey.avbpubkey",
7025 private_key: "testkey.pem",
7026 }
7027 `)
7028
7029 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7030 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7031 t.Error("should not run host_apex_verifier")
7032 }
7033}
7034
7035func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7036 t.Parallel()
7037 ctx := testApex(t, `
7038 apex_test {
7039 name: "myapex",
7040 key: "myapex.key",
7041 updatable: false,
7042 }
7043 apex_key {
7044 name: "myapex.key",
7045 public_key: "testkey.avbpubkey",
7046 private_key: "testkey.pem",
7047 }
7048 `)
7049
7050 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7051 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7052 t.Error("should run host_apex_verifier")
7053 }
7054}
7055
Jiyong Park5d790c32019-11-15 18:40:32 +09007056func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007057 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007058 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007059 apex {
7060 name: "myapex",
7061 key: "myapex.key",
7062 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007063 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007064 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007065 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007066 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007067 }
7068
7069 override_apex {
7070 name: "override_myapex",
7071 base: "myapex",
7072 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007073 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007074 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007075 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007076 compile_multilib: "first",
7077 multilib: {
7078 lib32: {
7079 native_shared_libs: ["mylib32"],
7080 },
7081 lib64: {
7082 native_shared_libs: ["mylib64"],
7083 },
7084 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007085 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007086 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007087 key: "mynewapex.key",
7088 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007089 }
7090
7091 apex_key {
7092 name: "myapex.key",
7093 public_key: "testkey.avbpubkey",
7094 private_key: "testkey.pem",
7095 }
7096
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007097 apex_key {
7098 name: "mynewapex.key",
7099 public_key: "testkey2.avbpubkey",
7100 private_key: "testkey2.pem",
7101 }
7102
7103 android_app_certificate {
7104 name: "myapex.certificate",
7105 certificate: "testkey",
7106 }
7107
Jiyong Park5d790c32019-11-15 18:40:32 +09007108 android_app {
7109 name: "app",
7110 srcs: ["foo/bar/MyClass.java"],
7111 package_name: "foo",
7112 sdk_version: "none",
7113 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007114 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007115 }
7116
7117 override_android_app {
7118 name: "override_app",
7119 base: "app",
7120 package_name: "bar",
7121 }
markchien7c803b82021-08-26 22:10:06 +08007122
7123 bpf {
7124 name: "bpf",
7125 srcs: ["bpf.c"],
7126 }
7127
7128 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007129 name: "overrideBpf",
7130 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007131 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007132
7133 prebuilt_etc {
7134 name: "myetc",
7135 src: "myprebuilt",
7136 }
7137
7138 prebuilt_etc {
7139 name: "override_myetc",
7140 src: "override_myprebuilt",
7141 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007142
7143 cc_library {
7144 name: "mylib32",
7145 apex_available: [ "myapex" ],
7146 }
7147
7148 cc_library {
7149 name: "mylib64",
7150 apex_available: [ "myapex" ],
7151 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007152 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007153
Jooyung Hana0503a52023-08-23 13:12:50 +09007154 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007155 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007156 if originalVariant.GetOverriddenBy() != "" {
7157 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7158 }
7159 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7160 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7161 }
7162
Spandan Das50801e22024-05-13 18:29:45 +00007163 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007164 apexRule := module.Rule("apexRule")
7165 copyCmds := apexRule.Args["copy_commands"]
7166
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007167 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7168 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007169
markchien7c803b82021-08-26 22:10:06 +08007170 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007171 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007172
Daniel Norman5a3ce132021-08-26 15:44:43 -07007173 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7174 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7175
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007176 apexBundle := module.Module().(*apexBundle)
7177 name := apexBundle.Name()
7178 if name != "override_myapex" {
7179 t.Errorf("name should be \"override_myapex\", but was %q", name)
7180 }
7181
Baligh Uddin004d7172020-02-19 21:29:28 -08007182 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7183 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7184 }
7185
Jiyong Park20bacab2020-03-03 11:45:41 +09007186 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007187 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007188 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7189
7190 signApkRule := module.Rule("signapk")
7191 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007192
Colin Crossaa255532020-07-03 13:18:24 -07007193 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007194 var builder strings.Builder
7195 data.Custom(&builder, name, "TARGET_", "", data)
7196 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007197 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7198 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007199 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007200 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007201 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007202 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007203 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007204 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007205}
7206
Albert Martineefabcf2022-03-21 20:11:16 +00007207func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007208 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007209 // Override from 29 to 31
7210 minSdkOverride31 := "31"
7211 ctx := testApex(t, `
7212 apex {
7213 name: "myapex",
7214 key: "myapex.key",
7215 native_shared_libs: ["mylib"],
7216 updatable: true,
7217 min_sdk_version: "29"
7218 }
7219
7220 override_apex {
7221 name: "override_myapex",
7222 base: "myapex",
7223 logging_parent: "com.foo.bar",
7224 package_name: "test.overridden.package"
7225 }
7226
7227 apex_key {
7228 name: "myapex.key",
7229 public_key: "testkey.avbpubkey",
7230 private_key: "testkey.pem",
7231 }
7232
7233 cc_library {
7234 name: "mylib",
7235 srcs: ["mylib.cpp"],
7236 runtime_libs: ["libbar"],
7237 system_shared_libs: [],
7238 stl: "none",
7239 apex_available: [ "myapex" ],
7240 min_sdk_version: "apex_inherit"
7241 }
7242
7243 cc_library {
7244 name: "libbar",
7245 srcs: ["mylib.cpp"],
7246 system_shared_libs: [],
7247 stl: "none",
7248 apex_available: [ "myapex" ],
7249 min_sdk_version: "apex_inherit"
7250 }
7251
7252 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7253
Jooyung Hana0503a52023-08-23 13:12:50 +09007254 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007255 copyCmds := apexRule.Args["copy_commands"]
7256
7257 // Ensure that direct non-stubs dep is always included
7258 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7259
7260 // Ensure that runtime_libs dep in included
7261 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7262
7263 // Ensure libraries target overridden min_sdk_version value
7264 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7265}
7266
7267func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007268 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007269 // Attempt to override from 31 to 29, should be a NOOP
7270 minSdkOverride29 := "29"
7271 ctx := testApex(t, `
7272 apex {
7273 name: "myapex",
7274 key: "myapex.key",
7275 native_shared_libs: ["mylib"],
7276 updatable: true,
7277 min_sdk_version: "31"
7278 }
7279
7280 override_apex {
7281 name: "override_myapex",
7282 base: "myapex",
7283 logging_parent: "com.foo.bar",
7284 package_name: "test.overridden.package"
7285 }
7286
7287 apex_key {
7288 name: "myapex.key",
7289 public_key: "testkey.avbpubkey",
7290 private_key: "testkey.pem",
7291 }
7292
7293 cc_library {
7294 name: "mylib",
7295 srcs: ["mylib.cpp"],
7296 runtime_libs: ["libbar"],
7297 system_shared_libs: [],
7298 stl: "none",
7299 apex_available: [ "myapex" ],
7300 min_sdk_version: "apex_inherit"
7301 }
7302
7303 cc_library {
7304 name: "libbar",
7305 srcs: ["mylib.cpp"],
7306 system_shared_libs: [],
7307 stl: "none",
7308 apex_available: [ "myapex" ],
7309 min_sdk_version: "apex_inherit"
7310 }
7311
7312 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7313
Jooyung Hana0503a52023-08-23 13:12:50 +09007314 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007315 copyCmds := apexRule.Args["copy_commands"]
7316
7317 // Ensure that direct non-stubs dep is always included
7318 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7319
7320 // Ensure that runtime_libs dep in included
7321 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7322
7323 // Ensure libraries target the original min_sdk_version value rather than the overridden
7324 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7325}
7326
Jooyung Han214bf372019-11-12 13:03:50 +09007327func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007328 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007329 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007330 apex {
7331 name: "myapex",
7332 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007333 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007334 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007335 }
7336
7337 apex_key {
7338 name: "myapex.key",
7339 public_key: "testkey.avbpubkey",
7340 private_key: "testkey.pem",
7341 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007342
7343 cc_library {
7344 name: "mylib",
7345 srcs: ["mylib.cpp"],
7346 stl: "libc++",
7347 system_shared_libs: [],
7348 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007349 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007350 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007351 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007352
Jooyung Hana0503a52023-08-23 13:12:50 +09007353 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007354 args := module.Rule("apexRule").Args
7355 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007356
7357 // The copies of the libraries in the apex should have one more dependency than
7358 // the ones outside the apex, namely the unwinder. Ideally we should check
7359 // the dependency names directly here but for some reason the names are blank in
7360 // this test.
7361 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007362 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007363 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7364 if len(apexImplicits) != len(nonApexImplicits)+1 {
7365 t.Errorf("%q missing unwinder dep", lib)
7366 }
7367 }
Jooyung Han214bf372019-11-12 13:03:50 +09007368}
7369
Paul Duffine05480a2021-03-08 15:07:14 +00007370var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007371 "api/current.txt": nil,
7372 "api/removed.txt": nil,
7373 "api/system-current.txt": nil,
7374 "api/system-removed.txt": nil,
7375 "api/test-current.txt": nil,
7376 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007377
Anton Hanssondff2c782020-12-21 17:10:01 +00007378 "100/public/api/foo.txt": nil,
7379 "100/public/api/foo-removed.txt": nil,
7380 "100/system/api/foo.txt": nil,
7381 "100/system/api/foo-removed.txt": nil,
7382
Paul Duffineedc5d52020-06-12 17:46:39 +01007383 // For java_sdk_library_import
7384 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007385}
7386
Jooyung Han58f26ab2019-12-18 15:34:32 +09007387func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007388 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007389 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007390 apex {
7391 name: "myapex",
7392 key: "myapex.key",
7393 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007394 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007395 }
7396
7397 apex_key {
7398 name: "myapex.key",
7399 public_key: "testkey.avbpubkey",
7400 private_key: "testkey.pem",
7401 }
7402
7403 java_sdk_library {
7404 name: "foo",
7405 srcs: ["a.java"],
7406 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007407 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007408 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007409
7410 prebuilt_apis {
7411 name: "sdk",
7412 api_dirs: ["100"],
7413 }
Paul Duffin9b879592020-05-26 13:21:35 +01007414 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007415
7416 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007417 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007418 "javalib/foo.jar",
7419 "etc/permissions/foo.xml",
7420 })
7421 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007422 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7423 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7424 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007425}
7426
Spandan Das3ee19692024-06-19 04:47:40 +00007427func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007428 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007429 ctx := testApex(t, `
7430 override_apex {
7431 name: "mycompanyapex",
7432 base: "myapex",
7433 }
7434 apex {
7435 name: "myapex",
7436 key: "myapex.key",
7437 java_libs: ["foo"],
7438 updatable: false,
7439 }
7440
7441 apex_key {
7442 name: "myapex.key",
7443 public_key: "testkey.avbpubkey",
7444 private_key: "testkey.pem",
7445 }
7446
7447 java_sdk_library {
7448 name: "foo",
7449 srcs: ["a.java"],
7450 api_packages: ["foo"],
7451 apex_available: [ "myapex" ],
7452 }
7453
7454 prebuilt_apis {
7455 name: "sdk",
7456 api_dirs: ["100"],
7457 }
7458 `, withFiles(filesForSdkLibrary))
7459
7460 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7461 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7462 // (com.android.foo), the filepath should not contain override apex name.
7463 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7464 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7465 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7466}
7467
Paul Duffin9b879592020-05-26 13:21:35 +01007468func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007469 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007470 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007471 apex {
7472 name: "myapex",
7473 key: "myapex.key",
7474 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007475 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007476 }
7477
7478 apex_key {
7479 name: "myapex.key",
7480 public_key: "testkey.avbpubkey",
7481 private_key: "testkey.pem",
7482 }
7483
7484 java_sdk_library {
7485 name: "foo",
7486 srcs: ["a.java"],
7487 api_packages: ["foo"],
7488 apex_available: ["myapex"],
7489 sdk_version: "none",
7490 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007491 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007492 }
7493
7494 java_library {
7495 name: "bar",
7496 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007497 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007498 apex_available: ["myapex"],
7499 sdk_version: "none",
7500 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007501 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007502 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007503
7504 prebuilt_apis {
7505 name: "sdk",
7506 api_dirs: ["100"],
7507 }
Paul Duffin9b879592020-05-26 13:21:35 +01007508 `, withFiles(filesForSdkLibrary))
7509
7510 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007511 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007512 "javalib/bar.jar",
7513 "javalib/foo.jar",
7514 "etc/permissions/foo.xml",
7515 })
7516
7517 // The bar library should depend on the implementation jar.
7518 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007519 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007520 t.Errorf("expected %q, found %#q", expected, actual)
7521 }
7522}
7523
7524func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007525 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007526 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007527 apex {
7528 name: "myapex",
7529 key: "myapex.key",
7530 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007531 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007532 }
7533
7534 apex_key {
7535 name: "myapex.key",
7536 public_key: "testkey.avbpubkey",
7537 private_key: "testkey.pem",
7538 }
7539
7540 java_sdk_library {
7541 name: "foo",
7542 srcs: ["a.java"],
7543 api_packages: ["foo"],
7544 apex_available: ["myapex"],
7545 sdk_version: "none",
7546 system_modules: "none",
7547 }
7548
7549 java_library {
7550 name: "bar",
7551 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007552 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007553 sdk_version: "none",
7554 system_modules: "none",
7555 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007556
7557 prebuilt_apis {
7558 name: "sdk",
7559 api_dirs: ["100"],
7560 }
Paul Duffin9b879592020-05-26 13:21:35 +01007561 `, withFiles(filesForSdkLibrary))
7562
7563 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007564 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007565 "javalib/foo.jar",
7566 "etc/permissions/foo.xml",
7567 })
7568
7569 // The bar library should depend on the stubs jar.
7570 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007571 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007572 t.Errorf("expected %q, found %#q", expected, actual)
7573 }
7574}
7575
Paul Duffineedc5d52020-06-12 17:46:39 +01007576func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007577 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007578 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007579 prebuilt_apis {
7580 name: "sdk",
7581 api_dirs: ["100"],
7582 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007583 withFiles(map[string][]byte{
7584 "apex/a.java": nil,
7585 "apex/apex_manifest.json": nil,
7586 "apex/Android.bp": []byte(`
7587 package {
7588 default_visibility: ["//visibility:private"],
7589 }
7590
7591 apex {
7592 name: "myapex",
7593 key: "myapex.key",
7594 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007595 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007596 }
7597
7598 apex_key {
7599 name: "myapex.key",
7600 public_key: "testkey.avbpubkey",
7601 private_key: "testkey.pem",
7602 }
7603
7604 java_library {
7605 name: "bar",
7606 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007607 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007608 apex_available: ["myapex"],
7609 sdk_version: "none",
7610 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007611 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007612 }
7613`),
7614 "source/a.java": nil,
7615 "source/api/current.txt": nil,
7616 "source/api/removed.txt": nil,
7617 "source/Android.bp": []byte(`
7618 package {
7619 default_visibility: ["//visibility:private"],
7620 }
7621
7622 java_sdk_library {
7623 name: "foo",
7624 visibility: ["//apex"],
7625 srcs: ["a.java"],
7626 api_packages: ["foo"],
7627 apex_available: ["myapex"],
7628 sdk_version: "none",
7629 system_modules: "none",
7630 public: {
7631 enabled: true,
7632 },
Colin Crosse4f34882024-11-14 12:26:00 -08007633 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007634 }
7635`),
7636 "prebuilt/a.jar": nil,
7637 "prebuilt/Android.bp": []byte(`
7638 package {
7639 default_visibility: ["//visibility:private"],
7640 }
7641
7642 java_sdk_library_import {
7643 name: "foo",
7644 visibility: ["//apex", "//source"],
7645 apex_available: ["myapex"],
7646 prefer: true,
7647 public: {
7648 jars: ["a.jar"],
7649 },
Colin Crosse4f34882024-11-14 12:26:00 -08007650 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007651 }
7652`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007653 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007654 )
7655
7656 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007657 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007658 "javalib/bar.jar",
7659 "javalib/foo.jar",
7660 "etc/permissions/foo.xml",
7661 })
7662
7663 // The bar library should depend on the implementation jar.
7664 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007665 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007666 t.Errorf("expected %q, found %#q", expected, actual)
7667 }
7668}
7669
7670func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007671 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007672 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7673 apex {
7674 name: "myapex",
7675 key: "myapex.key",
7676 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007677 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007678 }
7679
7680 apex_key {
7681 name: "myapex.key",
7682 public_key: "testkey.avbpubkey",
7683 private_key: "testkey.pem",
7684 }
7685
7686 java_sdk_library_import {
7687 name: "foo",
7688 apex_available: ["myapex"],
7689 prefer: true,
7690 public: {
7691 jars: ["a.jar"],
7692 },
7693 }
7694
7695 `, withFiles(filesForSdkLibrary))
7696}
7697
atrost6e126252020-01-27 17:01:16 +00007698func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007699 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007700 result := android.GroupFixturePreparers(
7701 prepareForApexTest,
7702 java.PrepareForTestWithPlatformCompatConfig,
7703 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007704 apex {
7705 name: "myapex",
7706 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007707 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007708 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007709 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007710 }
7711
7712 apex_key {
7713 name: "myapex.key",
7714 public_key: "testkey.avbpubkey",
7715 private_key: "testkey.pem",
7716 }
7717
7718 platform_compat_config {
7719 name: "myjar-platform-compat-config",
7720 src: ":myjar",
7721 }
7722
7723 java_library {
7724 name: "myjar",
7725 srcs: ["foo/bar/MyClass.java"],
7726 sdk_version: "none",
7727 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007728 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007729 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007730 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007731
7732 // Make sure that a preferred prebuilt does not affect the apex contents.
7733 prebuilt_platform_compat_config {
7734 name: "myjar-platform-compat-config",
7735 metadata: "compat-config/metadata.xml",
7736 prefer: true,
7737 }
atrost6e126252020-01-27 17:01:16 +00007738 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007739 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007740 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007741 "etc/compatconfig/myjar-platform-compat-config.xml",
7742 "javalib/myjar.jar",
7743 })
7744}
7745
Jooyung Han862c0d62022-12-21 10:15:37 +09007746func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007747 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007748 android.GroupFixturePreparers(
7749 android.PrepareForTestWithAndroidBuildComponents,
7750 PrepareForTestWithApexBuildComponents,
7751 prepareForTestWithMyapex,
7752 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7753 ).
7754 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7755 RunTestWithBp(t, `
7756 apex {
7757 name: "myapex",
7758 key: "myapex.key",
7759 prebuilts: ["foo", "bar"],
7760 updatable: false,
7761 }
7762
7763 apex_key {
7764 name: "myapex.key",
7765 public_key: "testkey.avbpubkey",
7766 private_key: "testkey.pem",
7767 }
7768
7769 prebuilt_etc {
7770 name: "foo",
7771 src: "myprebuilt",
7772 filename_from_src: true,
7773 }
7774
7775 prebuilt_etc {
7776 name: "bar",
7777 src: "myprebuilt",
7778 filename_from_src: true,
7779 }
7780 `)
7781}
7782
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007783func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007784 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007785 bp := `
7786 apex {
7787 name: "myapex",
7788 key: "myapex.key",
7789 native_shared_libs: ["libfoo"],
7790 updatable: false,
7791 unwanted_transitive_deps: ["libbar"],
7792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 cc_library {
7801 name: "libfoo",
7802 srcs: ["foo.cpp"],
7803 shared_libs: ["libbar"],
7804 apex_available: ["myapex"],
7805 }
7806
7807 cc_library {
7808 name: "libbar",
7809 srcs: ["bar.cpp"],
7810 apex_available: ["myapex"],
7811 }`
7812 ctx := testApex(t, bp)
7813 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7814 "*/libc++.so",
7815 "*/libfoo.so",
7816 // not libbar.so
7817 })
7818}
7819
Jiyong Park479321d2019-12-16 11:47:12 +09007820func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007821 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007822 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7823 apex {
7824 name: "myapex",
7825 key: "myapex.key",
7826 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007827 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007828 }
7829
7830 apex_key {
7831 name: "myapex.key",
7832 public_key: "testkey.avbpubkey",
7833 private_key: "testkey.pem",
7834 }
7835
7836 java_library {
7837 name: "myjar",
7838 srcs: ["foo/bar/MyClass.java"],
7839 sdk_version: "none",
7840 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007841 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007842 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007843 }
7844 `)
7845}
7846
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007848 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007849 bp := `
7850 apex {
7851 name: "myapex",
7852 key: "myapex.key",
7853 native_shared_libs: ["mylib"],
7854 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007855 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007856 }
7857
Jiyong Park9d677202020-02-19 16:29:35 +09007858 apex {
7859 name: "myapex.updatable",
7860 key: "myapex.key",
7861 native_shared_libs: ["mylib"],
7862 java_libs: ["myjar"],
7863 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007864 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007865 }
7866
Jiyong Park7cd10e32020-01-14 09:22:18 +09007867 apex_key {
7868 name: "myapex.key",
7869 public_key: "testkey.avbpubkey",
7870 private_key: "testkey.pem",
7871 }
7872
7873 cc_library {
7874 name: "mylib",
7875 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007876 shared_libs: [
7877 "myotherlib",
7878 "myotherlib_ext",
7879 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007880 system_shared_libs: [],
7881 stl: "none",
7882 apex_available: [
7883 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007884 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007885 "//apex_available:platform",
7886 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007887 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007888 }
7889
7890 cc_library {
7891 name: "myotherlib",
7892 srcs: ["mylib.cpp"],
7893 system_shared_libs: [],
7894 stl: "none",
7895 apex_available: [
7896 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007897 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007898 "//apex_available:platform",
7899 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007900 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007901 }
7902
Jiyong Parkce243632023-02-17 18:22:25 +09007903 cc_library {
7904 name: "myotherlib_ext",
7905 srcs: ["mylib.cpp"],
7906 system_shared_libs: [],
7907 system_ext_specific: true,
7908 stl: "none",
7909 apex_available: [
7910 "myapex",
7911 "myapex.updatable",
7912 "//apex_available:platform",
7913 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007914 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007915 }
7916
Jiyong Park7cd10e32020-01-14 09:22:18 +09007917 java_library {
7918 name: "myjar",
7919 srcs: ["foo/bar/MyClass.java"],
7920 sdk_version: "none",
7921 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007922 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007923 apex_available: [
7924 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007925 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007926 "//apex_available:platform",
7927 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007928 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08007929 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007930 }
7931
7932 java_library {
7933 name: "myotherjar",
7934 srcs: ["foo/bar/MyClass.java"],
7935 sdk_version: "none",
7936 system_modules: "none",
7937 apex_available: [
7938 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007939 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007940 "//apex_available:platform",
7941 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007942 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007943 }
7944 `
7945
7946 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7947 for _, f := range files {
7948 if f.path == file {
7949 if f.isLink {
7950 t.Errorf("%q is not a real file", file)
7951 }
7952 return
7953 }
7954 }
7955 t.Errorf("%q is not found", file)
7956 }
7957
Jiyong Parkce243632023-02-17 18:22:25 +09007958 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 for _, f := range files {
7960 if f.path == file {
7961 if !f.isLink {
7962 t.Errorf("%q is not a symlink", file)
7963 }
Jiyong Parkce243632023-02-17 18:22:25 +09007964 if f.src != target {
7965 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7966 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967 return
7968 }
7969 }
7970 t.Errorf("%q is not found", file)
7971 }
7972
Jiyong Park9d677202020-02-19 16:29:35 +09007973 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7974 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007975 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007976 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007977 ensureRealfileExists(t, files, "javalib/myjar.jar")
7978 ensureRealfileExists(t, files, "lib64/mylib.so")
7979 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007980 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007981
Jooyung Hana0503a52023-08-23 13:12:50 +09007982 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007983 ensureRealfileExists(t, files, "javalib/myjar.jar")
7984 ensureRealfileExists(t, files, "lib64/mylib.so")
7985 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007986 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007987
7988 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007989 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007990 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007991 ensureRealfileExists(t, files, "javalib/myjar.jar")
7992 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007993 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7994 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007995
Jooyung Hana0503a52023-08-23 13:12:50 +09007996 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007997 ensureRealfileExists(t, files, "javalib/myjar.jar")
7998 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007999 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8000 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008001}
8002
Yo Chiange8128052020-07-23 20:09:18 +08008003func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008004 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008005 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008006 apex {
8007 name: "myapex",
8008 key: "myapex.key",
8009 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008010 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008011 }
8012
8013 apex_key {
8014 name: "myapex.key",
8015 public_key: "testkey.avbpubkey",
8016 private_key: "testkey.pem",
8017 }
8018
8019 cc_library_shared {
8020 name: "mylib",
8021 srcs: ["mylib.cpp"],
8022 shared_libs: ["myotherlib"],
8023 system_shared_libs: [],
8024 stl: "none",
8025 apex_available: [
8026 "myapex",
8027 "//apex_available:platform",
8028 ],
8029 }
8030
8031 cc_prebuilt_library_shared {
8032 name: "myotherlib",
8033 srcs: ["prebuilt.so"],
8034 system_shared_libs: [],
8035 stl: "none",
8036 apex_available: [
8037 "myapex",
8038 "//apex_available:platform",
8039 ],
8040 }
8041 `)
8042
Jooyung Hana0503a52023-08-23 13:12:50 +09008043 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008044 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008045 var builder strings.Builder
8046 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8047 androidMk := builder.String()
8048 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008049 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008050 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8051 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8052 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008053 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008054}
8055
Jooyung Han643adc42020-02-27 13:50:06 +09008056func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008057 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008058 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008059 apex {
8060 name: "myapex",
8061 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008062 binaries: ["mybin"],
8063 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008064 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008065 }
8066
8067 apex_key {
8068 name: "myapex.key",
8069 public_key: "testkey.avbpubkey",
8070 private_key: "testkey.pem",
8071 }
8072
8073 cc_library {
8074 name: "mylib",
8075 srcs: ["mylib.cpp"],
8076 shared_libs: ["mylib2"],
8077 system_shared_libs: [],
8078 stl: "none",
8079 apex_available: [ "myapex" ],
8080 }
8081
8082 cc_library {
8083 name: "mylib2",
8084 srcs: ["mylib.cpp"],
8085 system_shared_libs: [],
8086 stl: "none",
8087 apex_available: [ "myapex" ],
8088 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008089
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008090 // Used as both a JNI library and a regular shared library.
8091 cc_library {
8092 name: "mylib3",
8093 srcs: ["mylib.cpp"],
8094 system_shared_libs: [],
8095 stl: "none",
8096 apex_available: [ "myapex" ],
8097 }
8098
8099 cc_binary {
8100 name: "mybin",
8101 srcs: ["mybin.cpp"],
8102 shared_libs: ["mylib3"],
8103 system_shared_libs: [],
8104 stl: "none",
8105 apex_available: [ "myapex" ],
8106 }
8107
Jiyong Park34d5c332022-02-24 18:02:44 +09008108 rust_ffi_shared {
8109 name: "libfoo.rust",
8110 crate_name: "foo",
8111 srcs: ["foo.rs"],
8112 shared_libs: ["libfoo.shared_from_rust"],
8113 prefer_rlib: true,
8114 apex_available: ["myapex"],
8115 }
8116
8117 cc_library_shared {
8118 name: "libfoo.shared_from_rust",
8119 srcs: ["mylib.cpp"],
8120 system_shared_libs: [],
8121 stl: "none",
8122 stubs: {
8123 versions: ["10", "11", "12"],
8124 },
8125 }
8126
Jooyung Han643adc42020-02-27 13:50:06 +09008127 `)
8128
Jooyung Hana0503a52023-08-23 13:12:50 +09008129 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008130 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008131 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008132 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008133 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008134 "lib64/mylib.so",
8135 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008136 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008137 "lib64/libfoo.rust.so",
8138 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8139 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008140 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008141
8142 // b/220397949
8143 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008144}
8145
Jooyung Han49f67012020-04-17 13:43:10 +09008146func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008147 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008148 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008149 apex {
8150 name: "myapex",
8151 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008152 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008153 }
8154 apex_key {
8155 name: "myapex.key",
8156 public_key: "testkey.avbpubkey",
8157 private_key: "testkey.pem",
8158 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008159 `,
8160 android.FixtureModifyConfig(func(config android.Config) {
8161 delete(config.Targets, android.Android)
8162 config.AndroidCommonTarget = android.Target{}
8163 }),
8164 )
Jooyung Han49f67012020-04-17 13:43:10 +09008165
8166 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8167 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8168 }
8169}
8170
Jiyong Parkbd159612020-02-28 15:22:21 +09008171func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008172 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008173 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008174 apex {
8175 name: "myapex",
8176 key: "myapex.key",
8177 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008178 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008179 }
8180
8181 apex_key {
8182 name: "myapex.key",
8183 public_key: "testkey.avbpubkey",
8184 private_key: "testkey.pem",
8185 }
8186
8187 android_app {
8188 name: "AppFoo",
8189 srcs: ["foo/bar/MyClass.java"],
8190 sdk_version: "none",
8191 system_modules: "none",
8192 apex_available: [ "myapex" ],
8193 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008194 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008195
Jooyung Hana0503a52023-08-23 13:12:50 +09008196 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008197 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008198
8199 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008200 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 +09008201}
8202
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008203func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008204 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008205 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008206 apex {
8207 name: "myapex",
8208 key: "myapex.key",
8209 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008210 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008211 }
8212
8213 apex_key {
8214 name: "myapex.key",
8215 public_key: "testkey.avbpubkey",
8216 private_key: "testkey.pem",
8217 }
8218
8219 android_app_set {
8220 name: "AppSet",
8221 set: "AppSet.apks",
8222 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008223 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008224 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008225 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008226 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8227 s := mod.Rule("apexRule").Args["copy_commands"]
8228 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008229 if len(copyCmds) != 4 {
8230 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008231 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008232 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8233 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008234 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8235 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008236
8237 // Ensure that canned_fs_config has an entry for the app set zip file
8238 generateFsRule := mod.Rule("generateFsConfig")
8239 cmd := generateFsRule.RuleParams.Command
8240 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008241}
8242
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008243func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008244 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008245 apex_set {
8246 name: "myapex",
8247 filename: "foo_v2.apex",
8248 sanitized: {
8249 none: { set: "myapex.apks", },
8250 hwaddress: { set: "myapex.hwasan.apks", },
8251 },
Paul Duffin24704672021-04-06 16:09:30 +01008252 }
8253 `
8254 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008255
Paul Duffin24704672021-04-06 16:09:30 +01008256 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008257 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008258
Spandan Das9d6e2092024-09-21 02:50:00 +00008259 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008260 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008261
Paul Duffin24704672021-04-06 16:09:30 +01008262 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8263
8264 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008265 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8266 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008267
8268 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008269}
8270
Pranav Guptaeba03b02022-09-27 00:27:08 +00008271func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008272 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008273 ctx := testApex(t, `
8274 apex_set {
8275 name: "myapex",
8276 set: ":myapex_apks_file",
8277 }
8278
8279 filegroup {
8280 name: "myapex_apks_file",
8281 srcs: ["myapex.apks"],
8282 }
8283 `)
8284
Spandan Das9d6e2092024-09-21 02:50:00 +00008285 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008286
8287 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008288 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008289 extractedApex := m.Output(extractorOutput)
8290
8291 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8292}
8293
Paul Duffin89f570a2021-06-16 01:42:33 +01008294func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008295 t.Helper()
8296
Paul Duffin55607122021-03-30 23:32:51 +01008297 fs := android.MockFS{
8298 "a.java": nil,
8299 "a.jar": nil,
8300 "apex_manifest.json": nil,
8301 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008302 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008303 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8304 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8305 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008306 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008307 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008308
Paul Duffin55607122021-03-30 23:32:51 +01008309 errorHandler := android.FixtureExpectsNoErrors
8310 if errmsg != "" {
8311 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008312 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008313
Paul Duffin55607122021-03-30 23:32:51 +01008314 result := android.GroupFixturePreparers(
8315 cc.PrepareForTestWithCcDefaultModules,
8316 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008317 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008318 java.PrepareForTestWithJavaSdkLibraryFiles,
8319 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008320 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008321 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008322 android.FixtureModifyMockFS(func(fs android.MockFS) {
8323 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8324 insert := ""
8325 for _, fragment := range fragments {
8326 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8327 }
8328 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8329 platform_bootclasspath {
8330 name: "platform-bootclasspath",
8331 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008332 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008333 %s
8334 ],
8335 }
8336 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008337 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008338 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008339 // Dexpreopt for boot jars requires the ART boot image profile.
8340 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8341 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008342 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008343 ).
8344 ExtendWithErrorHandler(errorHandler).
8345 RunTestWithBp(t, bp)
8346
8347 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008348}
8349
Jooyung Han548640b2020-04-27 12:10:30 +09008350func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008351 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008352 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8353 apex {
8354 name: "myapex",
8355 key: "myapex.key",
8356 updatable: true,
8357 }
8358
8359 apex_key {
8360 name: "myapex.key",
8361 public_key: "testkey.avbpubkey",
8362 private_key: "testkey.pem",
8363 }
8364 `)
8365}
8366
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008367func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008368 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008369 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8370 apex {
8371 name: "myapex",
8372 key: "myapex.key",
8373 }
8374
8375 apex_key {
8376 name: "myapex.key",
8377 public_key: "testkey.avbpubkey",
8378 private_key: "testkey.pem",
8379 }
8380 `)
8381}
8382
satayevb98371c2021-06-15 16:49:50 +01008383func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008384 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008385 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8386 apex {
8387 name: "myapex",
8388 key: "myapex.key",
8389 systemserverclasspath_fragments: [
8390 "mysystemserverclasspathfragment",
8391 ],
8392 min_sdk_version: "29",
8393 updatable: true,
8394 }
8395
8396 apex_key {
8397 name: "myapex.key",
8398 public_key: "testkey.avbpubkey",
8399 private_key: "testkey.pem",
8400 }
8401
8402 java_library {
8403 name: "foo",
8404 srcs: ["b.java"],
8405 min_sdk_version: "29",
8406 installable: true,
8407 apex_available: [
8408 "myapex",
8409 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008410 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008411 }
8412
8413 systemserverclasspath_fragment {
8414 name: "mysystemserverclasspathfragment",
8415 generate_classpaths_proto: false,
8416 contents: [
8417 "foo",
8418 ],
8419 apex_available: [
8420 "myapex",
8421 ],
8422 }
satayevabcd5972021-08-06 17:49:46 +01008423 `,
8424 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8425 )
satayevb98371c2021-06-15 16:49:50 +01008426}
8427
Paul Duffin064b70c2020-11-02 17:32:38 +00008428func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008429 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008430 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008431 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008432 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008433 fragment := java.ApexVariantReference{
8434 Apex: proptools.StringPtr("myapex"),
8435 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8436 }
8437
Paul Duffin064b70c2020-11-02 17:32:38 +00008438 testDexpreoptWithApexes(t, `
8439 prebuilt_apex {
8440 name: "myapex" ,
8441 arch: {
8442 arm64: {
8443 src: "myapex-arm64.apex",
8444 },
8445 arm: {
8446 src: "myapex-arm.apex",
8447 },
8448 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008449 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8450 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008451
Paul Duffin89f570a2021-06-16 01:42:33 +01008452 prebuilt_bootclasspath_fragment {
8453 name: "my-bootclasspath-fragment",
8454 contents: ["libfoo"],
8455 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008456 hidden_api: {
8457 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8458 metadata: "my-bootclasspath-fragment/metadata.csv",
8459 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008460 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8461 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8462 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008463 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008464 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008465
Spandan Das52c01a12024-09-20 01:09:48 +00008466 java_sdk_library_import {
8467 name: "libfoo",
8468 prefer: true,
8469 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008470 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008471 },
8472 apex_available: ["myapex"],
8473 shared_library: false,
8474 permitted_packages: ["libfoo"],
8475 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008476 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008477 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008478}
8479
Spandan Dasf14e2542021-11-12 00:01:37 +00008480func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008481 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008482 bp += `
8483 apex_key {
8484 name: "myapex.key",
8485 public_key: "testkey.avbpubkey",
8486 private_key: "testkey.pem",
8487 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008488 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008489 "lib1/src/A.java": nil,
8490 "lib2/src/B.java": nil,
8491 "system/sepolicy/apex/myapex-file_contexts": nil,
8492 }
8493
Paul Duffin45338f02021-03-30 23:07:52 +01008494 errorHandler := android.FixtureExpectsNoErrors
8495 if errmsg != "" {
8496 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008497 }
Colin Crossae8600b2020-10-29 17:09:13 -07008498
Paul Duffin45338f02021-03-30 23:07:52 +01008499 android.GroupFixturePreparers(
8500 android.PrepareForTestWithAndroidBuildComponents,
8501 java.PrepareForTestWithJavaBuildComponents,
8502 PrepareForTestWithApexBuildComponents,
8503 android.PrepareForTestWithNeverallowRules(rules),
8504 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008505 apexBootJars := make([]string, 0, len(bootJars))
8506 for _, apexBootJar := range bootJars {
8507 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008508 }
satayevd604b212021-07-21 14:23:52 +01008509 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008510 }),
8511 fs.AddToFixture(),
8512 ).
8513 ExtendWithErrorHandler(errorHandler).
8514 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008515}
8516
8517func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008518 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008519 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008520 name string
8521 expectedError string
8522 bp string
8523 bootJars []string
8524 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008525 }{
8526
8527 {
8528 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8529 expectedError: "",
8530 bp: `
8531 java_library {
8532 name: "bcp_lib1",
8533 srcs: ["lib1/src/*.java"],
8534 permitted_packages: ["foo.bar"],
8535 apex_available: ["myapex"],
8536 sdk_version: "none",
8537 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008538 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008539 }
8540 java_library {
8541 name: "nonbcp_lib2",
8542 srcs: ["lib2/src/*.java"],
8543 apex_available: ["myapex"],
8544 permitted_packages: ["a.b"],
8545 sdk_version: "none",
8546 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008547 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008548 }
8549 apex {
8550 name: "myapex",
8551 key: "myapex.key",
8552 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008553 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008554 }`,
8555 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008556 bcpPermittedPackages: map[string][]string{
8557 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008558 "foo.bar",
8559 },
8560 },
8561 },
8562 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008563 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008564 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 +01008565 bp: `
8566 java_library {
8567 name: "bcp_lib1",
8568 srcs: ["lib1/src/*.java"],
8569 apex_available: ["myapex"],
8570 permitted_packages: ["foo.bar"],
8571 sdk_version: "none",
8572 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008573 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008574 }
8575 java_library {
8576 name: "bcp_lib2",
8577 srcs: ["lib2/src/*.java"],
8578 apex_available: ["myapex"],
8579 permitted_packages: ["foo.bar", "bar.baz"],
8580 sdk_version: "none",
8581 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008582 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008583 }
8584 apex {
8585 name: "myapex",
8586 key: "myapex.key",
8587 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008588 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008589 }
8590 `,
8591 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008592 bcpPermittedPackages: map[string][]string{
8593 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008594 "foo.bar",
8595 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008596 "bcp_lib2": []string{
8597 "foo.bar",
8598 },
8599 },
8600 },
8601 {
8602 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8603 expectedError: "",
8604 bp: `
8605 java_library {
8606 name: "bcp_lib_restricted",
8607 srcs: ["lib1/src/*.java"],
8608 apex_available: ["myapex"],
8609 permitted_packages: ["foo.bar"],
8610 sdk_version: "none",
8611 min_sdk_version: "29",
8612 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008613 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008614 }
8615 java_library {
8616 name: "bcp_lib_unrestricted",
8617 srcs: ["lib2/src/*.java"],
8618 apex_available: ["myapex"],
8619 permitted_packages: ["foo.bar", "bar.baz"],
8620 sdk_version: "none",
8621 min_sdk_version: "29",
8622 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008623 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008624 }
8625 apex {
8626 name: "myapex",
8627 key: "myapex.key",
8628 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8629 updatable: true,
8630 min_sdk_version: "29",
8631 }
8632 `,
8633 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8634 bcpPermittedPackages: map[string][]string{
8635 "bcp_lib1_non_updateable": []string{
8636 "foo.bar",
8637 },
8638 // 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 +01008639 },
8640 },
8641 }
8642 for _, tc := range testcases {
8643 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008644 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008645 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8646 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008647 })
8648 }
8649}
8650
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008651// TODO(jungjw): Move this to proptools
8652func intPtr(i int) *int {
8653 return &i
8654}
8655
8656func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008658 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008659 apex_set {
8660 name: "myapex",
8661 set: "myapex.apks",
8662 filename: "foo_v2.apex",
8663 overrides: ["foo"],
8664 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008665 `,
8666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8667 variables.Platform_sdk_version = intPtr(30)
8668 }),
8669 android.FixtureModifyConfig(func(config android.Config) {
8670 config.Targets[android.Android] = []android.Target{
8671 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8672 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8673 }
8674 }),
8675 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008676
Spandan Das9d6e2092024-09-21 02:50:00 +00008677 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008678
8679 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008680 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008681 actual := extractedApex.Args["abis"]
8682 expected := "ARMEABI_V7A,ARM64_V8A"
8683 if actual != expected {
8684 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8685 }
8686 actual = extractedApex.Args["sdk-version"]
8687 expected = "30"
8688 if actual != expected {
8689 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8690 }
8691
Paul Duffin6717d882021-06-15 19:09:41 +01008692 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008693 a := m.Module().(*ApexSet)
8694 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008695 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008696 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8697 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8698 }
8699}
8700
Anton Hansson805e0a52022-11-25 14:06:46 +00008701func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008702 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008703 ctx := testApex(t, `
8704 apex_set {
8705 name: "myapex",
8706 set: "myapex.apks",
8707 filename: "foo_v2.apex",
8708 overrides: ["foo"],
8709 }
8710 `,
8711 android.FixtureModifyConfig(func(config android.Config) {
8712 config.Targets[android.Android] = []android.Target{
8713 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8714 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8715 }
8716 }),
8717 )
8718
Spandan Das9d6e2092024-09-21 02:50:00 +00008719 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008720
8721 // Check extract_apks tool parameters. No native bridge arch expected
8722 extractedApex := m.Output("extracted/myapex.apks")
8723 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8724}
8725
Jiyong Park7d95a512020-05-10 15:16:24 +09008726func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008727 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008728 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8729 apex {
8730 name: "myapex",
8731 key: "myapex.key",
8732 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008733 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008734 }
8735
8736 apex_key {
8737 name: "myapex.key",
8738 public_key: "testkey.avbpubkey",
8739 private_key: "testkey.pem",
8740 }
8741
8742 cc_library {
8743 name: "mylib",
8744 srcs: ["mylib.cpp"],
8745 static_libs: ["otherlib"],
8746 system_shared_libs: [],
8747 stl: "none",
8748 apex_available: [ "myapex" ],
8749 }
8750
8751 cc_library {
8752 name: "otherlib",
8753 srcs: ["mylib.cpp"],
8754 system_shared_libs: [],
8755 stl: "none",
8756 stubs: {
8757 versions: ["1", "2", "3"],
8758 },
8759 apex_available: [ "myapex" ],
8760 }
8761 `)
8762}
8763
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008764func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008765 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008766 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008767 apex {
8768 name: "myapex",
8769 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008770 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008771 custom_sign_tool: "sign_myapex",
8772 }
8773
8774 apex_key {
8775 name: "myapex.key",
8776 public_key: "testkey.avbpubkey",
8777 private_key: "testkey.pem",
8778 }
8779 `)
8780
Jooyung Han286957d2023-10-30 16:17:56 +09008781 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008782 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008783 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 +09008784}
8785
8786func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008787 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008788 ctx := testApex(t, `
8789 apex {
8790 name: "myapex",
8791 key: "myapex.key",
8792 updatable: false,
8793 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008794 }
8795
8796 apex_key {
8797 name: "myapex.key",
8798 public_key: "testkey.avbpubkey",
8799 private_key: "testkey.pem",
8800 }
8801
8802 prebuilt_apex {
8803 name: "myapex",
8804 prefer: true,
8805 arch: {
8806 arm64: {
8807 src: "myapex-arm64.apex",
8808 },
8809 arm: {
8810 src: "myapex-arm.apex",
8811 },
8812 },
8813 }
8814
8815 apex_set {
8816 name: "myapex_set",
8817 set: "myapex.apks",
8818 filename: "myapex_set.apex",
8819 overrides: ["myapex"],
8820 }
8821 `)
8822
Colin Crossf61d03d2023-11-02 16:56:39 -07008823 content := android.ContentFromFileRuleForTests(t, ctx,
8824 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008825 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 -07008826 content = android.ContentFromFileRuleForTests(t, ctx,
8827 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008828 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 +09008829}
8830
Jooyung Han938b5932020-06-20 12:47:47 +09008831func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008832 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008833 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008834 apex {
8835 name: "myapex",
8836 key: "myapex.key",
8837 apps: ["app"],
8838 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008839 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008840 }
8841
8842 apex_key {
8843 name: "myapex.key",
8844 public_key: "testkey.avbpubkey",
8845 private_key: "testkey.pem",
8846 }
8847
8848 android_app {
8849 name: "app",
8850 srcs: ["foo/bar/MyClass.java"],
8851 package_name: "foo",
8852 sdk_version: "none",
8853 system_modules: "none",
8854 apex_available: [ "myapex" ],
8855 }
8856 `, withFiles(map[string][]byte{
8857 "sub/Android.bp": []byte(`
8858 override_apex {
8859 name: "override_myapex",
8860 base: "myapex",
8861 apps: ["override_app"],
8862 allowed_files: ":allowed",
8863 }
8864 // Overridable "path" property should be referenced indirectly
8865 filegroup {
8866 name: "allowed",
8867 srcs: ["allowed.txt"],
8868 }
8869 override_android_app {
8870 name: "override_app",
8871 base: "app",
8872 package_name: "bar",
8873 }
8874 `),
8875 }))
8876
Jooyung Hana0503a52023-08-23 13:12:50 +09008877 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008878 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8879 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8880 }
8881
Spandan Das50801e22024-05-13 18:29:45 +00008882 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008883 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8884 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8885 }
8886}
8887
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008888func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008889 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008890 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008891 apex {
8892 name: "myapex",
8893 key: "myapex.key",
8894 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008895 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008896 }
8897
8898 apex_key {
8899 name: "myapex.key",
8900 public_key: "testkey.avbpubkey",
8901 private_key: "testkey.pem",
8902 }
8903
8904 cc_library {
8905 name: "mylib",
8906 srcs: ["mylib.cpp"],
8907 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008908 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008909 },
8910 apex_available: ["myapex"],
8911 }
8912
8913 cc_prebuilt_library_shared {
8914 name: "mylib",
8915 prefer: false,
8916 srcs: ["prebuilt.so"],
8917 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008918 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008919 },
8920 apex_available: ["myapex"],
8921 }
8922 `)
8923}
8924
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008925func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008926 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008927 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008928 apex {
8929 name: "myapex",
8930 key: "myapex.key",
8931 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008932 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008933 }
8934 apex_key {
8935 name: "myapex.key",
8936 public_key: "testkey.avbpubkey",
8937 private_key: "testkey.pem",
8938 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008939 `,
8940 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8941 variables.CompressedApex = proptools.BoolPtr(true)
8942 }),
8943 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008944
Jooyung Hana0503a52023-08-23 13:12:50 +09008945 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008946 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8947
Jooyung Hana0503a52023-08-23 13:12:50 +09008948 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008949 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8950
8951 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008952 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008953 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8954
8955 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008956 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008957 var builder strings.Builder
8958 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8959 androidMk := builder.String()
8960 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8961}
8962
Jooyung Hana8fb73b2024-11-25 16:51:25 +09008963func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
8964 t.Parallel()
8965 ctx := testApex(t, `
8966 apex {
8967 name: "myapex",
8968 key: "myapex.key",
8969 compressible: true,
8970 updatable: false,
8971 payload_fs_type: "erofs",
8972 }
8973 apex_key {
8974 name: "myapex.key",
8975 public_key: "testkey.avbpubkey",
8976 private_key: "testkey.pem",
8977 }
8978 `,
8979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8980 variables.CompressedApex = proptools.BoolPtr(true)
8981 }),
8982 )
8983
8984 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
8985 if compressRule.Rule != nil {
8986 t.Error("erofs apex should not be compressed")
8987 }
8988}
8989
Jooyung Han26ec8482024-07-31 15:04:05 +09008990func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008991 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09008992 for _, compressionEnabled := range []bool{true, false} {
8993 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008994 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09008995 ctx := testApex(t, `
8996 apex_set {
8997 name: "com.company.android.myapex",
8998 apex_name: "com.android.myapex",
8999 set: "company-myapex.apks",
9000 }
9001 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9002 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9003 }),
9004 )
9005
9006 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9007 if compressionEnabled {
9008 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9009 } else {
9010 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9011 }
9012 })
9013 }
9014}
9015
Martin Stjernholm2856c662020-12-02 15:03:42 +00009016func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009017 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009018 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009019 apex {
9020 name: "myapex",
9021 key: "myapex.key",
9022 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009023 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009024 }
9025
9026 apex_key {
9027 name: "myapex.key",
9028 public_key: "testkey.avbpubkey",
9029 private_key: "testkey.pem",
9030 }
9031
9032 cc_library {
9033 name: "mylib",
9034 srcs: ["mylib.cpp"],
9035 apex_available: ["myapex"],
9036 shared_libs: ["otherlib"],
9037 system_shared_libs: [],
9038 }
9039
9040 cc_library {
9041 name: "otherlib",
9042 srcs: ["mylib.cpp"],
9043 stubs: {
9044 versions: ["current"],
9045 },
9046 }
9047
9048 cc_prebuilt_library_shared {
9049 name: "otherlib",
9050 prefer: true,
9051 srcs: ["prebuilt.so"],
9052 stubs: {
9053 versions: ["current"],
9054 },
9055 }
9056 `)
9057
Jooyung Hana0503a52023-08-23 13:12:50 +09009058 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009059 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009060 var builder strings.Builder
9061 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9062 androidMk := builder.String()
9063
9064 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9065 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009066 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009067}
9068
Jiyong Parke3867542020-12-03 17:28:25 +09009069func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009070 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009071 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009072 apex {
9073 name: "myapex",
9074 key: "myapex.key",
9075 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009076 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009077 }
9078
9079 apex_key {
9080 name: "myapex.key",
9081 public_key: "testkey.avbpubkey",
9082 private_key: "testkey.pem",
9083 }
9084
9085 cc_library {
9086 name: "mylib",
9087 srcs: ["mylib.cpp"],
9088 system_shared_libs: [],
9089 stl: "none",
9090 apex_available: ["myapex"],
9091 shared_libs: ["mylib2"],
9092 target: {
9093 apex: {
9094 exclude_shared_libs: ["mylib2"],
9095 },
9096 },
9097 }
9098
9099 cc_library {
9100 name: "mylib2",
9101 srcs: ["mylib.cpp"],
9102 system_shared_libs: [],
9103 stl: "none",
9104 }
9105 `)
9106
9107 // Check if mylib is linked to mylib2 for the non-apex target
9108 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9109 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9110
9111 // Make sure that the link doesn't occur for the apex target
9112 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9113 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9114
9115 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009116 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009117 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9118}
9119
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009120func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009121 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009122 bpBase := `
9123 apex {
9124 name: "myapex",
9125 key: "myapex.key",
9126 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009127 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009128 }
9129 apex_key {
9130 name: "myapex.key",
9131 public_key: "testkey.avbpubkey",
9132 private_key: "testkey.pem",
9133 }
9134 cc_library {
9135 name: "mylib",
9136 srcs: ["mylib.cpp"],
9137 apex_available: ["myapex"],
9138 shared_libs: ["stublib"],
9139 system_shared_libs: [],
9140 }
9141 apex {
9142 name: "otherapex",
9143 enabled: %s,
9144 key: "myapex.key",
9145 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009146 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009147 }
9148 `
9149
9150 stublibSourceBp := `
9151 cc_library {
9152 name: "stublib",
9153 srcs: ["mylib.cpp"],
9154 apex_available: ["otherapex"],
9155 system_shared_libs: [],
9156 stl: "none",
9157 stubs: {
9158 versions: ["1"],
9159 },
9160 }
9161 `
9162
9163 stublibPrebuiltBp := `
9164 cc_prebuilt_library_shared {
9165 name: "stublib",
9166 srcs: ["prebuilt.so"],
9167 apex_available: ["otherapex"],
9168 stubs: {
9169 versions: ["1"],
9170 },
9171 %s
9172 }
9173 `
9174
9175 tests := []struct {
9176 name string
9177 stublibBp string
9178 usePrebuilt bool
9179 modNames []string // Modules to collect AndroidMkEntries for
9180 otherApexEnabled []string
9181 }{
9182 {
9183 name: "only_source",
9184 stublibBp: stublibSourceBp,
9185 usePrebuilt: false,
9186 modNames: []string{"stublib"},
9187 otherApexEnabled: []string{"true", "false"},
9188 },
9189 {
9190 name: "source_preferred",
9191 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9192 usePrebuilt: false,
9193 modNames: []string{"stublib", "prebuilt_stublib"},
9194 otherApexEnabled: []string{"true", "false"},
9195 },
9196 {
9197 name: "prebuilt_preferred",
9198 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9199 usePrebuilt: true,
9200 modNames: []string{"stublib", "prebuilt_stublib"},
9201 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9202 },
9203 {
9204 name: "only_prebuilt",
9205 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9206 usePrebuilt: true,
9207 modNames: []string{"stublib"},
9208 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9209 },
9210 }
9211
9212 for _, test := range tests {
9213 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009214 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009215 for _, otherApexEnabled := range test.otherApexEnabled {
9216 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009217 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009218 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009219
9220 type modAndMkEntries struct {
9221 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009222 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009223 }
9224 entries := []*modAndMkEntries{}
9225
9226 // Gather shared lib modules that are installable
9227 for _, modName := range test.modNames {
9228 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9229 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9230 continue
9231 }
9232 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009233 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009234 continue
9235 }
Yu Liue70976d2024-10-15 20:45:35 +00009236 info := android.AndroidMkInfoForTest(t, ctx, mod)
9237 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9238 ents = append(ents, info.ExtraInfo...)
9239 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009240 if ent.Disabled {
9241 continue
9242 }
9243 entries = append(entries, &modAndMkEntries{
9244 mod: mod,
9245 mkEntries: ent,
9246 })
9247 }
9248 }
9249 }
9250
9251 var entry *modAndMkEntries = nil
9252 for _, ent := range entries {
9253 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9254 if entry != nil {
9255 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9256 } else {
9257 entry = ent
9258 }
9259 }
9260 }
9261
9262 if entry == nil {
9263 t.Errorf("AndroidMk entry for \"stublib\" missing")
9264 } else {
9265 isPrebuilt := entry.mod.Prebuilt() != nil
9266 if isPrebuilt != test.usePrebuilt {
9267 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9268 }
9269 if !entry.mod.IsStubs() {
9270 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9271 }
9272 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9273 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9274 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009275 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009276 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009277 if !android.InList(expected, cflags) {
9278 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9279 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009280 }
9281 })
9282 }
9283 })
9284 }
9285}
9286
Colin Crossc33e5212021-05-25 18:16:02 -07009287func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009288 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009289 bp := `
9290 apex {
9291 name: "myapex",
9292 key: "myapex.key",
9293 java_libs: ["mylib"],
9294 bootclasspath_fragments: ["mybootclasspathfragment"],
9295 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9296 updatable: false,
9297 }
9298
9299 apex_key {
9300 name: "myapex.key",
9301 public_key: "testkey.avbpubkey",
9302 private_key: "testkey.pem",
9303 }
9304
9305 java_library {
9306 name: "mylib",
9307 srcs: ["mylib.java"],
9308 apex_available: ["myapex"],
9309 compile_dex: true,
9310 }
9311
9312 bootclasspath_fragment {
9313 name: "mybootclasspathfragment",
9314 contents: ["mybootclasspathlib"],
9315 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009316 hidden_api: {
9317 split_packages: ["*"],
9318 },
Colin Crossc33e5212021-05-25 18:16:02 -07009319 }
9320
9321 java_library {
9322 name: "mybootclasspathlib",
9323 srcs: ["mybootclasspathlib.java"],
9324 apex_available: ["myapex"],
9325 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009326 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009327 }
9328
9329 systemserverclasspath_fragment {
9330 name: "mysystemserverclasspathfragment",
9331 contents: ["mysystemserverclasspathlib"],
9332 apex_available: ["myapex"],
9333 }
9334
9335 java_library {
9336 name: "mysystemserverclasspathlib",
9337 srcs: ["mysystemserverclasspathlib.java"],
9338 apex_available: ["myapex"],
9339 compile_dex: true,
9340 }
9341 `
9342
9343 result := android.GroupFixturePreparers(
9344 PrepareForTestWithApexBuildComponents,
9345 prepareForTestWithMyapex,
9346 java.PrepareForTestWithJavaDefaultModules,
9347 android.PrepareForTestWithAndroidBuildComponents,
9348 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009349 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9350 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009351 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009352 ).RunTest(t)
9353
9354 // Make sure jacoco ran on both mylib and mybootclasspathlib
9355 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9356 t.Errorf("Failed to find jacoco rule for mylib")
9357 }
9358 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9359 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9360 }
9361 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9362 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9363 }
9364}
9365
Jiyong Park192600a2021-08-03 07:52:17 +00009366func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009367 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009368 testApexError(t, `executable mybin is static`, `
9369 apex {
9370 name: "myapex",
9371 key: "myapex.key",
9372 binaries: ["mybin"],
9373 min_sdk_version: "29",
9374 }
9375
9376 apex_key {
9377 name: "myapex.key",
9378 public_key: "testkey.avbpubkey",
9379 private_key: "testkey.pem",
9380 }
9381
9382 cc_binary {
9383 name: "mybin",
9384 srcs: ["mylib.cpp"],
9385 relative_install_path: "foo/bar",
9386 static_executable: true,
9387 system_shared_libs: [],
9388 stl: "none",
9389 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009390 min_sdk_version: "29",
9391 }
9392 `)
9393
9394 testApexError(t, `executable mybin.rust is static`, `
9395 apex {
9396 name: "myapex",
9397 key: "myapex.key",
9398 binaries: ["mybin.rust"],
9399 min_sdk_version: "29",
9400 }
9401
9402 apex_key {
9403 name: "myapex.key",
9404 public_key: "testkey.avbpubkey",
9405 private_key: "testkey.pem",
9406 }
9407
9408 rust_binary {
9409 name: "mybin.rust",
9410 srcs: ["foo.rs"],
9411 static_executable: true,
9412 apex_available: ["myapex"],
9413 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009414 }
9415 `)
9416}
9417
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009418func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009419 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009420 ctx := testApex(t, `
9421 apex {
9422 name: "myapex",
9423 key: "myapex.key",
9424 updatable: false,
9425 java_libs: ["foo"],
9426 }
9427
9428 apex_key {
9429 name: "myapex.key",
9430 public_key: "testkey.avbpubkey",
9431 private_key: "testkey.pem",
9432 }
9433
9434 java_library {
9435 name: "foo",
9436 srcs: ["foo.java"],
9437 apex_available: ["myapex"],
9438 installable: true,
9439 }
9440 `,
9441 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9442 )
9443
Jooyung Hana0503a52023-08-23 13:12:50 +09009444 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009445 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9446 var builder strings.Builder
9447 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9448 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009449 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 +00009450}
9451
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009452func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009453 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009454 ctx := testApex(t, `
9455 apex {
9456 name: "myapex",
9457 key: "myapex.key",
9458 updatable: false,
9459 java_libs: ["foo"],
9460 required: ["otherapex"],
9461 }
9462
9463 apex {
9464 name: "otherapex",
9465 key: "myapex.key",
9466 updatable: false,
9467 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009468 }
9469
9470 apex_key {
9471 name: "myapex.key",
9472 public_key: "testkey.avbpubkey",
9473 private_key: "testkey.pem",
9474 }
9475
9476 java_library {
9477 name: "foo",
9478 srcs: ["foo.java"],
9479 apex_available: ["myapex", "otherapex"],
9480 installable: true,
9481 }
9482 `)
9483
Jooyung Hana0503a52023-08-23 13:12:50 +09009484 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009485 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9486 var builder strings.Builder
9487 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9488 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009489 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009490}
9491
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009492func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009493 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009494 ctx := testApex(t, `
9495 apex {
9496 name: "myapex",
9497 key: "myapex.key",
9498 updatable: false,
9499 }
9500
9501 apex_key {
9502 name: "myapex.key",
9503 public_key: "testkey.avbpubkey",
9504 private_key: "testkey.pem",
9505 }
9506 `)
9507
Jooyung Hana0503a52023-08-23 13:12:50 +09009508 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009509 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009510 data := android.AndroidMkDataForTest(t, ctx, bundle)
9511 var builder strings.Builder
9512 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9513 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009514 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009515}
9516
Jooyung Hana6d36672022-02-24 13:58:07 +09009517func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009518 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009519 for _, tc := range []struct {
9520 name string
9521 ref string
9522 expected_data []string
9523 }{
9524 {
9525 name: "test_using_output",
9526 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009527 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009528 },
9529 {
9530 name: "test_using_apex",
9531 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009532 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009533 },
9534 } {
9535 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009536 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009537 ctx := testApex(t, `
9538 apex {
9539 name: "myapex",
9540 key: "myapex.key",
9541 compressible: true,
9542 updatable: false,
9543 }
9544
9545 apex_key {
9546 name: "myapex.key",
9547 public_key: "testkey.avbpubkey",
9548 private_key: "testkey.pem",
9549 }
9550
9551 java_test {
9552 name: "`+tc.name+`",
9553 srcs: ["a.java"],
9554 data: ["`+tc.ref+`"],
9555 }
9556 `,
9557 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9558 variables.CompressedApex = proptools.BoolPtr(true)
9559 }))
9560 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9561 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9562 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9563 })
9564 }
9565}
9566
satayev758968a2021-12-06 11:42:40 +00009567func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009568 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009569 preparer := android.GroupFixturePreparers(
9570 PrepareForTestWithApexBuildComponents,
9571 prepareForTestWithMyapex,
9572 java.PrepareForTestWithJavaSdkLibraryFiles,
9573 java.PrepareForTestWithJavaDefaultModules,
9574 android.PrepareForTestWithAndroidBuildComponents,
9575 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9576 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9577 )
9578
9579 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9580 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009581 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009582 preparer.RunTestWithBp(t, `
9583 apex {
9584 name: "myapex",
9585 key: "myapex.key",
9586 bootclasspath_fragments: ["mybootclasspathfragment"],
9587 min_sdk_version: "30",
9588 updatable: false,
9589 }
9590
9591 apex_key {
9592 name: "myapex.key",
9593 public_key: "testkey.avbpubkey",
9594 private_key: "testkey.pem",
9595 }
9596
9597 bootclasspath_fragment {
9598 name: "mybootclasspathfragment",
9599 contents: ["mybootclasspathlib"],
9600 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009601 hidden_api: {
9602 split_packages: ["*"],
9603 },
satayev758968a2021-12-06 11:42:40 +00009604 }
9605
9606 java_sdk_library {
9607 name: "mybootclasspathlib",
9608 srcs: ["mybootclasspathlib.java"],
9609 apex_available: ["myapex"],
9610 compile_dex: true,
9611 unsafe_ignore_missing_latest_api: true,
9612 min_sdk_version: "31",
9613 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009614 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009615 }
9616
9617 java_library {
9618 name: "util",
9619 srcs: ["a.java"],
9620 apex_available: ["myapex"],
9621 min_sdk_version: "31",
9622 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009623 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009624 }
9625
9626 java_library {
9627 name: "another_util",
9628 srcs: ["a.java"],
9629 min_sdk_version: "31",
9630 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009631 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009632 }
9633 `)
9634 })
9635
9636 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9637 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009638 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009639 preparer.RunTestWithBp(t, `
9640 apex {
9641 name: "myapex",
9642 key: "myapex.key",
9643 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9644 min_sdk_version: "30",
9645 updatable: false,
9646 }
9647
9648 apex_key {
9649 name: "myapex.key",
9650 public_key: "testkey.avbpubkey",
9651 private_key: "testkey.pem",
9652 }
9653
9654 systemserverclasspath_fragment {
9655 name: "mysystemserverclasspathfragment",
9656 contents: ["mysystemserverclasspathlib"],
9657 apex_available: ["myapex"],
9658 }
9659
9660 java_sdk_library {
9661 name: "mysystemserverclasspathlib",
9662 srcs: ["mysystemserverclasspathlib.java"],
9663 apex_available: ["myapex"],
9664 compile_dex: true,
9665 min_sdk_version: "32",
9666 unsafe_ignore_missing_latest_api: true,
9667 static_libs: ["util"],
9668 }
9669
9670 java_library {
9671 name: "util",
9672 srcs: ["a.java"],
9673 apex_available: ["myapex"],
9674 min_sdk_version: "31",
9675 static_libs: ["another_util"],
9676 }
9677
9678 java_library {
9679 name: "another_util",
9680 srcs: ["a.java"],
9681 min_sdk_version: "31",
9682 apex_available: ["myapex"],
9683 }
9684 `)
9685 })
9686
9687 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009688 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009689 preparer.
satayev758968a2021-12-06 11:42:40 +00009690 RunTestWithBp(t, `
9691 apex {
9692 name: "myapex",
9693 key: "myapex.key",
9694 bootclasspath_fragments: ["mybootclasspathfragment"],
9695 min_sdk_version: "30",
9696 updatable: false,
9697 }
9698
9699 apex_key {
9700 name: "myapex.key",
9701 public_key: "testkey.avbpubkey",
9702 private_key: "testkey.pem",
9703 }
9704
9705 bootclasspath_fragment {
9706 name: "mybootclasspathfragment",
9707 contents: ["mybootclasspathlib"],
9708 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009709 hidden_api: {
9710 split_packages: ["*"],
9711 },
satayev758968a2021-12-06 11:42:40 +00009712 }
9713
9714 java_sdk_library {
9715 name: "mybootclasspathlib",
9716 srcs: ["mybootclasspathlib.java"],
9717 apex_available: ["myapex"],
9718 compile_dex: true,
9719 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009720 sdk_version: "current",
9721 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009722 }
9723 `)
9724 })
9725
9726 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009727 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009728 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9729 RunTestWithBp(t, `
9730 apex {
9731 name: "myapex",
9732 key: "myapex.key",
9733 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9734 min_sdk_version: "30",
9735 updatable: false,
9736 }
9737
9738 apex_key {
9739 name: "myapex.key",
9740 public_key: "testkey.avbpubkey",
9741 private_key: "testkey.pem",
9742 }
9743
9744 systemserverclasspath_fragment {
9745 name: "mysystemserverclasspathfragment",
9746 contents: ["mysystemserverclasspathlib"],
9747 apex_available: ["myapex"],
9748 }
9749
9750 java_sdk_library {
9751 name: "mysystemserverclasspathlib",
9752 srcs: ["mysystemserverclasspathlib.java"],
9753 apex_available: ["myapex"],
9754 compile_dex: true,
9755 unsafe_ignore_missing_latest_api: true,
9756 }
9757 `)
9758 })
9759}
9760
Jiakai Zhang6decef92022-01-12 17:56:19 +00009761// Verifies that the APEX depends on all the Make modules in the list.
9762func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9763 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9764 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009765 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009766 }
9767}
9768
9769// Verifies that the APEX does not depend on any of the Make modules in the list.
9770func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9771 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9772 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009773 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009774 }
9775}
9776
Cole Faust24e25c02024-01-19 14:12:17 -08009777func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009778 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009779 bpTemplate := `
9780 apex {
9781 name: "myapex",
9782 key: "myapex.key",
9783 java_libs: ["myjavalib"],
9784 updatable: %v,
9785 min_sdk_version: "29",
9786 }
9787 apex_key {
9788 name: "myapex.key",
9789 }
9790 java_library {
9791 name: "myjavalib",
9792 srcs: ["MyClass.java"],
9793 apex_available: [ "myapex" ],
9794 lint: {
9795 strict_updatability_linting: %v,
9796 %s
9797 },
9798 sdk_version: "current",
9799 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009800 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009801 }
9802 `
9803 fs := android.MockFS{
9804 "lint-baseline.xml": nil,
9805 }
9806
9807 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009808 testCaseName string
9809 apexUpdatable bool
9810 javaStrictUpdtabilityLint bool
9811 lintFileExists bool
9812 disallowedFlagExpectedOnApex bool
9813 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009814 }{
9815 {
Colin Cross87427352024-09-25 15:41:19 -07009816 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9817 apexUpdatable: true,
9818 javaStrictUpdtabilityLint: true,
9819 lintFileExists: false,
9820 disallowedFlagExpectedOnApex: false,
9821 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009822 },
9823 {
Colin Cross87427352024-09-25 15:41:19 -07009824 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9825 apexUpdatable: false,
9826 javaStrictUpdtabilityLint: false,
9827 lintFileExists: true,
9828 disallowedFlagExpectedOnApex: false,
9829 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009830 },
9831 {
Colin Cross87427352024-09-25 15:41:19 -07009832 testCaseName: "non-updatable apex respects strict updatability of javalib",
9833 apexUpdatable: false,
9834 javaStrictUpdtabilityLint: true,
9835 lintFileExists: true,
9836 disallowedFlagExpectedOnApex: false,
9837 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009838 },
9839 {
Colin Cross87427352024-09-25 15:41:19 -07009840 testCaseName: "updatable apex checks strict updatability of javalib",
9841 apexUpdatable: true,
9842 javaStrictUpdtabilityLint: false,
9843 lintFileExists: true,
9844 disallowedFlagExpectedOnApex: true,
9845 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009846 },
9847 }
9848
9849 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009850 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009851 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009852 fixtures := []android.FixturePreparer{}
9853 baselineProperty := ""
9854 if testCase.lintFileExists {
9855 fixtures = append(fixtures, fs.AddToFixture())
9856 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9857 }
9858 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009859
Colin Cross87427352024-09-25 15:41:19 -07009860 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009861
Colin Cross87427352024-09-25 15:41:19 -07009862 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9863 if expectStrictUpdatability {
9864 if m.Rule == nil {
9865 t.Errorf("expected strict updatability check rule on %s", name)
9866 } else {
9867 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9868 m.RuleParams.Command, "--disallowed_issues NewApi")
9869 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9870 m.Inputs.Strings(), "lint-baseline.xml")
9871 }
9872 } else {
9873 if m.Rule != nil {
9874 t.Errorf("expected no strict updatability check rule on %s", name)
9875 }
9876 }
9877 }
9878
9879 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9880 apex := result.ModuleForTests("myapex", "android_common_myapex")
9881 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9882 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9883
9884 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9885 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9886 })
Cole Faust24e25c02024-01-19 14:12:17 -08009887 }
9888}
9889
Cole Faust24e25c02024-01-19 14:12:17 -08009890// checks transtive deps of an apex coming from bootclasspath_fragment
9891func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009892 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009893 bp := `
9894 apex {
9895 name: "myapex",
9896 key: "myapex.key",
9897 bootclasspath_fragments: ["mybootclasspathfragment"],
9898 updatable: true,
9899 min_sdk_version: "29",
9900 }
9901 apex_key {
9902 name: "myapex.key",
9903 }
9904 bootclasspath_fragment {
9905 name: "mybootclasspathfragment",
9906 contents: ["myjavalib"],
9907 apex_available: ["myapex"],
9908 hidden_api: {
9909 split_packages: ["*"],
9910 },
9911 }
9912 java_library {
9913 name: "myjavalib",
9914 srcs: ["MyClass.java"],
9915 apex_available: [ "myapex" ],
9916 sdk_version: "current",
9917 min_sdk_version: "29",
9918 compile_dex: true,
9919 lint: {
9920 baseline_filename: "lint-baseline.xml",
9921 }
9922 }
9923 `
9924 fs := android.MockFS{
9925 "lint-baseline.xml": nil,
9926 }
9927
9928 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -07009929 apex := result.ModuleForTests("myapex", "android_common_myapex")
9930 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
9931 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
9932 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
9933 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
9934 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -08009935}
Spandan Das66773252022-01-15 00:23:18 +00009936
Jihoon Kang784c0052024-06-25 22:15:39 +00009937func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009938 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +00009939 bp := `
9940 apex {
9941 name: "myapex",
9942 key: "myapex.key",
9943 bootclasspath_fragments: ["mybootclasspathfragment"],
9944 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009945 java_libs: [
9946 "jacocoagent",
9947 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009948 }
9949 apex_key {
9950 name: "myapex.key",
9951 }
9952 bootclasspath_fragment {
9953 name: "mybootclasspathfragment",
9954 contents: ["foo"],
9955 apex_available: ["myapex"],
9956 hidden_api: {
9957 split_packages: ["*"],
9958 },
9959 }
9960 java_sdk_library {
9961 name: "foo",
9962 srcs: ["MyClass.java"],
9963 apex_available: [ "myapex" ],
9964 sdk_version: "current",
9965 min_sdk_version: "29",
9966 compile_dex: true,
9967 }
9968 `
9969 fs := android.MockFS{
9970 "lint-baseline.xml": nil,
9971 }
9972
9973 result := android.GroupFixturePreparers(
9974 prepareForApexTest,
9975 java.PrepareForTestWithJavaSdkLibraryFiles,
9976 java.PrepareForTestWithJacocoInstrumentation,
9977 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009978 android.FixtureMergeMockFs(fs),
9979 ).RunTestWithBp(t, bp)
9980
9981 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9982 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9983 android.AssertStringDoesContain(t,
9984 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9985 lintReportInputs, "foo.impl")
9986}
9987
Spandan Das42e89502022-05-06 22:12:55 +00009988// updatable apexes should propagate updatable=true to its apps
9989func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009990 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +00009991 bp := `
9992 apex {
9993 name: "myapex",
9994 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -07009995 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +00009996 apps: [
9997 "myapp",
9998 ],
9999 min_sdk_version: "30",
10000 }
10001 apex_key {
10002 name: "myapex.key",
10003 }
10004 android_app {
10005 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010006 apex_available: [
10007 "myapex",
10008 ],
10009 sdk_version: "current",
10010 min_sdk_version: "30",
10011 }
10012 `
Colin Cross99939e92024-10-01 16:02:46 -070010013 _ = android.GroupFixturePreparers(
10014 prepareForApexTest,
10015 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10016 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010017}
10018
Jingwen Chendea7a642023-03-28 11:30:50 +000010019func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010020 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010021 ctx := testApex(t, `
10022 apex {
10023 name: "myapex",
10024 key: "myapex.key",
10025 updatable: false,
10026 }
10027
10028 apex_key {
10029 name: "myapex.key",
10030 public_key: "testkey.avbpubkey",
10031 private_key: "testkey.pem",
10032 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010033 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010034 generateFsRule := mod.Rule("generateFsConfig")
10035 cmd := generateFsRule.RuleParams.Command
10036
10037 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10038}
10039
10040func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010041 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010042 ctx := testApex(t, `
10043 apex {
10044 name: "myapex",
10045 key: "myapex.key",
10046 canned_fs_config: "my_config",
10047 updatable: false,
10048 }
10049
10050 apex_key {
10051 name: "myapex.key",
10052 public_key: "testkey.avbpubkey",
10053 private_key: "testkey.pem",
10054 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010055 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010056 generateFsRule := mod.Rule("generateFsConfig")
10057 cmd := generateFsRule.RuleParams.Command
10058
10059 // Ensure that canned_fs_config has "cat my_config" at the end
10060 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10061}
Spandan Das20fce2d2023-04-12 17:21:39 +000010062
10063func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010064 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010065 testCases := []struct {
10066 desc string
10067 hasStubs bool
10068 apexAvailable string
10069 expectedError string
10070 }{
10071 {
10072 desc: "non-stub library can have multiple apex_available",
10073 hasStubs: false,
10074 apexAvailable: `["myapex", "otherapex"]`,
10075 },
10076 {
10077 desc: "stub library should not be available to anyapex",
10078 hasStubs: true,
10079 apexAvailable: `["//apex_available:anyapex"]`,
10080 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10081 },
10082 {
10083 desc: "stub library should not be available to multiple apexes",
10084 hasStubs: true,
10085 apexAvailable: `["myapex", "otherapex"]`,
10086 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10087 },
10088 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010089 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 +000010090 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010091 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010092 },
10093 }
10094 bpTemplate := `
10095 cc_library {
10096 name: "libfoo",
10097 %v
10098 apex_available: %v,
10099 }
10100 apex {
10101 name: "myapex",
10102 key: "apex.key",
10103 updatable: false,
10104 native_shared_libs: ["libfoo"],
10105 }
10106 apex {
10107 name: "otherapex",
10108 key: "apex.key",
10109 updatable: false,
10110 }
10111 apex_test {
10112 name: "test_myapex",
10113 key: "apex.key",
10114 updatable: false,
10115 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010116 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010117 }
10118 apex_key {
10119 name: "apex.key",
10120 }
10121 `
10122 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010123 t.Run(tc.desc, func(t *testing.T) {
10124 stubs := ""
10125 if tc.hasStubs {
10126 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10127 }
10128 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10129 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10130 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10131 })
10132 if tc.expectedError == "" {
10133 testApex(t, bp, mockFsFixturePreparer)
10134 } else {
10135 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10136 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010137 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010138 }
10139}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010140
10141func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010142 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010143 context := android.GroupFixturePreparers(
10144 android.PrepareForIntegrationTestWithAndroid,
10145 cc.PrepareForIntegrationTestWithCc,
10146 PrepareForTestWithApexBuildComponents,
10147 prepareForTestWithMyapex,
10148 filesystem.PrepareForTestWithFilesystemBuildComponents,
10149 )
10150 result := context.RunTestWithBp(t, `
10151 android_system_image {
10152 name: "myfilesystem",
10153 deps: [
10154 "libfoo",
10155 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010156 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010157 gen_linker_config: true,
10158 linker_config_srcs: ["linker.config.json"],
10159 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010160 }
10161
10162 cc_library {
10163 name: "libfoo",
10164 shared_libs: [
10165 "libbar",
10166 ],
10167 stl: "none",
10168 }
10169
10170 cc_library {
10171 name: "libbar",
10172 stl: "none",
10173 apex_available: ["myapex"],
10174 }
10175
10176 apex {
10177 name: "myapex",
10178 native_shared_libs: ["libbar"],
10179 key: "myapex.key",
10180 updatable: false,
10181 }
10182
10183 apex_key {
10184 name: "myapex.key",
10185 public_key: "testkey.avbpubkey",
10186 private_key: "testkey.pem",
10187 }
10188 `)
10189
Cole Faust3b806d32024-03-11 15:15:03 -070010190 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010191 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10192 inputs.Strings(),
10193 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10194}
Yu Liueae7b362023-11-16 17:05:47 -080010195
10196var apex_default_bp = `
10197 apex_key {
10198 name: "myapex.key",
10199 public_key: "testkey.avbpubkey",
10200 private_key: "testkey.pem",
10201 }
10202
10203 filegroup {
10204 name: "myapex.manifest",
10205 srcs: ["apex_manifest.json"],
10206 }
10207
10208 filegroup {
10209 name: "myapex.androidmanifest",
10210 srcs: ["AndroidManifest.xml"],
10211 }
10212`
10213
10214func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010215 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010216 ctx := testApex(t, apex_default_bp+`
10217 apex {
10218 name: "myapex",
10219 manifest: ":myapex.manifest",
10220 androidManifest: ":myapex.androidmanifest",
10221 key: "myapex.key",
10222 java_libs: [
10223 "my_java_library_foo",
10224 "my_java_library_bar",
10225 ],
10226 updatable: false,
10227 }
10228
10229 java_library {
10230 name: "my_java_library_foo",
10231 srcs: ["foo/bar/MyClass.java"],
10232 sdk_version: "none",
10233 system_modules: "none",
10234 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010235 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010236 "myapex",
10237 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010238 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010239 }
10240
10241 java_library {
10242 name: "my_java_library_bar",
10243 srcs: ["foo/bar/MyClass.java"],
10244 sdk_version: "none",
10245 system_modules: "none",
10246 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010247 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010248 "myapex",
10249 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010250 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010251 }
10252
10253 aconfig_declarations {
10254 name: "my_aconfig_declarations_foo",
10255 package: "com.example.package",
10256 container: "myapex",
10257 srcs: ["foo.aconfig"],
10258 }
10259
10260 java_aconfig_library {
10261 name: "my_java_aconfig_library_foo",
10262 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010263 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010264 "myapex",
10265 ],
10266 }
10267
10268 aconfig_declarations {
10269 name: "my_aconfig_declarations_bar",
10270 package: "com.example.package",
10271 container: "myapex",
10272 srcs: ["bar.aconfig"],
10273 }
10274
10275 java_aconfig_library {
10276 name: "my_java_aconfig_library_bar",
10277 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010278 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010279 "myapex",
10280 ],
10281 }
10282 `)
10283
10284 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10285 s := mod.Rule("apexRule").Args["copy_commands"]
10286 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010287 if len(copyCmds) != 14 {
10288 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010289 }
10290
Jooyung Hana3fddf42024-09-03 13:22:21 +090010291 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10292 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10293 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10294 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010295 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010296
Yu Liubba555e2024-02-17 00:36:42 +000010297 inputs := []string{
10298 "my_aconfig_declarations_foo/intermediate.pb",
10299 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010300 }
Yu Liubba555e2024-02-17 00:36:42 +000010301 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10302 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10303 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10304 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010305 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010306}
10307
10308func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010309 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010310 ctx := testApex(t, apex_default_bp+`
10311 apex {
10312 name: "myapex",
10313 manifest: ":myapex.manifest",
10314 androidManifest: ":myapex.androidmanifest",
10315 key: "myapex.key",
10316 java_libs: [
10317 "my_java_library_foo",
10318 ],
10319 native_shared_libs: [
10320 "my_cc_library_bar",
10321 ],
10322 binaries: [
10323 "my_cc_binary_baz",
10324 ],
10325 updatable: false,
10326 }
10327
10328 java_library {
10329 name: "my_java_library_foo",
10330 srcs: ["foo/bar/MyClass.java"],
10331 sdk_version: "none",
10332 system_modules: "none",
10333 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010334 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010335 "myapex",
10336 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010337 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010338 }
10339
10340 cc_library {
10341 name: "my_cc_library_bar",
10342 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010343 static_libs: [
10344 "my_cc_aconfig_library_bar",
10345 "my_cc_aconfig_library_baz",
10346 ],
Yu Liueae7b362023-11-16 17:05:47 -080010347 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010348 "myapex",
10349 ],
10350 }
10351
10352 cc_binary {
10353 name: "my_cc_binary_baz",
10354 srcs: ["foo/bar/MyClass.cc"],
10355 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010356 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010357 "myapex",
10358 ],
10359 }
10360
10361 aconfig_declarations {
10362 name: "my_aconfig_declarations_foo",
10363 package: "com.example.package",
10364 container: "myapex",
10365 srcs: ["foo.aconfig"],
10366 }
10367
10368 java_aconfig_library {
10369 name: "my_java_aconfig_library_foo",
10370 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010371 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010372 "myapex",
10373 ],
10374 }
10375
10376 aconfig_declarations {
10377 name: "my_aconfig_declarations_bar",
10378 package: "com.example.package",
10379 container: "myapex",
10380 srcs: ["bar.aconfig"],
10381 }
10382
10383 cc_aconfig_library {
10384 name: "my_cc_aconfig_library_bar",
10385 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010386 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010387 "myapex",
10388 ],
10389 }
10390
10391 aconfig_declarations {
10392 name: "my_aconfig_declarations_baz",
10393 package: "com.example.package",
10394 container: "myapex",
10395 srcs: ["baz.aconfig"],
10396 }
10397
10398 cc_aconfig_library {
10399 name: "my_cc_aconfig_library_baz",
10400 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010401 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010402 "myapex",
10403 ],
10404 }
10405
10406 cc_library {
10407 name: "server_configurable_flags",
10408 srcs: ["server_configurable_flags.cc"],
10409 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010410 cc_library {
10411 name: "libbase",
10412 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010413 apex_available: [
10414 "myapex",
10415 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010416 }
10417 cc_library {
10418 name: "libaconfig_storage_read_api_cc",
10419 srcs: ["libaconfig_storage_read_api_cc.cc"],
10420 }
Yu Liueae7b362023-11-16 17:05:47 -080010421 `)
10422
10423 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10424 s := mod.Rule("apexRule").Args["copy_commands"]
10425 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010426 if len(copyCmds) != 18 {
10427 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010428 }
10429
Jooyung Hana3fddf42024-09-03 13:22:21 +090010430 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10431 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10432 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10433 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010434 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010435
Yu Liubba555e2024-02-17 00:36:42 +000010436 inputs := []string{
10437 "my_aconfig_declarations_foo/intermediate.pb",
10438 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10439 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010440 }
Yu Liubba555e2024-02-17 00:36:42 +000010441 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10442 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10443 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10444 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010445 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010446}
10447
Yu Liucec0e412023-11-30 16:45:50 -080010448func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010449 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010450 ctx := testApex(t, apex_default_bp+`
10451 apex {
10452 name: "myapex",
10453 manifest: ":myapex.manifest",
10454 androidManifest: ":myapex.androidmanifest",
10455 key: "myapex.key",
10456 native_shared_libs: [
10457 "libmy_rust_library",
10458 ],
10459 binaries: [
10460 "my_rust_binary",
10461 ],
10462 rust_dyn_libs: [
10463 "libmy_rust_dylib",
10464 ],
10465 updatable: false,
10466 }
10467
10468 rust_library {
10469 name: "libflags_rust", // test mock
10470 crate_name: "flags_rust",
10471 srcs: ["lib.rs"],
10472 apex_available: [
10473 "myapex",
10474 ],
10475 }
10476
10477 rust_library {
10478 name: "liblazy_static", // test mock
10479 crate_name: "lazy_static",
10480 srcs: ["src/lib.rs"],
10481 apex_available: [
10482 "myapex",
10483 ],
10484 }
10485
Ted Bauer02d475c2024-03-27 20:56:26 +000010486 rust_library {
10487 name: "libaconfig_storage_read_api", // test mock
10488 crate_name: "aconfig_storage_read_api",
10489 srcs: ["src/lib.rs"],
10490 apex_available: [
10491 "myapex",
10492 ],
10493 }
10494
Ted Bauer6ef40db2024-03-29 14:04:10 +000010495 rust_library {
10496 name: "liblogger", // test mock
10497 crate_name: "logger",
10498 srcs: ["src/lib.rs"],
10499 apex_available: [
10500 "myapex",
10501 ],
10502 }
10503
10504 rust_library {
10505 name: "liblog_rust", // test mock
10506 crate_name: "log_rust",
10507 srcs: ["src/lib.rs"],
10508 apex_available: [
10509 "myapex",
10510 ],
10511 }
10512
Yu Liucec0e412023-11-30 16:45:50 -080010513 rust_ffi_shared {
10514 name: "libmy_rust_library",
10515 srcs: ["src/lib.rs"],
10516 rustlibs: ["libmy_rust_aconfig_library_foo"],
10517 crate_name: "my_rust_library",
10518 apex_available: [
10519 "myapex",
10520 ],
10521 }
10522
10523 rust_library_dylib {
10524 name: "libmy_rust_dylib",
10525 srcs: ["foo/bar/MyClass.rs"],
10526 rustlibs: ["libmy_rust_aconfig_library_bar"],
10527 crate_name: "my_rust_dylib",
10528 apex_available: [
10529 "myapex",
10530 ],
10531 }
10532
10533 rust_binary {
10534 name: "my_rust_binary",
10535 srcs: ["foo/bar/MyClass.rs"],
10536 rustlibs: [
10537 "libmy_rust_aconfig_library_baz",
10538 "libmy_rust_dylib",
10539 ],
10540 apex_available: [
10541 "myapex",
10542 ],
10543 }
10544
10545 aconfig_declarations {
10546 name: "my_aconfig_declarations_foo",
10547 package: "com.example.package",
10548 container: "myapex",
10549 srcs: ["foo.aconfig"],
10550 }
10551
10552 aconfig_declarations {
10553 name: "my_aconfig_declarations_bar",
10554 package: "com.example.package",
10555 container: "myapex",
10556 srcs: ["bar.aconfig"],
10557 }
10558
10559 aconfig_declarations {
10560 name: "my_aconfig_declarations_baz",
10561 package: "com.example.package",
10562 container: "myapex",
10563 srcs: ["baz.aconfig"],
10564 }
10565
10566 rust_aconfig_library {
10567 name: "libmy_rust_aconfig_library_foo",
10568 aconfig_declarations: "my_aconfig_declarations_foo",
10569 crate_name: "my_rust_aconfig_library_foo",
10570 apex_available: [
10571 "myapex",
10572 ],
10573 }
10574
10575 rust_aconfig_library {
10576 name: "libmy_rust_aconfig_library_bar",
10577 aconfig_declarations: "my_aconfig_declarations_bar",
10578 crate_name: "my_rust_aconfig_library_bar",
10579 apex_available: [
10580 "myapex",
10581 ],
10582 }
10583
10584 rust_aconfig_library {
10585 name: "libmy_rust_aconfig_library_baz",
10586 aconfig_declarations: "my_aconfig_declarations_baz",
10587 crate_name: "my_rust_aconfig_library_baz",
10588 apex_available: [
10589 "myapex",
10590 ],
10591 }
10592 `)
10593
10594 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10595 s := mod.Rule("apexRule").Args["copy_commands"]
10596 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010597 if len(copyCmds) != 38 {
10598 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010599 }
10600
Jooyung Hana3fddf42024-09-03 13:22:21 +090010601 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10602 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10603 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10604 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010605 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010606
Yu Liubba555e2024-02-17 00:36:42 +000010607 inputs := []string{
10608 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010609 "my_aconfig_declarations_bar/intermediate.pb",
10610 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010611 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10612 }
10613 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10614 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10615 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10616 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010617 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010618}
10619
10620func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10621 aconfigRule := mod.Description(desc)
10622 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010623 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010624 if len(aconfigArgs) != len(inputs) {
10625 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010626 }
Yu Liucec0e412023-11-30 16:45:50 -080010627
Yu Liubba555e2024-02-17 00:36:42 +000010628 ensureEquals(t, container, aconfigRule.Args["container"])
10629 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10630
10631 buildParams := aconfigRule.BuildParams
10632 for _, input := range inputs {
10633 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10634 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010635 }
Yu Liubba555e2024-02-17 00:36:42 +000010636
10637 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010638}
10639
Yu Liueae7b362023-11-16 17:05:47 -080010640func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010641 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010642 ctx := testApex(t, apex_default_bp+`
10643 apex {
10644 name: "myapex",
10645 manifest: ":myapex.manifest",
10646 androidManifest: ":myapex.androidmanifest",
10647 key: "myapex.key",
10648 java_libs: [
10649 "my_java_library_foo",
10650 "other_java_library_bar",
10651 ],
10652 updatable: false,
10653 }
10654
10655 java_library {
10656 name: "my_java_library_foo",
10657 srcs: ["foo/bar/MyClass.java"],
10658 sdk_version: "none",
10659 system_modules: "none",
10660 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010661 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010662 "myapex",
10663 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010664 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010665 }
10666
10667 java_library {
10668 name: "other_java_library_bar",
10669 srcs: ["foo/bar/MyClass.java"],
10670 sdk_version: "none",
10671 system_modules: "none",
10672 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010673 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010674 "myapex",
10675 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010676 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010677 }
10678
10679 aconfig_declarations {
10680 name: "my_aconfig_declarations_foo",
10681 package: "com.example.package",
10682 container: "myapex",
10683 srcs: ["foo.aconfig"],
10684 }
10685
10686 java_aconfig_library {
10687 name: "my_java_aconfig_library_foo",
10688 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010689 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010690 "myapex",
10691 ],
10692 }
10693
10694 aconfig_declarations {
10695 name: "other_aconfig_declarations_bar",
10696 package: "com.example.package",
10697 container: "otherapex",
10698 srcs: ["bar.aconfig"],
10699 }
10700
10701 java_aconfig_library {
10702 name: "other_java_aconfig_library_bar",
10703 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010704 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010705 "myapex",
10706 ],
10707 }
10708 `)
10709
10710 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10711 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10712 s := " " + combineAconfigRule.Args["cache_files"]
10713 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10714 if len(aconfigArgs) != 1 {
10715 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10716 }
10717 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10718
10719 buildParams := combineAconfigRule.BuildParams
10720 if len(buildParams.Inputs) != 1 {
10721 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10722 }
10723 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10724 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10725}
10726
10727func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010728 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010729 ctx := testApex(t, apex_default_bp+`
10730 apex {
10731 name: "myapex",
10732 manifest: ":myapex.manifest",
10733 androidManifest: ":myapex.androidmanifest",
10734 key: "myapex.key",
10735 java_libs: [
10736 "my_java_library_foo",
10737 "my_java_library_bar",
10738 ],
10739 updatable: false,
10740 }
10741
10742 java_library {
10743 name: "my_java_library_foo",
10744 srcs: ["foo/bar/MyClass.java"],
10745 sdk_version: "none",
10746 system_modules: "none",
10747 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010748 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010749 "myapex",
10750 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010751 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010752 }
10753
10754 java_library {
10755 name: "my_java_library_bar",
10756 srcs: ["foo/bar/MyClass.java"],
10757 sdk_version: "none",
10758 system_modules: "none",
10759 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010760 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010761 "myapex",
10762 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010763 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010764 }
10765
10766 aconfig_declarations {
10767 name: "my_aconfig_declarations_foo",
10768 package: "com.example.package",
10769 container: "myapex",
10770 srcs: ["foo.aconfig"],
10771 }
10772
10773 java_aconfig_library {
10774 name: "my_java_aconfig_library_foo",
10775 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010776 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010777 "myapex",
10778 ],
10779 }
10780
10781 java_aconfig_library {
10782 name: "my_java_aconfig_library_bar",
10783 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010784 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010785 "myapex",
10786 ],
10787 }
10788 `)
10789
10790 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10791 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10792 s := " " + combineAconfigRule.Args["cache_files"]
10793 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10794 if len(aconfigArgs) != 1 {
10795 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10796 }
10797 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10798
10799 buildParams := combineAconfigRule.BuildParams
10800 if len(buildParams.Inputs) != 1 {
10801 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10802 }
10803 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10804 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10805}
Spandan Das5be63332023-12-13 00:06:32 +000010806
10807// Test that the boot jars come from the _selected_ apex prebuilt
10808// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10809func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010810 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010811 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10812 t.Helper()
10813 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10814 foundLibfooJar := false
10815 base := stem + ".jar"
10816 for _, output := range s.AllOutputs() {
10817 if filepath.Base(output) == base {
10818 foundLibfooJar = true
10819 buildRule := s.Output(output)
10820 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10821 }
10822 }
10823 if !foundLibfooJar {
10824 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10825 }
10826 }
10827
Spandan Das64c9e0c2023-12-20 20:13:34 +000010828 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10829 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10830 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10831 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10832 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10833 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)
10834 }
10835
10836 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10837 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10838 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10839 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10840 }
10841
Spandan Das5be63332023-12-13 00:06:32 +000010842 bp := `
10843 // Source APEX.
10844
10845 java_library {
10846 name: "framework-foo",
10847 srcs: ["foo.java"],
10848 installable: true,
10849 apex_available: [
10850 "com.android.foo",
10851 ],
10852 }
10853
10854 bootclasspath_fragment {
10855 name: "foo-bootclasspath-fragment",
10856 contents: ["framework-foo"],
10857 apex_available: [
10858 "com.android.foo",
10859 ],
10860 hidden_api: {
10861 split_packages: ["*"],
10862 },
10863 }
10864
10865 apex_key {
10866 name: "com.android.foo.key",
10867 public_key: "com.android.foo.avbpubkey",
10868 private_key: "com.android.foo.pem",
10869 }
10870
10871 apex {
10872 name: "com.android.foo",
10873 key: "com.android.foo.key",
10874 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10875 updatable: false,
10876 }
10877
10878 // Prebuilt APEX.
10879
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010880 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010881 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010882 public: {
10883 jars: ["foo.jar"],
10884 },
Spandan Das5be63332023-12-13 00:06:32 +000010885 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010886 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010887 }
10888
10889 prebuilt_bootclasspath_fragment {
10890 name: "foo-bootclasspath-fragment",
10891 contents: ["framework-foo"],
10892 hidden_api: {
10893 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10894 metadata: "my-bootclasspath-fragment/metadata.csv",
10895 index: "my-bootclasspath-fragment/index.csv",
10896 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10897 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10898 },
10899 apex_available: [
10900 "com.android.foo",
10901 ],
10902 }
10903
10904 prebuilt_apex {
10905 name: "com.android.foo",
10906 apex_name: "com.android.foo",
10907 src: "com.android.foo-arm.apex",
10908 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10909 }
10910
10911 // Another Prebuilt ART APEX
10912 prebuilt_apex {
10913 name: "com.android.foo.v2",
10914 apex_name: "com.android.foo", // Used to determine the API domain
10915 src: "com.android.foo-arm.apex",
10916 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10917 }
10918
10919 // APEX contribution modules
10920
10921 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010922 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010923 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010924 contents: ["com.android.foo"],
10925 }
10926
10927 apex_contributions {
10928 name: "foo.prebuilt.contributions",
10929 api_domain: "com.android.foo",
10930 contents: ["prebuilt_com.android.foo"],
10931 }
10932
10933 apex_contributions {
10934 name: "foo.prebuilt.v2.contributions",
10935 api_domain: "com.android.foo",
10936 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010937 }
10938 `
10939
10940 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010941 desc string
10942 selectedApexContributions string
10943 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010944 }{
10945 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010946 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10947 selectedApexContributions: "foo.source.contributions",
10948 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010949 },
10950 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010951 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10952 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010953 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 +000010954 },
10955 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010956 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10957 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010958 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 +000010959 },
10960 }
10961
10962 fragment := java.ApexVariantReference{
10963 Apex: proptools.StringPtr("com.android.foo"),
10964 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10965 }
10966
10967 for _, tc := range testCases {
10968 preparer := android.GroupFixturePreparers(
10969 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10970 android.FixtureMergeMockFs(map[string][]byte{
10971 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10972 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010973 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10974 // file creation.
10975 java.FixtureConfigureBootJars("platform:foo"),
10976 android.FixtureModifyMockFS(func(fs android.MockFS) {
10977 fs["platform/Android.bp"] = []byte(`
10978 java_library {
10979 name: "foo",
10980 srcs: ["Test.java"],
10981 compile_dex: true,
10982 }
10983 `)
10984 fs["platform/Test.java"] = nil
10985 }),
10986
Colin Crossa66b4632024-08-08 15:50:47 -070010987 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010988 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010989 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010990 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010991 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10992 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010993 }
10994}
Spandan Das3576e762024-01-03 18:57:03 +000010995
10996// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10997// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10998func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010999 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011000 // for a mainline module family, check that only the flagged soong module is visible to make
11001 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11002 variation := func(moduleName string) string {
11003 ret := "android_common_com.android.foo"
11004 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011005 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011006 }
11007 return ret
11008 }
11009
11010 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11011 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11012
11013 for _, hiddenModuleName := range hiddenModuleNames {
11014 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11015 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11016
11017 }
11018 }
11019
11020 bp := `
11021 apex_key {
11022 name: "com.android.foo.key",
11023 public_key: "com.android.foo.avbpubkey",
11024 private_key: "com.android.foo.pem",
11025 }
11026
11027 // AOSP source apex
11028 apex {
11029 name: "com.android.foo",
11030 key: "com.android.foo.key",
11031 updatable: false,
11032 }
11033
11034 // Google source apex
11035 override_apex {
11036 name: "com.google.android.foo",
11037 base: "com.android.foo",
11038 key: "com.android.foo.key",
11039 }
11040
11041 // Prebuilt Google APEX.
11042
11043 prebuilt_apex {
11044 name: "com.google.android.foo",
11045 apex_name: "com.android.foo",
11046 src: "com.android.foo-arm.apex",
11047 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11048 }
11049
11050 // Another Prebuilt Google APEX
11051 prebuilt_apex {
11052 name: "com.google.android.foo.v2",
11053 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011054 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011055 src: "com.android.foo-arm.apex",
11056 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11057 }
11058
11059 // APEX contribution modules
11060
11061 apex_contributions {
11062 name: "foo.source.contributions",
11063 api_domain: "com.android.foo",
11064 contents: ["com.google.android.foo"],
11065 }
11066
11067 apex_contributions {
11068 name: "foo.prebuilt.contributions",
11069 api_domain: "com.android.foo",
11070 contents: ["prebuilt_com.google.android.foo"],
11071 }
11072
11073 apex_contributions {
11074 name: "foo.prebuilt.v2.contributions",
11075 api_domain: "com.android.foo",
11076 contents: ["prebuilt_com.google.android.foo.v2"],
11077 }
11078
11079 // This is an incompatible module because it selects multiple versions of the same mainline module
11080 apex_contributions {
11081 name: "foo.prebuilt.duplicate.contributions",
11082 api_domain: "com.android.foo",
11083 contents: [
11084 "prebuilt_com.google.android.foo",
11085 "prebuilt_com.google.android.foo.v2",
11086 ],
11087 }
11088 `
11089
11090 testCases := []struct {
11091 desc string
11092 selectedApexContributions string
11093 expectedVisibleModuleName string
11094 expectedHiddenModuleNames []string
11095 expectedError string
11096 }{
11097 {
11098 desc: "Source apex is selected, prebuilts should be hidden from make",
11099 selectedApexContributions: "foo.source.contributions",
11100 expectedVisibleModuleName: "com.google.android.foo",
11101 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11102 },
11103 {
11104 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11105 selectedApexContributions: "foo.prebuilt.contributions",
11106 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11107 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11108 },
11109 {
11110 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11111 selectedApexContributions: "foo.prebuilt.v2.contributions",
11112 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11113 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11114 },
11115 {
11116 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11117 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11118 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11119 },
11120 }
11121
11122 for _, tc := range testCases {
11123 preparer := android.GroupFixturePreparers(
11124 android.FixtureMergeMockFs(map[string][]byte{
11125 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11126 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011127 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011128 )
11129 if tc.expectedError != "" {
11130 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11131 testApex(t, bp, preparer)
11132 return
11133 }
11134 ctx := testApex(t, bp, preparer)
11135
Spandan Das3576e762024-01-03 18:57:03 +000011136 // Check that
11137 // 1. The contents of the selected apex_contributions are visible to make
11138 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11139 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11140 }
11141}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011142
Spandan Das85bd4622024-08-01 00:51:20 +000011143// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11144func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011145 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011146 // for a mainline module family, check that only the flagged soong module is visible to make
11147 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11148 variation := func(moduleName string) string {
11149 ret := "android_common_com.android.adservices"
11150 if moduleName == "com.google.android.foo" {
11151 ret = "android_common_com.google.android.foo_com.google.android.foo"
11152 }
11153 return ret
11154 }
11155
11156 for _, visibleModuleName := range visibleModuleNames {
11157 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11158 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11159 }
11160
11161 for _, hiddenModuleName := range hiddenModuleNames {
11162 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11163 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11164
11165 }
11166 }
11167
11168 bp := `
11169 apex_key {
11170 name: "com.android.adservices.key",
11171 public_key: "com.android.adservices.avbpubkey",
11172 private_key: "com.android.adservices.pem",
11173 }
11174
11175 // AOSP source apex
11176 apex {
11177 name: "com.android.adservices",
11178 key: "com.android.adservices.key",
11179 updatable: false,
11180 }
11181
11182 // Prebuilt Google APEX.
11183
11184 prebuilt_apex {
11185 name: "com.google.android.adservices",
11186 apex_name: "com.android.adservices",
11187 src: "com.android.foo-arm.apex",
11188 }
11189
11190 // Another Prebuilt Google APEX
11191 prebuilt_apex {
11192 name: "com.google.android.adservices.v2",
11193 apex_name: "com.android.adservices",
11194 src: "com.android.foo-arm.apex",
11195 }
11196
11197 // APEX contribution modules
11198
11199
11200 apex_contributions {
11201 name: "adservices.prebuilt.contributions",
11202 api_domain: "com.android.adservices",
11203 contents: ["prebuilt_com.google.android.adservices"],
11204 }
11205
11206 apex_contributions {
11207 name: "adservices.prebuilt.v2.contributions",
11208 api_domain: "com.android.adservices",
11209 contents: ["prebuilt_com.google.android.adservices.v2"],
11210 }
11211 `
11212
11213 testCases := []struct {
11214 desc string
11215 selectedApexContributions string
11216 expectedVisibleModuleNames []string
11217 expectedHiddenModuleNames []string
11218 }{
11219 {
11220 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11221 selectedApexContributions: "",
11222 expectedVisibleModuleNames: []string{"com.android.adservices"},
11223 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11224 },
11225 {
11226 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11227 selectedApexContributions: "adservices.prebuilt.contributions",
11228 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11229 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11230 },
11231 {
11232 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11233 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11234 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11235 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11236 },
11237 }
11238
11239 for _, tc := range testCases {
11240 preparer := android.GroupFixturePreparers(
11241 android.FixtureMergeMockFs(map[string][]byte{
11242 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11243 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011244 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011245 )
11246 ctx := testApex(t, bp, preparer)
11247
11248 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11249 }
11250}
11251
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011252func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011253 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011254 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11255 for _, moduleName := range moduleNames {
11256 ret += fmt.Sprintf(`
11257 aconfig_declarations {
11258 name: "%[1]s",
11259 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011260 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011261 srcs: [
11262 "%[1]s.aconfig",
11263 ],
11264 }
11265 java_aconfig_library {
11266 name: "%[1]s-lib",
11267 aconfig_declarations: "%[1]s",
11268 }
11269 `, moduleName)
11270 }
11271 return ret
11272 }
11273
11274 result := android.GroupFixturePreparers(
11275 prepareForApexTest,
11276 java.PrepareForTestWithJavaSdkLibraryFiles,
11277 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011278 ).RunTestWithBp(t, `
11279 java_library {
11280 name: "baz-java-lib",
11281 static_libs: [
11282 "baz-lib",
11283 ],
11284 }
11285 filegroup {
11286 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011287 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011288 ":qux-lib{.generated_srcjars}",
11289 ],
11290 }
11291 filegroup {
11292 name: "qux-another-filegroup",
11293 srcs: [
11294 ":qux-filegroup",
11295 ],
11296 }
11297 java_library {
11298 name: "quux-java-lib",
11299 srcs: [
11300 "a.java",
11301 ],
11302 libs: [
11303 "quux-lib",
11304 ],
11305 }
11306 java_sdk_library {
11307 name: "foo",
11308 srcs: [
11309 ":qux-another-filegroup",
11310 ],
11311 api_packages: ["foo"],
11312 system: {
11313 enabled: true,
11314 },
11315 module_lib: {
11316 enabled: true,
11317 },
11318 test: {
11319 enabled: true,
11320 },
11321 static_libs: [
11322 "bar-lib",
11323 ],
11324 libs: [
11325 "baz-java-lib",
11326 "quux-java-lib",
11327 ],
11328 aconfig_declarations: [
11329 "bar",
11330 ],
11331 }
11332 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11333
11334 m := result.ModuleForTests("foo.stubs.source", "android_common")
11335 outDir := "out/soong/.intermediates"
11336
11337 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11338 // textproto files
11339 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11340
11341 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11342 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11343 // to aconfig.
11344 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11345 "passed as an input",
11346 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11347
11348 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11349 // to metalava as classpath. Thus the cache file provided by the associated
11350 // aconfig_declarations module "baz" should be passed to aconfig.
11351 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11352 "java_aconfig_library passed as an input",
11353 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11354
11355 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11356 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11357 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11358 "input",
11359 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11360
11361 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11362 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11363 // aconfig_declarations module "quux" should not be passed to aconfig.
11364 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11365 "depend on java_aconfig_library not passed as an input",
11366 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11367}
Cole Faust7c991b42024-05-15 11:17:55 -070011368
11369func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011370 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011371 ctx := testApex(t, `
11372 apex {
11373 name: "myapex",
11374 key: "myapex.key",
11375 prebuilts: ["myetc", "myetc2"],
11376 min_sdk_version: "29",
11377 }
11378 apex_key {
11379 name: "myapex.key",
11380 public_key: "testkey.avbpubkey",
11381 private_key: "testkey.pem",
11382 }
11383
11384 prebuilt_etc {
11385 name: "myetc",
11386 src: "myprebuilt",
11387 filename: "myfilename",
11388 }
11389 prebuilt_etc {
11390 name: "myetc2",
11391 sub_dir: "mysubdir",
11392 src: "myprebuilt",
11393 filename: "myfilename",
11394 }
11395 `, withFiles(android.MockFS{
11396 "packages/modules/common/build/allowed_deps.txt": nil,
11397 }))
11398
11399 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11400 data := android.AndroidMkDataForTest(t, ctx, ab)
11401 var builder strings.Builder
11402 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11403 androidMk := builder.String()
11404
11405 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11406 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11407}
Spandan Das50801e22024-05-13 18:29:45 +000011408
11409func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011410 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011411 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11412 args := module.Rule("apexRule").Args
11413 optFlags := args["opt_flags"]
11414 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11415 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11416 }
11417 }
11418
11419 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11420 t.Helper()
11421 found := false
11422 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11423 if dep == wantDep {
11424 found = true
11425 }
11426 })
11427 if !found {
11428 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11429 }
11430 }
11431
11432 ctx := testApex(t, `
11433 apex {
11434 name: "com.android.apex30",
11435 min_sdk_version: "30",
11436 key: "apex30.key",
11437 java_libs: ["javalib"],
11438 }
11439
11440 java_library {
11441 name: "javalib",
11442 srcs: ["A.java"],
11443 apex_available: ["com.android.apex30"],
11444 min_sdk_version: "30",
11445 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011446 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011447 }
11448
11449 override_apex {
11450 name: "com.mycompany.android.apex30",
11451 base: "com.android.apex30",
11452 }
11453
11454 override_apex {
11455 name: "com.mycompany.android.apex31",
11456 base: "com.android.apex30",
11457 min_sdk_version: "31",
11458 }
11459
11460 apex_key {
11461 name: "apex30.key",
11462 public_key: "testkey.avbpubkey",
11463 private_key: "testkey.pem",
11464 }
11465
11466 `, android.FixtureMergeMockFs(android.MockFS{
11467 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11468 }),
11469 )
11470
11471 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11472 checkMinSdkVersion(t, baseModule, "30")
11473
11474 // Override module, but uses same min_sdk_version
11475 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11476 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11477 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11478 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11479
11480 // Override module, uses different min_sdk_version
11481 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11482 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11483 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11484 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11485}
Spandan Das0b28fa02024-05-28 23:40:17 +000011486
11487func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011488 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011489 context := android.GroupFixturePreparers(
11490 android.PrepareForIntegrationTestWithAndroid,
11491 PrepareForTestWithApexBuildComponents,
11492 android.FixtureMergeMockFs(android.MockFS{
11493 "system/sepolicy/apex/foo-file_contexts": nil,
11494 }),
11495 )
11496 res := context.RunTestWithBp(t, `
11497 apex {
11498 name: "foo",
11499 key: "myapex.key",
11500 apex_available_name: "com.android.foo",
11501 variant_version: "0",
11502 updatable: false,
11503 }
11504 apex_key {
11505 name: "myapex.key",
11506 public_key: "testkey.avbpubkey",
11507 private_key: "testkey.pem",
11508 }
11509 prebuilt_apex {
11510 name: "foo",
11511 src: "foo.apex",
11512 prefer: true,
11513 }
11514 override_apex {
11515 name: "myoverrideapex",
11516 base: "foo",
11517 }
11518 `)
11519
11520 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11521}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011522
11523func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011524 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011525 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`, `
11526 apex {
11527 name: "myapex",
11528 key: "myapex.key",
11529 updatable: true,
11530 min_sdk_version: "current",
11531 }
11532
11533 apex_key {
11534 name: "myapex.key",
11535 public_key: "testkey.avbpubkey",
11536 private_key: "testkey.pem",
11537 }
11538 `)
11539}
Spandan Das2f68f192024-07-22 19:25:50 +000011540
11541func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011542 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011543 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11544 result := android.GroupFixturePreparers(
11545 prepareForApexTest,
11546 android.PrepareForTestWithAndroidMk,
11547 android.PrepareForTestWithMakevars,
11548 android.FixtureMergeMockFs(fs),
11549 ).RunTest(t)
11550
11551 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011552 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011553
11554 installRules := result.InstallMakeRulesForTesting(t)
11555
11556 var installedlibRule *android.InstallMakeRule
11557 for i, rule := range installRules {
11558 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11559 if installedlibRule != nil {
11560 t.Errorf("Duplicate install rules for %s", rule.Target)
11561 }
11562 installedlibRule = &installRules[i]
11563 }
11564 }
11565 if installedlibRule == nil {
11566 t.Errorf("No install rule found for installedlib")
11567 return
11568 }
11569
11570 if expectLibfooOnSystemLib {
11571 android.AssertStringListContains(t,
11572 "installedlib doesn't have install dependency on libfoo impl",
11573 installedlibRule.OrderOnlyDeps,
11574 "out/target/product/test_device/system/lib/libfoo.so")
11575 } else {
11576 android.AssertStringListDoesNotContain(t,
11577 "installedlib has install dependency on libfoo stub",
11578 installedlibRule.Deps,
11579 "out/target/product/test_device/system/lib/libfoo.so")
11580 android.AssertStringListDoesNotContain(t,
11581 "installedlib has order-only install dependency on libfoo stub",
11582 installedlibRule.OrderOnlyDeps,
11583 "out/target/product/test_device/system/lib/libfoo.so")
11584 }
11585 }
11586
11587 prebuiltLibfooBp := []byte(`
11588 cc_prebuilt_library {
11589 name: "libfoo",
11590 prefer: true,
11591 srcs: ["libfoo.so"],
11592 stubs: {
11593 versions: ["1"],
11594 },
11595 apex_available: ["apexfoo"],
11596 }
11597 `)
11598
11599 apexfooBp := []byte(`
11600 apex {
11601 name: "apexfoo",
11602 key: "apexfoo.key",
11603 native_shared_libs: ["libfoo"],
11604 updatable: false,
11605 compile_multilib: "both",
11606 }
11607 apex_key {
11608 name: "apexfoo.key",
11609 public_key: "testkey.avbpubkey",
11610 private_key: "testkey.pem",
11611 }
11612 `)
11613
11614 installedlibBp := []byte(`
11615 cc_library {
11616 name: "installedlib",
11617 shared_libs: ["libfoo"],
11618 }
11619 `)
11620
11621 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011622 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011623 testFunc(
11624 t,
11625 /*expectLibfooOnSystemLib=*/ false,
11626 android.MockFS{
11627 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11628 "apexfoo/Android.bp": apexfooBp,
11629 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11630 "Android.bp": installedlibBp,
11631 },
11632 )
11633 })
11634
11635 disabledSourceLibfooBp := []byte(`
11636 cc_library {
11637 name: "libfoo",
11638 enabled: false,
11639 stubs: {
11640 versions: ["1"],
11641 },
11642 apex_available: ["apexfoo"],
11643 }
11644 `)
11645
11646 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011647 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011648 testFunc(
11649 t,
11650 /*expectLibfooOnSystemLib=*/ false,
11651 android.MockFS{
11652 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11653 "impl/Android.bp": disabledSourceLibfooBp,
11654 "apexfoo/Android.bp": apexfooBp,
11655 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11656 "Android.bp": installedlibBp,
11657 },
11658 )
11659 })
11660}
Jihoon Kange246bb72024-09-18 22:26:22 +000011661
11662func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011663 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011664 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11665 // in libs of android_app and java_library does not lead to class loader context device/host
11666 // path mismatch errors.
11667 android.GroupFixturePreparers(
11668 prepareForApexTest,
11669 android.PrepareForIntegrationTestWithAndroid,
11670 PrepareForTestWithApexBuildComponents,
11671 android.FixtureModifyEnv(func(env map[string]string) {
11672 env["DISABLE_CONTAINER_CHECK"] = "true"
11673 }),
11674 withFiles(filesForSdkLibrary),
11675 android.FixtureMergeMockFs(android.MockFS{
11676 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11677 }),
11678 ).RunTestWithBp(t, `
11679 apex {
11680 name: "com.android.foo30",
11681 key: "myapex.key",
11682 updatable: true,
11683 bootclasspath_fragments: [
11684 "foo-bootclasspath-fragment",
11685 ],
11686 java_libs: [
11687 "bar",
11688 ],
11689 apps: [
11690 "bar-app",
11691 ],
11692 min_sdk_version: "30",
11693 }
11694 apex_key {
11695 name: "myapex.key",
11696 public_key: "testkey.avbpubkey",
11697 private_key: "testkey.pem",
11698 }
11699 bootclasspath_fragment {
11700 name: "foo-bootclasspath-fragment",
11701 contents: [
11702 "framework-foo",
11703 ],
11704 apex_available: [
11705 "com.android.foo30",
11706 ],
11707 hidden_api: {
11708 split_packages: ["*"]
11709 },
11710 }
11711
11712 java_sdk_library {
11713 name: "framework-foo",
11714 srcs: [
11715 "A.java"
11716 ],
11717 unsafe_ignore_missing_latest_api: true,
11718 apex_available: [
11719 "com.android.foo30",
11720 ],
11721 compile_dex: true,
11722 sdk_version: "core_current",
11723 shared_library: false,
11724 }
11725
11726 java_library {
11727 name: "bar",
11728 srcs: [
11729 "A.java"
11730 ],
11731 libs: [
11732 "framework-foo.impl",
11733 ],
11734 apex_available: [
11735 "com.android.foo30",
11736 ],
11737 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011738 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011739 }
11740
11741 java_library {
11742 name: "baz",
11743 srcs: [
11744 "A.java"
11745 ],
11746 libs: [
11747 "bar",
11748 ],
11749 sdk_version: "core_current",
11750 }
11751
11752 android_app {
11753 name: "bar-app",
11754 srcs: [
11755 "A.java"
11756 ],
11757 libs: [
11758 "baz",
11759 "framework-foo.impl",
11760 ],
11761 apex_available: [
11762 "com.android.foo30",
11763 ],
11764 sdk_version: "core_current",
11765 min_sdk_version: "30",
11766 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011767 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011768 }
11769 `)
11770}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011771
11772// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11773func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011774 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011775 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11776 apex {
11777 name: "myapex",
11778 key: "myapex.key",
11779 systemserverclasspath_fragments: [
11780 "mysystemserverclasspathfragment",
11781 ],
11782 min_sdk_version: "29",
11783 updatable: true,
11784 system_ext_specific: true,
11785 }
11786
11787 apex_key {
11788 name: "myapex.key",
11789 public_key: "testkey.avbpubkey",
11790 private_key: "testkey.pem",
11791 }
11792
11793 java_library {
11794 name: "foo",
11795 srcs: ["b.java"],
11796 min_sdk_version: "29",
11797 installable: true,
11798 apex_available: [
11799 "myapex",
11800 ],
11801 sdk_version: "current",
11802 }
11803
11804 systemserverclasspath_fragment {
11805 name: "mysystemserverclasspathfragment",
11806 contents: [
11807 "foo",
11808 ],
11809 apex_available: [
11810 "myapex",
11811 ],
11812 }
11813 `,
11814 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11815 )
11816}
Spandan Das72d86c62024-10-15 19:27:41 +000011817
11818// partitions should not package the artifacts that are included inside the apex.
11819func TestFilesystemWithApexDeps(t *testing.T) {
11820 t.Parallel()
11821 result := testApex(t, `
11822 android_filesystem {
11823 name: "myfilesystem",
11824 deps: ["myapex"],
11825 }
11826 apex {
11827 name: "myapex",
11828 key: "myapex.key",
11829 binaries: ["binfoo"],
11830 native_shared_libs: ["libfoo"],
11831 apps: ["appfoo"],
11832 updatable: false,
11833 }
11834 apex_key {
11835 name: "myapex.key",
11836 }
11837 cc_binary {
11838 name: "binfoo",
11839 apex_available: ["myapex"],
11840 }
11841 cc_library {
11842 name: "libfoo",
11843 apex_available: ["myapex"],
11844 }
11845 android_app {
11846 name: "appfoo",
11847 sdk_version: "current",
11848 apex_available: ["myapex"],
11849 }
11850 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11851
11852 partition := result.ModuleForTests("myfilesystem", "android_common")
11853 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11854 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11855}
Colin Crossb614cd42024-10-11 12:52:21 -070011856
11857func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11858 t.Parallel()
11859
11860 extractDepenencyPathFromErrors := func(errs []error) []string {
11861 i := slices.IndexFunc(errs, func(err error) bool {
11862 return strings.Contains(err.Error(), "dependency path:")
11863 })
11864 if i < 0 {
11865 return nil
11866 }
11867 var dependencyPath []string
11868 for _, err := range errs[i+1:] {
11869 s := err.Error()
11870 lastSpace := strings.LastIndexByte(s, ' ')
11871 if lastSpace >= 0 {
11872 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11873 }
11874 }
11875 return dependencyPath
11876 }
11877
11878 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11879 return func(t *testing.T, result *android.TestResult) {
11880 t.Helper()
11881 if len(result.Errs) == 0 {
11882 t.Fatalf("expected errors")
11883 }
11884 t.Log("found errors:")
11885 for _, err := range result.Errs {
11886 t.Log(err)
11887 }
11888 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11889 t.Fatalf("expected error %q, got %q", w, g)
11890 }
11891 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11892 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11893 t.Errorf("expected dependency path %q, got %q", w, g)
11894 }
11895 }
11896 }
11897
11898 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11899 return func(bp *bpmodify.Blueprint) {
11900 m := bp.ModulesByName(module)
11901 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11902 if err != nil {
11903 panic(err)
11904 }
11905 props.AddStringToList(lib)
11906 }
11907 }
11908
11909 bpTemplate := `
11910 apex {
11911 name: "myapex",
11912 key: "myapex.key",
11913 native_shared_libs: ["mylib"],
11914 rust_dyn_libs: ["libmyrust"],
11915 binaries: ["mybin", "myrustbin"],
11916 jni_libs: ["libjni"],
11917 apps: ["myapp"],
11918 updatable: false,
11919 }
11920
11921 apex {
11922 name: "otherapex",
11923 key: "myapex.key",
11924 native_shared_libs: ["libotherapex"],
11925 updatable: false,
11926 }
11927
11928 apex_key {
11929 name: "myapex.key",
11930 public_key: "testkey.avbpubkey",
11931 private_key: "testkey.pem",
11932 }
11933
11934 cc_library {
11935 name: "mylib",
11936 srcs: ["foo.cpp"],
11937 apex_available: ["myapex"],
11938 }
11939
11940 cc_binary {
11941 name: "mybin",
11942 srcs: ["foo.cpp"],
11943 apex_available: ["myapex"],
11944 }
11945
11946 rust_library {
11947 name: "libmyrust",
11948 crate_name: "myrust",
11949 srcs: ["src/lib.rs"],
11950 rustlibs: ["libmyrust_transitive_dylib"],
11951 rlibs: ["libmyrust_transitive_rlib"],
11952 apex_available: ["myapex"],
11953 }
11954
11955 rust_library{
11956 name: "libmyrust_transitive_dylib",
11957 crate_name: "myrust_transitive_dylib",
11958 srcs: ["src/lib.rs"],
11959 apex_available: ["myapex"],
11960 }
11961
11962 rust_library {
11963 name: "libmyrust_transitive_rlib",
11964 crate_name: "myrust_transitive_rlib",
11965 srcs: ["src/lib.rs"],
11966 apex_available: ["myapex"],
11967 }
11968
11969 rust_binary {
11970 name: "myrustbin",
11971 srcs: ["src/main.rs"],
11972 apex_available: ["myapex"],
11973 }
11974
11975 cc_library {
11976 name: "libbar",
11977 sdk_version: "current",
11978 srcs: ["bar.cpp"],
11979 apex_available: ["myapex"],
11980 stl: "none",
11981 }
11982
11983 android_app {
11984 name: "myapp",
11985 jni_libs: ["libembeddedjni"],
11986 use_embedded_native_libs: true,
11987 sdk_version: "current",
11988 apex_available: ["myapex"],
11989 }
11990
11991 cc_library {
11992 name: "libembeddedjni",
11993 sdk_version: "current",
11994 srcs: ["bar.cpp"],
11995 apex_available: ["myapex"],
11996 stl: "none",
11997 }
11998
11999 cc_library {
12000 name: "libjni",
12001 sdk_version: "current",
12002 srcs: ["bar.cpp"],
12003 apex_available: ["myapex"],
12004 stl: "none",
12005 }
12006
12007 cc_library {
12008 name: "libotherapex",
12009 sdk_version: "current",
12010 srcs: ["otherapex.cpp"],
12011 apex_available: ["otherapex"],
12012 stubs: {
12013 symbol_file: "libotherapex.map.txt",
12014 versions: ["1", "2", "3"],
12015 },
12016 stl: "none",
12017 }
12018
12019 cc_library {
12020 name: "libplatform",
12021 sdk_version: "current",
12022 srcs: ["libplatform.cpp"],
12023 stubs: {
12024 symbol_file: "libplatform.map.txt",
12025 versions: ["1", "2", "3"],
12026 },
12027 stl: "none",
12028 system_shared_libs: [],
12029 }
12030 `
12031
12032 testCases := []struct {
12033 name string
12034 bpModifier func(bp *bpmodify.Blueprint)
12035 dependencyPath []string
12036 }{
12037 {
12038 name: "library dependency in other apex",
12039 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12040 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12041 },
12042 {
12043 name: "transitive library dependency in other apex",
12044 bpModifier: func(bp *bpmodify.Blueprint) {
12045 addToSharedLibs("mylib", "libbar")(bp)
12046 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12047 },
12048 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12049 },
12050 {
12051 name: "library dependency in platform",
12052 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12053 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12054 },
12055 {
12056 name: "jni library dependency in other apex",
12057 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12058 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12059 },
12060 {
12061 name: "transitive jni library dependency in other apex",
12062 bpModifier: func(bp *bpmodify.Blueprint) {
12063 addToSharedLibs("libjni", "libbar")(bp)
12064 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12065 },
12066 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12067 },
12068 {
12069 name: "jni library dependency in platform",
12070 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12071 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12072 },
12073 {
12074 name: "transitive jni library dependency in platform",
12075 bpModifier: func(bp *bpmodify.Blueprint) {
12076 addToSharedLibs("libjni", "libbar")(bp)
12077 addToSharedLibs("libbar", "libplatform#impl")(bp)
12078 },
12079 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12080 },
Spandan Das10c41362024-12-03 01:33:09 +000012081 {
12082 name: "app jni library dependency in other apex",
12083 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12084 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12085 },
12086 {
12087 name: "transitive app jni library dependency in other apex",
12088 bpModifier: func(bp *bpmodify.Blueprint) {
12089 addToSharedLibs("libembeddedjni", "libbar")(bp)
12090 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12091 },
12092 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12093 },
12094 {
12095 name: "app jni library dependency in platform",
12096 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12097 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12098 },
12099 {
12100 name: "transitive app jni library dependency in platform",
12101 bpModifier: func(bp *bpmodify.Blueprint) {
12102 addToSharedLibs("libembeddedjni", "libbar")(bp)
12103 addToSharedLibs("libbar", "libplatform#impl")(bp)
12104 },
12105 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12106 },
Colin Crossb614cd42024-10-11 12:52:21 -070012107 {
12108 name: "binary dependency in other apex",
12109 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12110 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12111 },
12112 {
12113 name: "transitive binary dependency in other apex",
12114 bpModifier: func(bp *bpmodify.Blueprint) {
12115 addToSharedLibs("mybin", "libbar")(bp)
12116 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12117 },
12118 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12119 },
12120 {
12121 name: "binary dependency in platform",
12122 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12123 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12124 },
12125 {
12126 name: "transitive binary dependency in platform",
12127 bpModifier: func(bp *bpmodify.Blueprint) {
12128 addToSharedLibs("mybin", "libbar")(bp)
12129 addToSharedLibs("libbar", "libplatform#impl")(bp)
12130 },
12131 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12132 },
12133
12134 {
12135 name: "rust library dependency in other apex",
12136 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12137 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12138 },
12139 {
12140 name: "transitive rust library dependency in other apex",
12141 bpModifier: func(bp *bpmodify.Blueprint) {
12142 addToSharedLibs("libmyrust", "libbar")(bp)
12143 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12144 },
12145 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12146 },
12147 {
12148 name: "rust library dependency in platform",
12149 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12150 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12151 },
12152 {
12153 name: "transitive rust library dependency in platform",
12154 bpModifier: func(bp *bpmodify.Blueprint) {
12155 addToSharedLibs("libmyrust", "libbar")(bp)
12156 addToSharedLibs("libbar", "libplatform#impl")(bp)
12157 },
12158 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12159 },
12160 {
12161 name: "transitive rust library dylib dependency in other apex",
12162 bpModifier: func(bp *bpmodify.Blueprint) {
12163 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12164 },
12165 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12166 },
12167 {
12168 name: "transitive rust library dylib dependency in platform",
12169 bpModifier: func(bp *bpmodify.Blueprint) {
12170 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12171 },
12172 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12173 },
12174 {
12175 name: "transitive rust library rlib dependency in other apex",
12176 bpModifier: func(bp *bpmodify.Blueprint) {
12177 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12178 },
12179 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12180 },
12181 {
12182 name: "transitive rust library rlib dependency in platform",
12183 bpModifier: func(bp *bpmodify.Blueprint) {
12184 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12185 },
12186 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12187 },
12188 {
12189 name: "rust binary dependency in other apex",
12190 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12191 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12192 },
12193 {
12194 name: "transitive rust binary dependency in other apex",
12195 bpModifier: func(bp *bpmodify.Blueprint) {
12196 addToSharedLibs("myrustbin", "libbar")(bp)
12197 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12198 },
12199 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12200 },
12201 {
12202 name: "rust binary dependency in platform",
12203 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12204 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12205 },
12206 {
12207 name: "transitive rust binary dependency in platform",
12208 bpModifier: func(bp *bpmodify.Blueprint) {
12209 addToSharedLibs("myrustbin", "libbar")(bp)
12210 addToSharedLibs("libbar", "libplatform#impl")(bp)
12211 },
12212 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12213 },
12214 }
12215
12216 for _, testCase := range testCases {
12217 t.Run(testCase.name, func(t *testing.T) {
12218 t.Parallel()
12219 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12220 if err != nil {
12221 t.Fatal(err)
12222 }
12223 if testCase.bpModifier != nil {
12224 func() {
12225 defer func() {
12226 if r := recover(); r != nil {
12227 t.Fatalf("panic in bpModifier: %v", r)
12228 }
12229 }()
12230 testCase.bpModifier(bp)
12231 }()
12232 }
12233 android.GroupFixturePreparers(
12234 android.PrepareForTestWithAndroidBuildComponents,
12235 cc.PrepareForTestWithCcBuildComponents,
12236 java.PrepareForTestWithDexpreopt,
12237 rust.PrepareForTestWithRustDefaultModules,
12238 PrepareForTestWithApexBuildComponents,
12239 prepareForTestWithMyapex,
12240 prepareForTestWithOtherapex,
12241 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12242 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12243 }),
12244 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12245 RunTestWithBp(t, bp.String())
12246 })
12247 }
12248}