blob: ced3c46d5c99d0d7d4574e530d122586363ab64c [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900901 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800914 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000927 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 versions: ["1", "2", "3"],
929 },
930 }
931
932 cc_library {
933 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900934 srcs: ["mylib.cpp"],
935 shared_libs: ["mylib4"],
936 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["10", "11", "12"],
941 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900944
945 cc_library {
946 name: "mylib4",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000950 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900951 }
Jiyong Park105dc322021-06-11 17:22:09 +0900952
Spandan Das357ffcc2024-07-24 18:07:48 +0000953 cc_prebuilt_library_shared {
954 name: "my_prebuilt_platform_lib",
955 stubs: {
956 symbol_file: "my_prebuilt_platform_lib.map.txt",
957 versions: ["1", "2", "3"],
958 },
959 srcs: ["foo.so"],
960 }
961
962 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963 cc_prebuilt_library_shared {
964 name: "my_prebuilt_platform_stub_only_lib",
965 stubs: {
966 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967 versions: ["1", "2", "3"],
968 }
969 }
970
Jiyong Park105dc322021-06-11 17:22:09 +0900971 rust_binary {
972 name: "foo.rust",
973 srcs: ["foo.rs"],
974 shared_libs: ["libfoo.shared_from_rust"],
975 prefer_rlib: true,
976 apex_available: ["myapex"],
977 }
978
979 cc_library_shared {
980 name: "libfoo.shared_from_rust",
981 srcs: ["mylib.cpp"],
982 system_shared_libs: [],
983 stl: "none",
984 stubs: {
985 versions: ["10", "11", "12"],
986 },
987 }
988
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989 `)
990
Jooyung Hana0503a52023-08-23 13:12:50 +0900991 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 copyCmds := apexRule.Args["copy_commands"]
993
994 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996
997 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
Colin Crossaede88c2020-08-11 12:17:01 -07001003 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001006 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001008 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009
Colin Crossea91a172024-11-05 16:14:05 -08001010 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001011 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001013 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001014
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001015 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016 // is replaced by sharing of "cFlags" in cc/builder.go.
1017 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018 // module variable representing "cflags". So it was not detected by ensureNotContains.
1019 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021 // including the original cflags's "-include mylib.h".
1022 //
Jiyong Park64379952018-12-13 18:37:29 +09001023 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001024 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001026
Jiyong Park85cc35a2022-07-17 11:30:47 +09001027 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1028 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029 // Ensure that genstub for apex-provided lib is invoked with --apex
1030 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001031
Jooyung Hana0503a52023-08-23 13:12:50 +09001032 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001033 "lib64/mylib.so",
1034 "lib64/mylib3.so",
1035 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001036 "bin/foo.rust",
1037 "lib64/libc++.so", // by the implicit dependency from foo.rust
1038 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001039 })
Jiyong Park105dc322021-06-11 17:22:09 +09001040
1041 // Ensure that stub dependency from a rust module is not included
1042 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001047
Jooyung Hana0503a52023-08-23 13:12:50 +09001048 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001049 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001050
1051 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1056 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057
1058 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1063 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064}
1065
Jooyung Han20348752023-12-05 15:23:56 +09001066func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001067 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001068 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069 apex {
1070 name: "myapex",
1071 key: "myapex.key",
1072 vendor: true,
1073 updatable: false,
1074 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "libbar",
1085 srcs: ["mylib.cpp"],
1086 llndk: {
1087 symbol_file: "libbar.map.txt",
1088 }
1089 }
1090 `)
1091}
1092
Jiyong Park1bc84122021-06-22 20:23:05 +09001093func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001094 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001095 ctx := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 binaries: ["foo.rust"],
1101 updatable: false,
1102 platform_apis: true,
1103 }
1104
1105 apex_key {
1106 name: "myapex.key",
1107 public_key: "testkey.avbpubkey",
1108 private_key: "testkey.pem",
1109 }
1110
1111 cc_library {
1112 name: "mylib",
1113 srcs: ["mylib.cpp"],
1114 shared_libs: ["mylib2"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 apex_available: [ "myapex" ],
1118 }
1119
1120 cc_library {
1121 name: "mylib2",
1122 srcs: ["mylib.cpp"],
1123 cflags: ["-include mylib.h"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["1", "2", "3"],
1128 },
1129 }
1130
1131 rust_binary {
1132 name: "foo.rust",
1133 srcs: ["foo.rs"],
1134 shared_libs: ["libfoo.shared_from_rust"],
1135 prefer_rlib: true,
1136 apex_available: ["myapex"],
1137 }
1138
1139 cc_library_shared {
1140 name: "libfoo.shared_from_rust",
1141 srcs: ["mylib.cpp"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["10", "11", "12"],
1146 },
1147 }
1148 `)
1149
Jooyung Hana0503a52023-08-23 13:12:50 +09001150 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001151 copyCmds := apexRule.Args["copy_commands"]
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156
1157 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001162 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165}
1166
Colin Cross7812fd32020-09-25 12:35:10 -07001167func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001169 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001170 apex {
1171 name: "myapex",
1172 key: "myapex.key",
1173 native_shared_libs: ["mylib", "mylib3"],
1174 min_sdk_version: "29",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 cc_library {
1184 name: "mylib",
1185 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001186 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001187 system_shared_libs: [],
1188 stl: "none",
1189 apex_available: [ "myapex" ],
1190 min_sdk_version: "28",
1191 }
1192
1193 cc_library {
1194 name: "mylib2",
1195 srcs: ["mylib.cpp"],
1196 cflags: ["-include mylib.h"],
1197 system_shared_libs: [],
1198 stl: "none",
1199 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001200 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001201 versions: ["28", "29", "30", "current"],
1202 },
1203 min_sdk_version: "28",
1204 }
1205
1206 cc_library {
1207 name: "mylib3",
1208 srcs: ["mylib.cpp"],
1209 shared_libs: ["mylib4"],
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001213 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001214 versions: ["28", "29", "30", "current"],
1215 },
1216 apex_available: [ "myapex" ],
1217 min_sdk_version: "28",
1218 }
1219
1220 cc_library {
1221 name: "mylib4",
1222 srcs: ["mylib.cpp"],
1223 system_shared_libs: [],
1224 stl: "none",
1225 apex_available: [ "myapex" ],
1226 min_sdk_version: "28",
1227 }
1228 `)
1229
Jooyung Hana0503a52023-08-23 13:12:50 +09001230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001231 copyCmds := apexRule.Args["copy_commands"]
1232
1233 // Ensure that direct non-stubs dep is always included
1234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235
1236 // Ensure that indirect stubs dep is not included
1237 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238
1239 // Ensure that direct stubs dep is included
1240 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241
1242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243
Jiyong Park55549df2021-02-26 23:57:23 +09001244 // Ensure that mylib is linking with the latest version of stub for mylib2
1245 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001246 // ... and not linking to the non-stub (impl) variant of mylib2
1247 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248
Colin Crossea91a172024-11-05 16:14:05 -08001249 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001250 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251 // .. and not linking to the stubs variant of mylib3
1252 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253
1254 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001255 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001256 ensureNotContains(t, mylib2Cflags, "-include ")
1257
Jiyong Park85cc35a2022-07-17 11:30:47 +09001258 // Ensure that genstub is invoked with --systemapi
1259 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001260
Jooyung Hana0503a52023-08-23 13:12:50 +09001261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001262 "lib64/mylib.so",
1263 "lib64/mylib3.so",
1264 "lib64/mylib4.so",
1265 })
1266}
1267
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001268func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269 t.Parallel()
1270 // myapex (Z)
1271 // mylib -----------------.
1272 // |
1273 // otherapex (29) |
1274 // libstub's versions: 29 Z current
1275 // |
1276 // <platform> |
1277 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001278 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001279 apex {
1280 name: "myapex",
1281 key: "myapex.key",
1282 native_shared_libs: ["mylib"],
1283 min_sdk_version: "Z", // non-final
1284 }
1285
1286 cc_library {
1287 name: "mylib",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libstub"],
1290 apex_available: ["myapex"],
1291 min_sdk_version: "Z",
1292 }
1293
1294 apex_key {
1295 name: "myapex.key",
1296 public_key: "testkey.avbpubkey",
1297 private_key: "testkey.pem",
1298 }
1299
1300 apex {
1301 name: "otherapex",
1302 key: "myapex.key",
1303 native_shared_libs: ["libstub"],
1304 min_sdk_version: "29",
1305 }
1306
1307 cc_library {
1308 name: "libstub",
1309 srcs: ["mylib.cpp"],
1310 stubs: {
1311 versions: ["29", "Z", "current"],
1312 },
1313 apex_available: ["otherapex"],
1314 min_sdk_version: "29",
1315 }
1316
1317 // platform module depending on libstub from otherapex should use the latest stub("current")
1318 cc_library {
1319 name: "libplatform",
1320 srcs: ["mylib.cpp"],
1321 shared_libs: ["libstub"],
1322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001323 `,
1324 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326 variables.Platform_sdk_final = proptools.BoolPtr(false)
1327 variables.Platform_version_active_codenames = []string{"Z"}
1328 }),
1329 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001330
Jiyong Park55549df2021-02-26 23:57:23 +09001331 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001333 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336
1337 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342}
1343
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001346 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001348 name: "myapex2",
1349 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001351 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 }
1353
1354 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001355 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "mylib",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001364 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 system_shared_libs: [],
1366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001367 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 }
1369
1370 cc_library {
1371 name: "libfoo",
1372 srcs: ["mylib.cpp"],
1373 shared_libs: ["libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["10", "20", "30"],
1378 },
1379 }
1380
1381 cc_library {
1382 name: "libbar",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 }
1387
Jiyong Park678c8812020-02-07 17:25:49 +09001388 cc_library_static {
1389 name: "libbaz",
1390 srcs: ["mylib.cpp"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex2" ],
1394 }
1395
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001396 `)
1397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that direct non-stubs dep is always included
1402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403
1404 // Ensure that indirect stubs dep is not included
1405 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406
1407 // Ensure that dependency of stubs is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409
Colin Crossaede88c2020-08-11 12:17:01 -07001410 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411
1412 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001415 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001418
1419 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001421
Colin Crossf61d03d2023-11-02 16:56:39 -07001422 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001424 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001425
Colin Crossf61d03d2023-11-02 16:56:39 -07001426 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001428 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429}
1430
Jooyung Hand3639552019-08-09 12:57:43 +09001431func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001432 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001561 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001562 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001563 cc_library {
1564 name: "libc",
1565 no_libcrt: true,
1566 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001567 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568 stl: "none",
1569 system_shared_libs: [],
1570 stubs: { versions: ["1"] },
1571 apex_available: ["com.android.runtime"],
1572
1573 sanitize: {
1574 hwaddress: true,
1575 }
1576 }
1577
1578 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001579 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 no_libcrt: true,
1581 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001582 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 stl: "none",
1584 system_shared_libs: [],
1585 srcs: [""],
1586 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
1589 sanitize: {
1590 never: true,
1591 },
Spandan Das4de7b492023-05-05 21:13:01 +00001592 apex_available: [
1593 "//apex_available:anyapex",
1594 "//apex_available:platform",
1595 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001596 } `)
1597 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598
Jooyung Hana0503a52023-08-23 13:12:50 +09001599 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 "lib64/bionic/libc.so",
1601 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602 })
1603
Colin Cross4c4c1be2022-02-10 11:41:18 -08001604 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001605
1606 installed := hwasan.Description("install libclang_rt.hwasan")
1607 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608
1609 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612}
1613
1614func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001615 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001616 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001617 prepareForTestOfRuntimeApexWithHwasan,
1618 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619 variables.SanitizeDevice = []string{"hwaddress"}
1620 }),
1621 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622 cc_library {
1623 name: "libc",
1624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 stubs: { versions: ["1"] },
1630 apex_available: ["com.android.runtime"],
1631 }
1632
1633 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001634 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001635 no_libcrt: true,
1636 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001637 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 stl: "none",
1639 system_shared_libs: [],
1640 srcs: [""],
1641 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001642 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
1644 sanitize: {
1645 never: true,
1646 },
Spandan Das4de7b492023-05-05 21:13:01 +00001647 apex_available: [
1648 "//apex_available:anyapex",
1649 "//apex_available:platform",
1650 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001651 }
Paul Duffina02cae32021-03-09 01:44:06 +00001652 `)
1653 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654
Jooyung Hana0503a52023-08-23 13:12:50 +09001655 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 "lib64/bionic/libc.so",
1657 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658 })
1659
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 installed := hwasan.Description("install libclang_rt.hwasan")
1663 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664
1665 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668}
1669
Jooyung Han61b66e92020-03-21 14:21:46 +00001670func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001671 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 testcases := []struct {
1673 name string
1674 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001675 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001676 shouldLink string
1677 shouldNotLink []string
1678 }{
1679 {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001681 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001682 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 shouldLink: "current",
1684 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 },
1686 {
Jiyong Park55549df2021-02-26 23:57:23 +09001687 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001688 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001689 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 shouldLink: "current",
1691 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 },
1693 }
1694 for _, tc := range testcases {
1695 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001696 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001697 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 apex {
1699 name: "myapex",
1700 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001702 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001703 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Jooyung Han61b66e92020-03-21 14:21:46 +00001706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 cc_library {
1713 name: "mylib",
1714 srcs: ["mylib.cpp"],
1715 vendor_available: true,
1716 shared_libs: ["libbar"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722
Jooyung Han61b66e92020-03-21 14:21:46 +00001723 cc_library {
1724 name: "libbar",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001729 llndk: {
1730 symbol_file: "libbar.map.txt",
1731 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001733 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001734 withUnbundledBuild,
1735 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001736
Jooyung Han61b66e92020-03-21 14:21:46 +00001737 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 "lib64/mylib.so",
1740 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001741
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001743 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001746
Steven Moreland2c4000c2021-04-27 02:08:49 +00001747 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001752
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 ver := tc.shouldLink
1755 if tc.shouldLink == "current" {
1756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 }
1758 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 })
1760 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761}
1762
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001770 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "mylib",
1781 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001782 system_shared_libs: ["libc"],
1783 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 }
1787
1788 cc_library_shared {
1789 name: "mylib_shared",
1790 srcs: ["mylib.cpp"],
1791 shared_libs: ["libdl#27"],
1792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001793 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001794 }
1795
1796 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001797 name: "libBootstrap",
1798 srcs: ["mylib.cpp"],
1799 stl: "none",
1800 bootstrap: true,
1801 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 `)
1803
Jooyung Hana0503a52023-08-23 13:12:50 +09001804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 copyCmds := apexRule.Args["copy_commands"]
1806
1807 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001811
1812 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001813 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
Colin Crossaede88c2020-08-11 12:17:01 -07001815 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818
1819 // For dependency to libc
1820 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001821 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001823 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001824 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001825 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827
1828 // For dependency to libm
1829 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001832 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001833 // ... and is not compiling with the stub
1834 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836
1837 // For dependency to libdl
1838 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001839 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... Cflags from stub is correctly exported to mylib
1846 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001848
1849 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001850 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001854}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001855
Jooyung Han749dc692020-04-15 11:03:39 +09001856func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001857 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001858 // there are three links between liba --> libz.
1859 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001860 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001861 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001862 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 apex {
1871 name: "otherapex",
1872 key: "myapex.key",
1873 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882
1883 cc_library {
1884 name: "libx",
1885 shared_libs: ["liba"],
1886 system_shared_libs: [],
1887 stl: "none",
1888 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001889 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 cc_library {
1893 name: "liby",
1894 shared_libs: ["liba"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
1900
1901 cc_library {
1902 name: "liba",
1903 shared_libs: ["libz"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [
1907 "//apex_available:anyapex",
1908 "//apex_available:platform",
1909 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "libz",
1915 system_shared_libs: [],
1916 stl: "none",
1917 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001918 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001919 },
1920 }
Jooyung Han749dc692020-04-15 11:03:39 +09001921 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001922
1923 expectLink := func(from, from_variant, to, to_variant string) {
1924 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926 }
1927 expectNoLink := func(from, from_variant, to, to_variant string) {
1928 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 // platform liba is linked to non-stub version
1932 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001933 // liba in myapex is linked to current
1934 expectLink("liba", "shared_apex29", "libz", "shared_current")
1935 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001936 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001937 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001938 // liba in otherapex is linked to current
1939 expectLink("liba", "shared_apex30", "libz", "shared_current")
1940 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001941 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001943}
1944
Jooyung Hanaed150d2020-04-02 01:41:41 +09001945func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001947 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 native_shared_libs: ["libx"],
1952 min_sdk_version: "R",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 cc_library {
1962 name: "libx",
1963 shared_libs: ["libz"],
1964 system_shared_libs: [],
1965 stl: "none",
1966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001967 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 }
1969
1970 cc_library {
1971 name: "libz",
1972 system_shared_libs: [],
1973 stl: "none",
1974 stubs: {
1975 versions: ["29", "R"],
1976 },
1977 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"R"}
1981 }),
1982 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001983
1984 expectLink := func(from, from_variant, to, to_variant string) {
1985 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987 }
1988 expectNoLink := func(from, from_variant, to, to_variant string) {
1989 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001992 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001994 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001996}
1997
Jooyung Han4c4da062021-06-23 10:23:16 +09001998func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001999 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002000 testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 java_libs: ["libx"],
2005 min_sdk_version: "S",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 java_library {
2015 name: "libx",
2016 srcs: ["a.java"],
2017 apex_available: [ "myapex" ],
2018 sdk_version: "current",
2019 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002020 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002021 }
2022 `,
2023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024 variables.Platform_version_active_codenames = []string{"S"}
2025 variables.Platform_sdk_codename = proptools.StringPtr("S")
2026 }),
2027 )
2028}
2029
Jooyung Han749dc692020-04-15 11:03:39 +09002030func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002031 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002032 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002037 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002038 }
2039
2040 apex_key {
2041 name: "myapex.key",
2042 public_key: "testkey.avbpubkey",
2043 private_key: "testkey.pem",
2044 }
2045
2046 cc_library {
2047 name: "libx",
2048 shared_libs: ["libz"],
2049 system_shared_libs: [],
2050 stl: "none",
2051 apex_available: [ "myapex" ],
2052 }
2053
2054 cc_library {
2055 name: "libz",
2056 system_shared_libs: [],
2057 stl: "none",
2058 stubs: {
2059 versions: ["1", "2"],
2060 },
2061 }
2062 `)
2063
2064 expectLink := func(from, from_variant, to, to_variant string) {
2065 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067 }
2068 expectNoLink := func(from, from_variant, to, to_variant string) {
2069 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002072 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002073 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002076}
2077
Jooyung Handfc864c2023-03-20 18:19:07 +09002078func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002079 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 ctx := testApex(t, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002085 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002086 vendor: true,
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 cc_library {
2097 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002098 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002099 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002101 shared_libs: ["libbar"],
2102 }
2103
2104 cc_library {
2105 name: "libbar",
2106 stubs: { versions: ["29", "30"] },
2107 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002108 }
2109 `)
2110
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002111 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002114
2115 // Ensure that mylib links with "current" LLNDK
2116 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002117 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002118
2119 // Ensure that mylib is targeting 29
2120 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122
2123 // Ensure that the correct variant of crtbegin_so is used.
2124 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002126
2127 // Ensure that the crtbegin_so used by the APEX is targeting 29
2128 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130}
2131
Jooyung Han4495f842023-04-25 16:39:59 +09002132func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002133 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002134 ctx := testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 updatable: true,
2139 native_shared_libs: [
2140 "mylib",
2141 "yourlib",
2142 ],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex {
2147 name: "myapex2",
2148 key: "myapex.key",
2149 updatable: false,
2150 native_shared_libs: ["yourlib"],
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["libbar"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex"],
2165 }
2166
2167 cc_library {
2168 name: "libbar",
2169 stubs: { versions: ["29", "30"] },
2170 }
2171
2172 cc_library {
2173 name: "yourlib",
2174 srcs: ["mylib.cpp"],
2175 min_sdk_version: "29",
2176 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }))
2181
2182 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2184 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002185 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002186 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002188
Jooyung Hana0503a52023-08-23 13:12:50 +09002189 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002190 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002192 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195 flatlist, "mylib:(minSdkVersion:29)")
2196 android.AssertStringListContains(t, "track platform-available lib",
2197 flatlist, "yourlib(minSdkVersion:29)")
2198}
2199
Nouby Mohamed8609a552024-09-04 22:19:51 +00002200func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002201 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002202 ctx := testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 updatable: true,
2207 native_shared_libs: [
2208 "mylib",
2209 "yourlib",
2210 ],
2211 min_sdk_version: "29",
2212 }
2213
2214 apex {
2215 name: "myapex2",
2216 key: "myapex.key",
2217 updatable: false,
2218 native_shared_libs: ["yourlib"],
2219 }
2220
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226
2227 cc_library {
2228 name: "mylib",
2229 srcs: ["mylib.cpp"],
2230 shared_libs: ["libbar"],
2231 min_sdk_version: "29",
2232 apex_available: ["myapex"],
2233 }
2234
2235 cc_library {
2236 name: "libbar",
2237 stubs: { versions: ["29", "30"] },
2238 }
2239
2240 cc_library {
2241 name: "yourlib",
2242 srcs: ["mylib.cpp"],
2243 min_sdk_version: "29",
2244 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2245 }
2246 `, withFiles(android.MockFS{
2247 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2248 }),
2249 android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2252 },
2253 ))
2254
2255 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2256 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2257 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2258 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2259 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2260 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2261
2262 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2263 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2264 myapex.Output("depsinfo/flatlist.txt")), "\n")
2265 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2266 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2267 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2268 flatlist, "mylib:(minSdkVersion:29)")
2269 android.AssertStringListContains(t, "track platform-available lib",
2270 flatlist, "yourlib(minSdkVersion:29)")
2271}
2272
2273func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002274 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002275 ctx := testApex(t, `
2276 apex {
2277 name: "myapex",
2278 key: "myapex.key",
2279 updatable: true,
2280 native_shared_libs: [
2281 "mylib",
2282 "yourlib",
2283 ],
2284 min_sdk_version: "29",
2285 }
2286
2287 apex {
2288 name: "myapex2",
2289 key: "myapex.key",
2290 updatable: false,
2291 native_shared_libs: ["yourlib"],
2292 }
2293
2294 apex_key {
2295 name: "myapex.key",
2296 public_key: "testkey.avbpubkey",
2297 private_key: "testkey.pem",
2298 }
2299
2300 cc_library {
2301 name: "mylib",
2302 srcs: ["mylib.cpp"],
2303 shared_libs: ["libbar"],
2304 min_sdk_version: "29",
2305 apex_available: ["myapex"],
2306 }
2307
2308 cc_library {
2309 name: "libbar",
2310 stubs: { versions: ["29", "30"] },
2311 }
2312
2313 cc_library {
2314 name: "yourlib",
2315 srcs: ["mylib.cpp"],
2316 min_sdk_version: "29",
2317 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2318 }
2319 `, withFiles(android.MockFS{
2320 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2321 "packages/modules/common/build/allowed_deps.txt": nil,
2322 }),
2323 android.FixtureModifyProductVariables(
2324 func(variables android.FixtureProductVariables) {
2325 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2326 },
2327 ))
2328
2329 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2330 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2331 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2332 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2333 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2334 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2335
2336 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2337 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2338 myapex.Output("depsinfo/flatlist.txt")), "\n")
2339 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2340 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2341 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2342 flatlist, "mylib:(minSdkVersion:29)")
2343 android.AssertStringListContains(t, "track platform-available lib",
2344 flatlist, "yourlib(minSdkVersion:29)")
2345}
2346
Jooyung Han4495f842023-04-25 16:39:59 +09002347func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002348 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002349 ctx := testApex(t, `
2350 apex {
2351 name: "myapex",
2352 key: "myapex.key",
2353 updatable: true,
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
2362 `)
2363 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2364 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2365 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2366 }
2367}
2368
Jooyung Han03b51852020-02-26 22:45:42 +09002369func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002371 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002372 apex {
2373 name: "myapex",
2374 key: "myapex.key",
2375 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002376 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002377 }
2378
2379 apex_key {
2380 name: "myapex.key",
2381 public_key: "testkey.avbpubkey",
2382 private_key: "testkey.pem",
2383 }
2384
2385 cc_library {
2386 name: "libx",
2387 system_shared_libs: [],
2388 stl: "none",
2389 apex_available: [ "myapex" ],
2390 stubs: {
2391 versions: ["1", "2"],
2392 },
2393 }
2394
2395 cc_library {
2396 name: "libz",
2397 shared_libs: ["libx"],
2398 system_shared_libs: [],
2399 stl: "none",
2400 }
2401 `)
2402
2403 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002404 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002405 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2406 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2407 }
2408 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002409 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002410 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2411 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2412 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002413 expectLink("libz", "shared", "libx", "shared_current")
2414 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002415 expectNoLink("libz", "shared", "libz", "shared_1")
2416 expectNoLink("libz", "shared", "libz", "shared")
2417}
2418
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002419var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2420 func(variables android.FixtureProductVariables) {
2421 variables.SanitizeDevice = []string{"hwaddress"}
2422 },
2423)
2424
Jooyung Han75568392020-03-20 04:29:24 +09002425func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002426 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002427 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002428 apex {
2429 name: "myapex",
2430 key: "myapex.key",
2431 native_shared_libs: ["libx"],
2432 min_sdk_version: "29",
2433 }
2434
2435 apex_key {
2436 name: "myapex.key",
2437 public_key: "testkey.avbpubkey",
2438 private_key: "testkey.pem",
2439 }
2440
2441 cc_library {
2442 name: "libx",
2443 shared_libs: ["libbar"],
2444 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002445 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002446 }
2447
2448 cc_library {
2449 name: "libbar",
2450 stubs: {
2451 versions: ["29", "30"],
2452 },
2453 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002454 `,
2455 prepareForTestWithSantitizeHwaddress,
2456 )
Jooyung Han03b51852020-02-26 22:45:42 +09002457 expectLink := func(from, from_variant, to, to_variant string) {
2458 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2459 libFlags := ld.Args["libFlags"]
2460 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2461 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002462 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002463}
2464
Jooyung Han75568392020-03-20 04:29:24 +09002465func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002466 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002467 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 native_shared_libs: ["libx"],
2472 min_sdk_version: "29",
2473 }
2474
2475 apex_key {
2476 name: "myapex.key",
2477 public_key: "testkey.avbpubkey",
2478 private_key: "testkey.pem",
2479 }
2480
2481 cc_library {
2482 name: "libx",
2483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002485 }
Jooyung Han75568392020-03-20 04:29:24 +09002486 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002487
2488 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002489 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002490 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002491 // note that platform variant is not.
2492 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002493 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002494}
2495
Jooyung Han749dc692020-04-15 11:03:39 +09002496func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002497 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002498 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002499 apex {
2500 name: "myapex",
2501 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002502 native_shared_libs: ["mylib"],
2503 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002504 }
2505
2506 apex_key {
2507 name: "myapex.key",
2508 public_key: "testkey.avbpubkey",
2509 private_key: "testkey.pem",
2510 }
Jooyung Han749dc692020-04-15 11:03:39 +09002511
2512 cc_library {
2513 name: "mylib",
2514 srcs: ["mylib.cpp"],
2515 system_shared_libs: [],
2516 stl: "none",
2517 apex_available: [
2518 "myapex",
2519 ],
2520 min_sdk_version: "30",
2521 }
2522 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002523
2524 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["libfoo.ffi"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
2538 rust_ffi_shared {
2539 name: "libfoo.ffi",
2540 srcs: ["foo.rs"],
2541 crate_name: "foo",
2542 apex_available: [
2543 "myapex",
2544 ],
2545 min_sdk_version: "30",
2546 }
2547 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002548
2549 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 java_libs: ["libfoo"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 java_import {
2564 name: "libfoo",
2565 jars: ["libfoo.jar"],
2566 apex_available: [
2567 "myapex",
2568 ],
2569 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002570 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002571 }
2572 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002573
2574 // Skip check for modules compiling against core API surface
2575 testApex(t, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 java_libs: ["libfoo"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 java_library {
2590 name: "libfoo",
2591 srcs: ["Foo.java"],
2592 apex_available: [
2593 "myapex",
2594 ],
2595 // Compile against core API surface
2596 sdk_version: "core_current",
2597 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002598 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002599 }
2600 `)
2601
Jooyung Han749dc692020-04-15 11:03:39 +09002602}
2603
2604func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002605 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002606 testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 native_shared_libs: ["libfoo"],
2611 java_libs: ["libbar"],
2612 min_sdk_version: "29",
2613 }
2614
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
2619 }
2620
2621 cc_library {
2622 name: "libfoo",
2623 srcs: ["mylib.cpp"],
2624 shared_libs: ["libfoo_dep"],
2625 apex_available: ["myapex"],
2626 min_sdk_version: "29",
2627 }
2628
2629 cc_library {
2630 name: "libfoo_dep",
2631 srcs: ["mylib.cpp"],
2632 apex_available: ["myapex"],
2633 min_sdk_version: "29",
2634 }
2635
2636 java_library {
2637 name: "libbar",
2638 sdk_version: "current",
2639 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002640 static_libs: [
2641 "libbar_dep",
2642 "libbar_import_dep",
2643 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002644 apex_available: ["myapex"],
2645 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002646 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002647 }
2648
2649 java_library {
2650 name: "libbar_dep",
2651 sdk_version: "current",
2652 srcs: ["a.java"],
2653 apex_available: ["myapex"],
2654 min_sdk_version: "29",
2655 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002656
2657 java_import {
2658 name: "libbar_import_dep",
2659 jars: ["libbar.jar"],
2660 apex_available: ["myapex"],
2661 min_sdk_version: "29",
2662 }
Jooyung Han03b51852020-02-26 22:45:42 +09002663 `)
2664}
2665
Colin Cross8ca61c12022-10-06 21:00:14 -07002666func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002667 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002668 // Tests that an apex dependency with min_sdk_version higher than the
2669 // min_sdk_version of the apex is allowed as long as the dependency's
2670 // min_sdk_version is less than or equal to the api level that the
2671 // architecture was introduced in. In this case, arm64 didn't exist
2672 // until api level 21, so the arm64 code will never need to run on
2673 // an api level 20 device, even if other architectures of the apex
2674 // will.
2675 testApex(t, `
2676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 native_shared_libs: ["libfoo"],
2680 min_sdk_version: "20",
2681 }
2682
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688
2689 cc_library {
2690 name: "libfoo",
2691 srcs: ["mylib.cpp"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "21",
2694 stl: "none",
2695 }
2696 `)
2697}
2698
Artur Satayev8cf899a2020-04-15 17:29:42 +01002699func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002700 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002701 testCases := []struct {
2702 name string
2703 expectedError string
2704 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002705 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002706 }{
2707 {
2708 name: "Non-updatable apex with non-stable dep",
2709 bp: `
2710 apex {
2711 name: "myapex",
2712 java_libs: ["myjar"],
2713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 java_library {
2722 name: "myjar",
2723 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002724 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002725 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002726 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002727 }
2728 `,
2729 },
2730 {
2731 name: "Updatable apex with stable dep",
2732 bp: `
2733 apex {
2734 name: "myapex",
2735 java_libs: ["myjar"],
2736 key: "myapex.key",
2737 updatable: true,
2738 min_sdk_version: "29",
2739 }
2740 apex_key {
2741 name: "myapex.key",
2742 public_key: "testkey.avbpubkey",
2743 private_key: "testkey.pem",
2744 }
2745 java_library {
2746 name: "myjar",
2747 srcs: ["foo/bar/MyClass.java"],
2748 sdk_version: "current",
2749 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002750 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002751 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002752 }
2753 `,
2754 },
2755 {
2756 name: "Updatable apex with non-stable dep",
2757 expectedError: "cannot depend on \"myjar\"",
2758 bp: `
2759 apex {
2760 name: "myapex",
2761 java_libs: ["myjar"],
2762 key: "myapex.key",
2763 updatable: true,
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 java_library {
2771 name: "myjar",
2772 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002773 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002774 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002775 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002776 }
2777 `,
2778 },
2779 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002780 name: "Updatable apex with non-stable legacy core platform dep",
2781 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2782 bp: `
2783 apex {
2784 name: "myapex",
2785 java_libs: ["myjar-uses-legacy"],
2786 key: "myapex.key",
2787 updatable: true,
2788 }
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794 java_library {
2795 name: "myjar-uses-legacy",
2796 srcs: ["foo/bar/MyClass.java"],
2797 sdk_version: "core_platform",
2798 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002799 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 }
2801 `,
2802 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2803 },
2804 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002805 name: "Updatable apex with non-stable transitive dep",
2806 // This is not actually detecting that the transitive dependency is unstable, rather it is
2807 // detecting that the transitive dependency is building against a wider API surface than the
2808 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002809 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002810 bp: `
2811 apex {
2812 name: "myapex",
2813 java_libs: ["myjar"],
2814 key: "myapex.key",
2815 updatable: true,
2816 }
2817 apex_key {
2818 name: "myapex.key",
2819 public_key: "testkey.avbpubkey",
2820 private_key: "testkey.pem",
2821 }
2822 java_library {
2823 name: "myjar",
2824 srcs: ["foo/bar/MyClass.java"],
2825 sdk_version: "current",
2826 apex_available: ["myapex"],
2827 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002828 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002829 }
2830 java_library {
2831 name: "transitive-jar",
2832 srcs: ["foo/bar/MyClass.java"],
2833 sdk_version: "core_platform",
2834 apex_available: ["myapex"],
2835 }
2836 `,
2837 },
2838 }
2839
2840 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002841 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2842 continue
2843 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002844 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002845 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002846 errorHandler := android.FixtureExpectsNoErrors
2847 if test.expectedError != "" {
2848 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 android.GroupFixturePreparers(
2851 java.PrepareForTestWithJavaDefaultModules,
2852 PrepareForTestWithApexBuildComponents,
2853 prepareForTestWithMyapex,
2854 android.OptionalFixturePreparer(test.preparer),
2855 ).
2856 ExtendWithErrorHandler(errorHandler).
2857 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 })
2859 }
2860}
2861
Jooyung Han749dc692020-04-15 11:03:39 +09002862func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2863 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 native_shared_libs: ["mylib"],
2868 min_sdk_version: "29",
2869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 srcs: ["mylib.cpp"],
2880 shared_libs: ["mylib2"],
2881 system_shared_libs: [],
2882 stl: "none",
2883 apex_available: [
2884 "myapex",
2885 ],
2886 min_sdk_version: "29",
2887 }
2888
2889 // indirect part of the apex
2890 cc_library {
2891 name: "mylib2",
2892 srcs: ["mylib.cpp"],
2893 system_shared_libs: [],
2894 stl: "none",
2895 apex_available: [
2896 "myapex",
2897 ],
2898 min_sdk_version: "30",
2899 }
2900 `)
2901}
2902
2903func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002904 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002905 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 apps: ["AppFoo"],
2910 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002911 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 android_app {
2921 name: "AppFoo",
2922 srcs: ["foo/bar/MyClass.java"],
2923 sdk_version: "current",
2924 min_sdk_version: "29",
2925 system_modules: "none",
2926 stl: "none",
2927 static_libs: ["bar"],
2928 apex_available: [ "myapex" ],
2929 }
2930
2931 java_library {
2932 name: "bar",
2933 sdk_version: "current",
2934 srcs: ["a.java"],
2935 apex_available: [ "myapex" ],
2936 }
2937 `)
2938}
2939
2940func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 native_shared_libs: ["mylib"],
2947 min_sdk_version: "29",
2948 }
2949
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955
Colin Crossea91a172024-11-05 16:14:05 -08002956 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002957 cc_library {
2958 name: "mylib",
2959 srcs: ["mylib.cpp"],
2960 shared_libs: ["mylib2"],
2961 system_shared_libs: [],
2962 stl: "none",
2963 apex_available: ["myapex", "otherapex"],
2964 min_sdk_version: "29",
2965 }
2966
2967 cc_library {
2968 name: "mylib2",
2969 srcs: ["mylib.cpp"],
2970 system_shared_libs: [],
2971 stl: "none",
2972 apex_available: ["otherapex"],
2973 stubs: { versions: ["29", "30"] },
2974 min_sdk_version: "30",
2975 }
2976
2977 apex {
2978 name: "otherapex",
2979 key: "myapex.key",
2980 native_shared_libs: ["mylib", "mylib2"],
2981 min_sdk_version: "30",
2982 }
2983 `)
2984 expectLink := func(from, from_variant, to, to_variant string) {
2985 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2986 libFlags := ld.Args["libFlags"]
2987 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2988 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002989 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002990 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002991}
2992
Jooyung Haned124c32021-01-26 11:43:46 +09002993func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002994 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002995 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2996 func(variables android.FixtureProductVariables) {
2997 variables.Platform_sdk_codename = proptools.StringPtr("S")
2998 variables.Platform_version_active_codenames = []string{"S"}
2999 },
3000 )
Jooyung Haned124c32021-01-26 11:43:46 +09003001 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3002 apex {
3003 name: "myapex",
3004 key: "myapex.key",
3005 native_shared_libs: ["libfoo"],
3006 min_sdk_version: "S",
3007 }
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013 cc_library {
3014 name: "libfoo",
3015 shared_libs: ["libbar"],
3016 apex_available: ["myapex"],
3017 min_sdk_version: "29",
3018 }
3019 cc_library {
3020 name: "libbar",
3021 apex_available: ["myapex"],
3022 }
3023 `, withSAsActiveCodeNames)
3024}
3025
3026func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003027 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003028 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3029 variables.Platform_sdk_codename = proptools.StringPtr("S")
3030 variables.Platform_version_active_codenames = []string{"S", "T"}
3031 })
Colin Cross1c460562021-02-16 17:55:47 -08003032 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 native_shared_libs: ["libfoo"],
3037 min_sdk_version: "S",
3038 }
3039 apex_key {
3040 name: "myapex.key",
3041 public_key: "testkey.avbpubkey",
3042 private_key: "testkey.pem",
3043 }
3044 cc_library {
3045 name: "libfoo",
3046 shared_libs: ["libbar"],
3047 apex_available: ["myapex"],
3048 min_sdk_version: "S",
3049 }
3050 cc_library {
3051 name: "libbar",
3052 stubs: {
3053 symbol_file: "libbar.map.txt",
3054 versions: ["30", "S", "T"],
3055 },
3056 }
3057 `, withSAsActiveCodeNames)
3058
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003059 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003060 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3061 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003062 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003063}
3064
Jiyong Park7c2ee712018-12-07 00:42:25 +09003065func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003066 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003067 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003068 apex {
3069 name: "myapex",
3070 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003071 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003072 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003073 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003074 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003075 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003076 }
3077
3078 apex_key {
3079 name: "myapex.key",
3080 public_key: "testkey.avbpubkey",
3081 private_key: "testkey.pem",
3082 }
3083
3084 prebuilt_etc {
3085 name: "myetc",
3086 src: "myprebuilt",
3087 sub_dir: "foo/bar",
3088 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003089
3090 cc_library {
3091 name: "mylib",
3092 srcs: ["mylib.cpp"],
3093 relative_install_path: "foo/bar",
3094 system_shared_libs: [],
3095 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003096 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003097 }
3098
3099 cc_binary {
3100 name: "mybin",
3101 srcs: ["mylib.cpp"],
3102 relative_install_path: "foo/bar",
3103 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003105 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003106 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003107
3108 rust_binary {
3109 name: "mybin.rust",
3110 srcs: ["foo.rs"],
3111 relative_install_path: "rust_subdir",
3112 apex_available: [ "myapex" ],
3113 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003114 `)
3115
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003117 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003118
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003119 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003120 ensureContains(t, cmd, "/etc ")
3121 ensureContains(t, cmd, "/etc/foo ")
3122 ensureContains(t, cmd, "/etc/foo/bar ")
3123 ensureContains(t, cmd, "/lib64 ")
3124 ensureContains(t, cmd, "/lib64/foo ")
3125 ensureContains(t, cmd, "/lib64/foo/bar ")
3126 ensureContains(t, cmd, "/lib ")
3127 ensureContains(t, cmd, "/lib/foo ")
3128 ensureContains(t, cmd, "/lib/foo/bar ")
3129 ensureContains(t, cmd, "/bin ")
3130 ensureContains(t, cmd, "/bin/foo ")
3131 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003132 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003133}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003134
Jooyung Han35155c42020-02-06 17:33:20 +09003135func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 multilib: {
3142 both: {
3143 native_shared_libs: ["mylib"],
3144 binaries: ["mybin"],
3145 },
3146 },
3147 compile_multilib: "both",
3148 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 cc_library {
3159 name: "mylib",
3160 relative_install_path: "foo/bar",
3161 system_shared_libs: [],
3162 stl: "none",
3163 apex_available: [ "myapex" ],
3164 native_bridge_supported: true,
3165 }
3166
3167 cc_binary {
3168 name: "mybin",
3169 relative_install_path: "foo/bar",
3170 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003171 stl: "none",
3172 apex_available: [ "myapex" ],
3173 native_bridge_supported: true,
3174 compile_multilib: "both", // default is "first" for binary
3175 multilib: {
3176 lib64: {
3177 suffix: "64",
3178 },
3179 },
3180 }
Spandan Das45e40012024-12-02 22:45:48 +00003181 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003182 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003183 "bin/foo/bar/mybin",
3184 "bin/foo/bar/mybin64",
3185 "bin/arm/foo/bar/mybin",
3186 "bin/arm64/foo/bar/mybin64",
3187 "lib/foo/bar/mylib.so",
3188 "lib/arm/foo/bar/mylib.so",
3189 "lib64/foo/bar/mylib.so",
3190 "lib64/arm64/foo/bar/mylib.so",
3191 })
3192}
3193
Jooyung Han85d61762020-06-24 23:50:26 +09003194func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003195 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003196 result := android.GroupFixturePreparers(
3197 prepareForApexTest,
3198 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3199 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003200 apex {
3201 name: "myapex",
3202 key: "myapex.key",
3203 binaries: ["mybin"],
3204 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212 cc_binary {
3213 name: "mybin",
3214 vendor: true,
3215 shared_libs: ["libfoo"],
3216 }
3217 cc_library {
3218 name: "libfoo",
3219 proprietary: true,
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003224 "bin/mybin",
3225 "lib64/libfoo.so",
3226 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3227 "lib64/libc++.so",
3228 })
3229
Jooyung Hana0503a52023-08-23 13:12:50 +09003230 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003231 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003232 name := apexBundle.BaseModuleName()
3233 prefix := "TARGET_"
3234 var builder strings.Builder
3235 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003236 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003237 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003238 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003239
Jooyung Hana0503a52023-08-23 13:12:50 +09003240 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003241 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3242 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003243}
3244
Justin Yun13decfb2021-03-08 19:25:55 +09003245func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003246 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003247 ctx := testApex(t, `
3248 apex {
3249 name: "myapex",
3250 key: "myapex.key",
3251 updatable: false,
3252 product_specific: true,
3253 binaries: ["foo"],
3254 }
3255
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }
3261
3262 cc_binary {
3263 name: "foo",
3264 product_available: true,
3265 apex_available: ["myapex"],
3266 srcs: ["foo.cpp"],
3267 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003268 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003269
3270 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003271 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003272 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3273 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3274 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3275 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3276}
3277
Jooyung Han8e5685d2020-09-21 11:02:57 +09003278func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003279 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003280 testCases := []struct {
3281 name string
3282 additionalProp string
3283 }{
3284 {"system apex with prebuilt_firmware", ""},
3285 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3286 }
3287 for _, tc := range testCases {
3288 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003289 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003290 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003291 apex {
3292 name: "myapex",
3293 key: "myapex.key",
3294 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003296 `+tc.additionalProp+`
3297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 prebuilt_firmware {
3304 name: "myfirmware",
3305 src: "myfirmware.bin",
3306 filename_from_src: true,
3307 `+tc.additionalProp+`
3308 }
3309 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 "etc/firmware/myfirmware.bin",
3312 })
3313 })
3314 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003315}
3316
Jooyung Hanefb184e2020-06-25 17:14:25 +09003317func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003318 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003320 apex {
3321 name: "myapex",
3322 key: "myapex.key",
3323 vendor: true,
3324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003325 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003326 }
3327
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333
3334 cc_library {
3335 name: "mylib",
3336 vendor_available: true,
3337 }
3338 `)
3339
Jooyung Hana0503a52023-08-23 13:12:50 +09003340 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003341 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003342 name := apexBundle.BaseModuleName()
3343 prefix := "TARGET_"
3344 var builder strings.Builder
3345 data.Custom(&builder, name, prefix, "", data)
3346 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003348}
3349
Jooyung Han2ed99d02020-06-24 23:26:26 +09003350func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003351 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003352 apex {
3353 name: "myapex",
3354 key: "myapex.key",
3355 vintf_fragments: ["fragment.xml"],
3356 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003357 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003358 }
3359 apex_key {
3360 name: "myapex.key",
3361 public_key: "testkey.avbpubkey",
3362 private_key: "testkey.pem",
3363 }
3364 cc_binary {
3365 name: "mybin",
3366 }
3367 `)
3368
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003370 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003371 name := apexBundle.BaseModuleName()
3372 prefix := "TARGET_"
3373 var builder strings.Builder
3374 data.Custom(&builder, name, prefix, "", data)
3375 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003376 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003377 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378}
3379
Jiyong Park16e91a02018-12-20 18:18:08 +09003380func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003381 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003382 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003383 apex {
3384 name: "myapex",
3385 key: "myapex.key",
3386 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 srcs: ["mylib.cpp"],
3399 system_shared_libs: [],
3400 stl: "none",
3401 stubs: {
3402 versions: ["1", "2", "3"],
3403 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003404 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003405 }
3406
3407 cc_binary {
3408 name: "not_in_apex",
3409 srcs: ["mylib.cpp"],
3410 static_libs: ["mylib"],
3411 static_executable: true,
3412 system_shared_libs: [],
3413 stl: "none",
3414 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003415 `)
3416
Colin Cross7113d202019-11-20 16:39:12 -08003417 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003418
3419 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003420 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003421}
Jiyong Park9335a262018-12-24 11:31:58 +09003422
3423func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003424 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003425 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003426 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003427 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003428 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003429 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003430 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003431 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003433 }
3434
3435 cc_library {
3436 name: "mylib",
3437 srcs: ["mylib.cpp"],
3438 system_shared_libs: [],
3439 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003440 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 android_app_certificate {
3450 name: "myapex.certificate",
3451 certificate: "testkey",
3452 }
3453
3454 android_app_certificate {
3455 name: "myapex.certificate.override",
3456 certificate: "testkey.override",
3457 }
3458
Jiyong Park9335a262018-12-24 11:31:58 +09003459 `)
3460
3461 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003462 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003463
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003464 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3465 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003466 "vendor/foo/devkeys/testkey.avbpubkey")
3467 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003468 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3469 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003470 "vendor/foo/devkeys/testkey.pem")
3471 }
3472
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003473 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003474 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003475 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003476 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003477 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003478 }
3479}
Jiyong Park58e364a2019-01-19 19:24:06 +09003480
Jooyung Hanf121a652019-12-17 14:30:11 +09003481func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003485 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003490 }
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003496 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003497 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3498 if actual := rule.Args["certificates"]; actual != expected {
3499 t.Errorf("certificates should be %q, not %q", expected, actual)
3500 }
3501 })
3502 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003503 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003504 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003505 apex {
3506 name: "myapex_keytest",
3507 key: "myapex.key",
3508 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516 android_app_certificate {
3517 name: "myapex.certificate.override",
3518 certificate: "testkey.override",
3519 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003520 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003521 expected := "testkey.override.x509.pem testkey.override.pk8"
3522 if actual := rule.Args["certificates"]; actual != expected {
3523 t.Errorf("certificates should be %q, not %q", expected, actual)
3524 }
3525 })
3526 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003534 }
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540 android_app_certificate {
3541 name: "myapex.certificate",
3542 certificate: "testkey",
3543 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003544 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003545 expected := "testkey.x509.pem testkey.pk8"
3546 if actual := rule.Args["certificates"]; actual != expected {
3547 t.Errorf("certificates should be %q, not %q", expected, actual)
3548 }
3549 })
3550 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003551 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003552 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003553 apex {
3554 name: "myapex_keytest",
3555 key: "myapex.key",
3556 file_contexts: ":myapex-file_contexts",
3557 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003558 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003559 }
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565 android_app_certificate {
3566 name: "myapex.certificate.override",
3567 certificate: "testkey.override",
3568 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003569 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003570 expected := "testkey.override.x509.pem testkey.override.pk8"
3571 if actual := rule.Args["certificates"]; actual != expected {
3572 t.Errorf("certificates should be %q, not %q", expected, actual)
3573 }
3574 })
3575 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003576 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003577 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003578 apex {
3579 name: "myapex",
3580 key: "myapex.key",
3581 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003582 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003583 }
3584 apex_key {
3585 name: "myapex.key",
3586 public_key: "testkey.avbpubkey",
3587 private_key: "testkey.pem",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex_keytest",
3600 key: "myapex.key",
3601 file_contexts: ":myapex-file_contexts",
3602 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003603 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003604 }
3605 apex_key {
3606 name: "myapex.key",
3607 public_key: "testkey.avbpubkey",
3608 private_key: "testkey.pem",
3609 }
3610 android_app_certificate {
3611 name: "myapex.certificate.override",
3612 certificate: "testkey.override",
3613 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003614 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003615 expected := "testkey.override.x509.pem testkey.override.pk8"
3616 if actual := rule.Args["certificates"]; actual != expected {
3617 t.Errorf("certificates should be %q, not %q", expected, actual)
3618 }
3619 })
3620}
3621
Jiyong Park58e364a2019-01-19 19:24:06 +09003622func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003623 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003624 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003625 apex {
3626 name: "myapex",
3627 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003628 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003629 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003630 }
3631
3632 apex {
3633 name: "otherapex",
3634 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003635 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003636 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003637 }
3638
3639 apex_key {
3640 name: "myapex.key",
3641 public_key: "testkey.avbpubkey",
3642 private_key: "testkey.pem",
3643 }
3644
3645 cc_library {
3646 name: "mylib",
3647 srcs: ["mylib.cpp"],
3648 system_shared_libs: [],
3649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003650 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003651 "myapex",
3652 "otherapex",
3653 ],
Jooyung Han24282772020-03-21 23:20:55 +09003654 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003655 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003656 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003657 cc_library {
3658 name: "mylib2",
3659 srcs: ["mylib.cpp"],
3660 system_shared_libs: [],
3661 stl: "none",
3662 apex_available: [
3663 "myapex",
3664 "otherapex",
3665 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003666 static_libs: ["mylib3"],
3667 recovery_available: true,
3668 min_sdk_version: "29",
3669 }
3670 cc_library {
3671 name: "mylib3",
3672 srcs: ["mylib.cpp"],
3673 system_shared_libs: [],
3674 stl: "none",
3675 apex_available: [
3676 "myapex",
3677 "otherapex",
3678 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003679 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003680 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003681 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003682 `)
3683
Jooyung Hanc87a0592020-03-02 17:44:33 +09003684 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003685 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003686 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003687
Vinh Tranf9754732023-01-19 22:41:46 -05003688 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003689 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003690 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003695
Colin Crossaede88c2020-08-11 12:17:01 -07003696 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3697 // each variant defines additional macros to distinguish which apex variant it is built for
3698
3699 // non-APEX variant does not have __ANDROID_APEX__ defined
3700 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3701 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3702
Vinh Tranf9754732023-01-19 22:41:46 -05003703 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003706
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707 // non-APEX variant does not have __ANDROID_APEX__ defined
3708 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3710
Vinh Tranf9754732023-01-19 22:41:46 -05003711 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003714}
Jiyong Park7e636d02019-01-28 16:16:54 +09003715
3716func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003718 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003719 apex {
3720 name: "myapex",
3721 key: "myapex.key",
3722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003723 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003724 }
3725
3726 apex_key {
3727 name: "myapex.key",
3728 public_key: "testkey.avbpubkey",
3729 private_key: "testkey.pem",
3730 }
3731
3732 cc_library_headers {
3733 name: "mylib_headers",
3734 export_include_dirs: ["my_include"],
3735 system_shared_libs: [],
3736 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003737 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003738 }
3739
3740 cc_library {
3741 name: "mylib",
3742 srcs: ["mylib.cpp"],
3743 system_shared_libs: [],
3744 stl: "none",
3745 header_libs: ["mylib_headers"],
3746 export_header_lib_headers: ["mylib_headers"],
3747 stubs: {
3748 versions: ["1", "2", "3"],
3749 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003750 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003751 }
3752
3753 cc_library {
3754 name: "otherlib",
3755 srcs: ["mylib.cpp"],
3756 system_shared_libs: [],
3757 stl: "none",
3758 shared_libs: ["mylib"],
3759 }
3760 `)
3761
Colin Cross7113d202019-11-20 16:39:12 -08003762 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003763
3764 // Ensure that the include path of the header lib is exported to 'otherlib'
3765 ensureContains(t, cFlags, "-Imy_include")
3766}
Alex Light9670d332019-01-29 18:07:33 -08003767
Jiyong Park7cd10e32020-01-14 09:22:18 +09003768type fileInApex struct {
3769 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003770 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 isLink bool
3772}
3773
Jooyung Han1724d582022-12-21 10:17:44 +09003774func (f fileInApex) String() string {
3775 return f.src + ":" + f.path
3776}
3777
3778func (f fileInApex) match(expectation string) bool {
3779 parts := strings.Split(expectation, ":")
3780 if len(parts) == 1 {
3781 match, _ := path.Match(parts[0], f.path)
3782 return match
3783 }
3784 if len(parts) == 2 {
3785 matchSrc, _ := path.Match(parts[0], f.src)
3786 matchDst, _ := path.Match(parts[1], f.path)
3787 return matchSrc && matchDst
3788 }
3789 panic("invalid expected file specification: " + expectation)
3790}
3791
Jooyung Hana57af4a2020-01-23 05:36:59 +00003792func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003793 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003794 module := ctx.ModuleForTests(moduleName, variant)
3795 apexRule := module.MaybeRule("apexRule")
3796 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003798 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003799 for _, cmd := range strings.Split(copyCmds, "&&") {
3800 cmd = strings.TrimSpace(cmd)
3801 if cmd == "" {
3802 continue
3803 }
3804 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003805 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003806 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 switch terms[0] {
3808 case "mkdir":
3809 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 t.Fatal("copyCmds contains invalid cp command", cmd)
3812 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003813 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003814 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003815 isLink = false
3816 case "ln":
3817 if len(terms) != 3 && len(terms) != 4 {
3818 // ln LINK TARGET or ln -s LINK TARGET
3819 t.Fatal("copyCmds contains invalid ln command", cmd)
3820 }
3821 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003822 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003823 isLink = true
3824 default:
3825 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3826 }
3827 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003828 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003829 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003830 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 }
Jooyung Han1724d582022-12-21 10:17:44 +09003832 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003833 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003834 }
3835 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003836 return ret
3837}
3838
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003839func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003840 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003841 var failed bool
3842 var surplus []string
3843 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003844 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003845 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003846 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003847 if file.match(expected) {
3848 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003849 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003850 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003851 }
3852 }
Jooyung Han1724d582022-12-21 10:17:44 +09003853 if !matchFound {
3854 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003857
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003859 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003860 t.Log("surplus files", surplus)
3861 failed = true
3862 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003865 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 if !filesMatched[expected] {
3868 missing = append(missing, expected)
3869 }
3870 }
3871 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003872 t.Log("missing files", missing)
3873 failed = true
3874 }
3875 if failed {
3876 t.Fail()
3877 }
3878}
3879
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003880func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3881 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3882}
3883
3884func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003885 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3887 if deapexer.Output != nil {
3888 outputs = append(outputs, deapexer.Output.String())
3889 }
3890 for _, output := range deapexer.ImplicitOutputs {
3891 outputs = append(outputs, output.String())
3892 }
3893 actualFiles := make([]fileInApex, 0, len(outputs))
3894 for _, output := range outputs {
3895 dir := "/deapexer/"
3896 pos := strings.LastIndex(output, dir)
3897 if pos == -1 {
3898 t.Fatal("Unknown deapexer output ", output)
3899 }
3900 path := output[pos+len(dir):]
3901 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3902 }
3903 assertFileListEquals(t, files, actualFiles)
3904}
3905
Jooyung Han39edb6c2019-11-06 16:53:07 +09003906func vndkLibrariesTxtFiles(vers ...string) (result string) {
3907 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003908 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003909 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 prebuilt_etc {
3911 name: "` + txt + `.libraries.` + v + `.txt",
3912 src: "dummy.txt",
3913 }
3914 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 }
3916 }
3917 return
3918}
3919
Jooyung Han344d5432019-08-23 11:17:39 +09003920func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003921 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003922 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003923 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003924 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003926 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003928 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 }
3930
3931 apex_key {
3932 name: "myapex.key",
3933 public_key: "testkey.avbpubkey",
3934 private_key: "testkey.pem",
3935 }
3936
Jooyung Han31c470b2019-10-18 16:26:59 +09003937 vndk_prebuilt_shared {
3938 name: "libvndk27",
3939 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003940 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003941 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003942 vndk: {
3943 enabled: true,
3944 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003945 target_arch: "arm64",
3946 arch: {
3947 arm: {
3948 srcs: ["libvndk27_arm.so"],
3949 },
3950 arm64: {
3951 srcs: ["libvndk27_arm64.so"],
3952 },
3953 },
Colin Cross2807f002021-03-02 10:15:29 -08003954 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003955 }
3956
3957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "x86_64",
3966 arch: {
3967 x86: {
3968 srcs: ["libvndk27_x86.so"],
3969 },
3970 x86_64: {
3971 srcs: ["libvndk27_x86_64.so"],
3972 },
3973 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003974 }
3975 `+vndkLibrariesTxtFiles("27"),
3976 withFiles(map[string][]byte{
3977 "libvndk27_arm.so": nil,
3978 "libvndk27_arm64.so": nil,
3979 "libvndk27_x86.so": nil,
3980 "libvndk27_x86_64.so": nil,
3981 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003982
Jooyung Hana0503a52023-08-23 13:12:50 +09003983 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003984 "lib/libvndk27_arm.so",
3985 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 })
Jooyung Han344d5432019-08-23 11:17:39 +09003988}
3989
Jooyung Han90eee022019-10-01 20:02:42 +09003990func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003993 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003994 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003995 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003997 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003998 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003999 }
4000 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004001 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004002 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004003 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004004 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004006 }
4007 apex_key {
4008 name: "myapex.key",
4009 public_key: "testkey.avbpubkey",
4010 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004011 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004012
4013 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004014 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004015 apexManifestRule := module.Rule("apexManifestRule")
4016 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004017 }
4018
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004019 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004020 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004021}
4022
Jooyung Han344d5432019-08-23 11:17:39 +09004023func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004024 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004025 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004026 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004027 name: "com.android.vndk.v30",
4028 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 native_bridge_supported: true,
4031 }
4032
4033 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004034 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004035 public_key: "testkey.avbpubkey",
4036 private_key: "testkey.pem",
4037 }
4038
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004039 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004040 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004041 version: "30",
4042 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004043 srcs: ["mylib.cpp"],
4044 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004045 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004046 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004047 vndk: {
4048 enabled: true,
4049 },
Jooyung Han344d5432019-08-23 11:17:39 +09004050 }
4051 `)
4052}
4053
Jooyung Han31c470b2019-10-18 16:26:59 +09004054func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004055 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004059 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004062 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 vndk_prebuilt_shared {
4072 name: "libvndk27",
4073 version: "27",
4074 target_arch: "arm",
4075 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004076 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 vndk: {
4078 enabled: true,
4079 },
4080 arch: {
4081 arm: {
4082 srcs: ["libvndk27.so"],
4083 }
4084 },
4085 }
4086
4087 vndk_prebuilt_shared {
4088 name: "libvndk27",
4089 version: "27",
4090 target_arch: "arm",
4091 binder32bit: true,
4092 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004093 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004094 vndk: {
4095 enabled: true,
4096 },
4097 arch: {
4098 arm: {
4099 srcs: ["libvndk27binder32.so"],
4100 }
4101 },
Colin Cross2807f002021-03-02 10:15:29 -08004102 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004104 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004105 withFiles(map[string][]byte{
4106 "libvndk27.so": nil,
4107 "libvndk27binder32.so": nil,
4108 }),
4109 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004110 android.FixtureModifyConfig(func(config android.Config) {
4111 target := android.Target{
4112 Os: android.Android,
4113 Arch: android.Arch{
4114 ArchType: android.Arm,
4115 ArchVariant: "armv7-a-neon",
4116 Abi: []string{"armeabi-v7a"},
4117 },
4118 NativeBridge: android.NativeBridgeDisabled,
4119 NativeBridgeHostArchName: "",
4120 NativeBridgeRelativePath: "",
4121 }
4122 config.Targets[android.Android] = []android.Target{target}
4123 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004124 }),
4125 )
4126
Jooyung Hana0503a52023-08-23 13:12:50 +09004127 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004129 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 })
4131}
4132
Jooyung Hane1633032019-08-01 17:41:43 +09004133func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004134 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004135 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004136 apex {
4137 name: "myapex_nodep",
4138 key: "myapex.key",
4139 native_shared_libs: ["lib_nodep"],
4140 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004142 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004143 }
4144
4145 apex {
4146 name: "myapex_dep",
4147 key: "myapex.key",
4148 native_shared_libs: ["lib_dep"],
4149 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004151 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004152 }
4153
4154 apex {
4155 name: "myapex_provider",
4156 key: "myapex.key",
4157 native_shared_libs: ["libfoo"],
4158 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004161 }
4162
4163 apex {
4164 name: "myapex_selfcontained",
4165 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004166 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004167 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004170 }
4171
4172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
4177
4178 cc_library {
4179 name: "lib_nodep",
4180 srcs: ["mylib.cpp"],
4181 system_shared_libs: [],
4182 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004183 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004184 }
4185
4186 cc_library {
4187 name: "lib_dep",
4188 srcs: ["mylib.cpp"],
4189 shared_libs: ["libfoo"],
4190 system_shared_libs: [],
4191 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004192 apex_available: [
4193 "myapex_dep",
4194 "myapex_provider",
4195 "myapex_selfcontained",
4196 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004197 }
4198
4199 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004200 name: "lib_dep_on_bar",
4201 srcs: ["mylib.cpp"],
4202 shared_libs: ["libbar"],
4203 system_shared_libs: [],
4204 stl: "none",
4205 apex_available: [
4206 "myapex_selfcontained",
4207 ],
4208 }
4209
4210
4211 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004212 name: "libfoo",
4213 srcs: ["mytest.cpp"],
4214 stubs: {
4215 versions: ["1"],
4216 },
4217 system_shared_libs: [],
4218 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004219 apex_available: [
4220 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004221 ],
4222 }
4223
4224 cc_library {
4225 name: "libbar",
4226 srcs: ["mytest.cpp"],
4227 stubs: {
4228 versions: ["1"],
4229 },
4230 system_shared_libs: [],
4231 stl: "none",
4232 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 "myapex_selfcontained",
4234 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004235 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004236
Jooyung Hane1633032019-08-01 17:41:43 +09004237 `)
4238
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004239 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004240 var provideNativeLibs, requireNativeLibs []string
4241
Jooyung Hana0503a52023-08-23 13:12:50 +09004242 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4244 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004245 ensureListEmpty(t, provideNativeLibs)
4246 ensureListEmpty(t, requireNativeLibs)
4247
Jooyung Hana0503a52023-08-23 13:12:50 +09004248 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004249 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4250 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004251 ensureListEmpty(t, provideNativeLibs)
4252 ensureListContains(t, requireNativeLibs, "libfoo.so")
4253
Jooyung Hana0503a52023-08-23 13:12:50 +09004254 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004255 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4256 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004257 ensureListContains(t, provideNativeLibs, "libfoo.so")
4258 ensureListEmpty(t, requireNativeLibs)
4259
Jooyung Hana0503a52023-08-23 13:12:50 +09004260 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004261 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4262 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004263 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004264 ensureListEmpty(t, requireNativeLibs)
4265}
4266
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004267func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004268 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004269 ctx := testApex(t, `
4270 apex {
4271 name: "myapex",
4272 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 native_shared_libs: ["mylib"],
4274 updatable: false,
4275 }
4276
4277 apex_key {
4278 name: "myapex.key",
4279 public_key: "testkey.avbpubkey",
4280 private_key: "testkey.pem",
4281 }
4282
4283 cc_library {
4284 name: "mylib",
4285 srcs: ["mylib.cpp"],
4286 system_shared_libs: [],
4287 stl: "none",
4288 apex_available: [
4289 "//apex_available:platform",
4290 "myapex",
4291 ],
4292 }
4293 `, android.FixtureMergeEnv(map[string]string{
4294 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4295 }))
4296
Jooyung Hana0503a52023-08-23 13:12:50 +09004297 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004298 apexManifestRule := module.Rule("apexManifestRule")
4299 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4300}
4301
Vinh Tran8f5310f2022-10-07 18:16:47 -04004302func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004303 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004304 testCases := []struct {
4305 compileMultiLibProp string
4306 containedLibs []string
4307 notContainedLibs []string
4308 }{
4309 {
4310 containedLibs: []string{
4311 "image.apex/lib64/mylib.so",
4312 "image.apex/lib/mylib.so",
4313 },
4314 compileMultiLibProp: `compile_multilib: "both",`,
4315 },
4316 {
4317 containedLibs: []string{"image.apex/lib64/mylib.so"},
4318 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4319 compileMultiLibProp: `compile_multilib: "first",`,
4320 },
4321 {
4322 containedLibs: []string{"image.apex/lib64/mylib.so"},
4323 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4324 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4325 },
4326 {
4327 containedLibs: []string{"image.apex/lib64/mylib.so"},
4328 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4329 compileMultiLibProp: `compile_multilib: "64",`,
4330 },
4331 {
4332 containedLibs: []string{"image.apex/lib/mylib.so"},
4333 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4334 compileMultiLibProp: `compile_multilib: "32",`,
4335 },
4336 }
4337 for _, testCase := range testCases {
4338 ctx := testApex(t, fmt.Sprintf(`
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 %s
4343 native_shared_libs: ["mylib"],
4344 updatable: false,
4345 }
4346 apex_key {
4347 name: "myapex.key",
4348 public_key: "testkey.avbpubkey",
4349 private_key: "testkey.pem",
4350 }
4351 cc_library {
4352 name: "mylib",
4353 srcs: ["mylib.cpp"],
4354 apex_available: [
4355 "//apex_available:platform",
4356 "myapex",
4357 ],
4358 }
4359 `, testCase.compileMultiLibProp),
4360 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004362 apexRule := module.Rule("apexRule")
4363 copyCmds := apexRule.Args["copy_commands"]
4364 for _, containedLib := range testCase.containedLibs {
4365 ensureContains(t, copyCmds, containedLib)
4366 }
4367 for _, notContainedLib := range testCase.notContainedLibs {
4368 ensureNotContains(t, copyCmds, notContainedLib)
4369 }
4370 }
4371}
4372
Alex Light0851b882019-02-07 13:20:53 -08004373func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004376 apex {
4377 name: "myapex",
4378 key: "myapex.key",
4379 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004380 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004381 }
4382
4383 apex_key {
4384 name: "myapex.key",
4385 public_key: "testkey.avbpubkey",
4386 private_key: "testkey.pem",
4387 }
4388
4389 cc_library {
4390 name: "mylib_common",
4391 srcs: ["mylib.cpp"],
4392 system_shared_libs: [],
4393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004394 apex_available: [
4395 "//apex_available:platform",
4396 "myapex",
4397 ],
Alex Light0851b882019-02-07 13:20:53 -08004398 }
4399 `)
4400
Jooyung Hana0503a52023-08-23 13:12:50 +09004401 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004402 apexRule := module.Rule("apexRule")
4403 copyCmds := apexRule.Args["copy_commands"]
4404
4405 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4406 t.Log("Apex was a test apex!")
4407 t.Fail()
4408 }
4409 // Ensure that main rule creates an output
4410 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4411
4412 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004413 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004414
4415 // Ensure that both direct and indirect deps are copied into apex
4416 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4417
Colin Cross7113d202019-11-20 16:39:12 -08004418 // Ensure that the platform variant ends with _shared
4419 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004420
Colin Cross56a83212020-09-15 18:30:11 -07004421 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004422 t.Log("Found mylib_common not in any apex!")
4423 t.Fail()
4424 }
4425}
4426
4427func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004428 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004429 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004430 apex_test {
4431 name: "myapex",
4432 key: "myapex.key",
4433 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004434 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004435 }
4436
4437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
4442
4443 cc_library {
4444 name: "mylib_common_test",
4445 srcs: ["mylib.cpp"],
4446 system_shared_libs: [],
4447 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004448 // TODO: remove //apex_available:platform
4449 apex_available: [
4450 "//apex_available:platform",
4451 "myapex",
4452 ],
Alex Light0851b882019-02-07 13:20:53 -08004453 }
4454 `)
4455
Jooyung Hana0503a52023-08-23 13:12:50 +09004456 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004457 apexRule := module.Rule("apexRule")
4458 copyCmds := apexRule.Args["copy_commands"]
4459
4460 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4461 t.Log("Apex was not a test apex!")
4462 t.Fail()
4463 }
4464 // Ensure that main rule creates an output
4465 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4466
4467 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004468 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004469
4470 // Ensure that both direct and indirect deps are copied into apex
4471 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4472
Colin Cross7113d202019-11-20 16:39:12 -08004473 // Ensure that the platform variant ends with _shared
4474 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004475}
4476
Jooyung Han85707de2023-12-01 14:21:13 +09004477func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004478 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004479 ctx := testApex(t, `
4480 apex {
4481 name: "myapex",
4482 key: "myapex.key",
4483 updatable: false,
4484 binaries: ["mybin"],
4485 }
4486 apex {
4487 name: "myvendorapex",
4488 key: "myapex.key",
4489 file_contexts: "myvendorapex_file_contexts",
4490 vendor: true,
4491 updatable: false,
4492 binaries: ["mybin"],
4493 }
4494 apex_key {
4495 name: "myapex.key",
4496 public_key: "testkey.avbpubkey",
4497 private_key: "testkey.pem",
4498 }
4499 cc_binary {
4500 name: "mybin",
4501 vendor_available: true,
4502 system_shared_libs: [],
4503 stl: "none",
4504 shared_libs: ["libz"],
4505 apex_available: ["//apex_available:anyapex"],
4506 }
4507 cc_library {
4508 name: "libz",
4509 vendor_available: true,
4510 system_shared_libs: [],
4511 stl: "none",
4512 stubs: {
4513 versions: ["28", "30"],
4514 },
4515 target: {
4516 vendor: {
4517 no_stubs: true,
4518 },
4519 },
4520 }
4521 `, withFiles(map[string][]byte{
4522 "myvendorapex_file_contexts": nil,
4523 }))
4524
4525 // libz provides stubs for core variant.
4526 {
4527 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4528 "bin/mybin",
4529 })
4530 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4531 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4532 }
4533 // libz doesn't provide stubs for vendor variant.
4534 {
4535 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4536 "bin/mybin",
4537 "lib64/libz.so",
4538 })
4539 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4540 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4541 }
4542}
4543
Alex Light9670d332019-01-29 18:07:33 -08004544func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004545 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004546 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004550 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004551 multilib: {
4552 first: {
4553 native_shared_libs: ["mylib_common"],
4554 }
4555 },
4556 target: {
4557 android: {
4558 multilib: {
4559 first: {
4560 native_shared_libs: ["mylib"],
4561 }
4562 }
4563 },
4564 host: {
4565 multilib: {
4566 first: {
4567 native_shared_libs: ["mylib2"],
4568 }
4569 }
4570 }
4571 }
4572 }
4573
4574 apex_key {
4575 name: "myapex.key",
4576 public_key: "testkey.avbpubkey",
4577 private_key: "testkey.pem",
4578 }
4579
4580 cc_library {
4581 name: "mylib",
4582 srcs: ["mylib.cpp"],
4583 system_shared_libs: [],
4584 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004585 // TODO: remove //apex_available:platform
4586 apex_available: [
4587 "//apex_available:platform",
4588 "myapex",
4589 ],
Alex Light9670d332019-01-29 18:07:33 -08004590 }
4591
4592 cc_library {
4593 name: "mylib_common",
4594 srcs: ["mylib.cpp"],
4595 system_shared_libs: [],
4596 stl: "none",
4597 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004598 // TODO: remove //apex_available:platform
4599 apex_available: [
4600 "//apex_available:platform",
4601 "myapex",
4602 ],
Alex Light9670d332019-01-29 18:07:33 -08004603 }
4604
4605 cc_library {
4606 name: "mylib2",
4607 srcs: ["mylib.cpp"],
4608 system_shared_libs: [],
4609 stl: "none",
4610 compile_multilib: "first",
4611 }
4612 `)
4613
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004615 copyCmds := apexRule.Args["copy_commands"]
4616
4617 // Ensure that main rule creates an output
4618 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4619
4620 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004621 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4622 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4623 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004624
4625 // Ensure that both direct and indirect deps are copied into apex
4626 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4627 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4628 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4629
Colin Cross7113d202019-11-20 16:39:12 -08004630 // Ensure that the platform variant ends with _shared
4631 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4632 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4633 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004634}
Jiyong Park04480cf2019-02-06 00:16:29 +09004635
Jiyong Park59140302020-12-14 18:44:04 +09004636func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004637 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004638 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004639 apex {
4640 name: "myapex",
4641 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004642 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004643 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004644 arch: {
4645 arm64: {
4646 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004647 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 },
4649 x86_64: {
4650 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 }
4654 }
4655
4656 apex_key {
4657 name: "myapex.key",
4658 public_key: "testkey.avbpubkey",
4659 private_key: "testkey.pem",
4660 }
4661
4662 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004663 name: "mylib.generic",
4664 srcs: ["mylib.cpp"],
4665 system_shared_libs: [],
4666 stl: "none",
4667 // TODO: remove //apex_available:platform
4668 apex_available: [
4669 "//apex_available:platform",
4670 "myapex",
4671 ],
4672 }
4673
4674 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004675 name: "mylib.arm64",
4676 srcs: ["mylib.cpp"],
4677 system_shared_libs: [],
4678 stl: "none",
4679 // TODO: remove //apex_available:platform
4680 apex_available: [
4681 "//apex_available:platform",
4682 "myapex",
4683 ],
4684 }
4685
4686 cc_library {
4687 name: "mylib.x64",
4688 srcs: ["mylib.cpp"],
4689 system_shared_libs: [],
4690 stl: "none",
4691 // TODO: remove //apex_available:platform
4692 apex_available: [
4693 "//apex_available:platform",
4694 "myapex",
4695 ],
4696 }
4697 `)
4698
Jooyung Hana0503a52023-08-23 13:12:50 +09004699 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004700 copyCmds := apexRule.Args["copy_commands"]
4701
4702 // Ensure that apex variant is created for the direct dep
4703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004704 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004705 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4706
4707 // Ensure that both direct and indirect deps are copied into apex
4708 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4709 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4710}
4711
Jiyong Park04480cf2019-02-06 00:16:29 +09004712func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004713 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004714 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004718 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004719 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004720 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004721 }
4722
4723 apex_key {
4724 name: "myapex.key",
4725 public_key: "testkey.avbpubkey",
4726 private_key: "testkey.pem",
4727 }
4728
4729 sh_binary {
4730 name: "myscript",
4731 src: "mylib.cpp",
4732 filename: "myscript.sh",
4733 sub_dir: "script",
4734 }
4735 `)
4736
Jooyung Hana0503a52023-08-23 13:12:50 +09004737 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004738 copyCmds := apexRule.Args["copy_commands"]
4739
4740 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4741}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004742
Jooyung Han91df2082019-11-20 01:49:42 +09004743func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004744 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004745 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004746 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004747 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004748 {"", "system"},
4749 {"product_specific: true", "product"},
4750 {"soc_specific: true", "vendor"},
4751 {"proprietary: true", "vendor"},
4752 {"vendor: true", "vendor"},
4753 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004754 }
4755 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004756 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004757 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004758 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004759 apex {
4760 name: "myapex",
4761 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004762 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004763 `+tc.propName+`
4764 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004765
Jooyung Han91df2082019-11-20 01:49:42 +09004766 apex_key {
4767 name: "myapex.key",
4768 public_key: "testkey.avbpubkey",
4769 private_key: "testkey.pem",
4770 }
4771 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004772
Jooyung Hana0503a52023-08-23 13:12:50 +09004773 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004774 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004775 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004776 if actual != expected {
4777 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4778 }
Jooyung Han91df2082019-11-20 01:49:42 +09004779 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004780 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004781}
Jiyong Park67882562019-03-21 01:11:21 +09004782
Jooyung Han580eb4f2020-06-24 19:33:06 +09004783func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004785 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004786 apex {
4787 name: "myapex",
4788 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004789 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792 apex_key {
4793 name: "myapex.key",
4794 public_key: "testkey.avbpubkey",
4795 private_key: "testkey.pem",
4796 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004797 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004798 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004799 rule := module.Output("file_contexts")
4800 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4801}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004805 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
4809 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004810 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812
Jooyung Han580eb4f2020-06-24 19:33:06 +09004813 apex_key {
4814 name: "myapex.key",
4815 public_key: "testkey.avbpubkey",
4816 private_key: "testkey.pem",
4817 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004818 `, withFiles(map[string][]byte{
4819 "my_own_file_contexts": nil,
4820 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 product_specific: true,
4830 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004831 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004833
Jooyung Han580eb4f2020-06-24 19:33:06 +09004834 apex_key {
4835 name: "myapex.key",
4836 public_key: "testkey.avbpubkey",
4837 private_key: "testkey.pem",
4838 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004839 `)
4840
Colin Cross1c460562021-02-16 17:55:47 -08004841 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004842 apex {
4843 name: "myapex",
4844 key: "myapex.key",
4845 product_specific: true,
4846 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004847 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004848 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004849
Jooyung Han580eb4f2020-06-24 19:33:06 +09004850 apex_key {
4851 name: "myapex.key",
4852 public_key: "testkey.avbpubkey",
4853 private_key: "testkey.pem",
4854 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004855 `, withFiles(map[string][]byte{
4856 "product_specific_file_contexts": nil,
4857 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004858 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004859 rule := module.Output("file_contexts")
4860 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4861}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004862
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004864 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004865 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 product_specific: true,
4870 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004871 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004872 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004873
Jooyung Han580eb4f2020-06-24 19:33:06 +09004874 apex_key {
4875 name: "myapex.key",
4876 public_key: "testkey.avbpubkey",
4877 private_key: "testkey.pem",
4878 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004879
Jooyung Han580eb4f2020-06-24 19:33:06 +09004880 filegroup {
4881 name: "my-file-contexts",
4882 srcs: ["product_specific_file_contexts"],
4883 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004884 `, withFiles(map[string][]byte{
4885 "product_specific_file_contexts": nil,
4886 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004887 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004888 rule := module.Output("file_contexts")
4889 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004890}
4891
Jiyong Park67882562019-03-21 01:11:21 +09004892func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004894 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004895 apex_key {
4896 name: "myapex.key",
4897 public_key: ":my.avbpubkey",
4898 private_key: ":my.pem",
4899 product_specific: true,
4900 }
4901
4902 filegroup {
4903 name: "my.avbpubkey",
4904 srcs: ["testkey2.avbpubkey"],
4905 }
4906
4907 filegroup {
4908 name: "my.pem",
4909 srcs: ["testkey2.pem"],
4910 }
4911 `)
4912
4913 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4914 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004915 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004916 if actual_pubkey != expected_pubkey {
4917 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4918 }
4919 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004920 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004921 if actual_privkey != expected_privkey {
4922 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4923 }
4924}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004925
4926func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004927 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004928 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929 prebuilt_apex {
4930 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004931 arch: {
4932 arm64: {
4933 src: "myapex-arm64.apex",
4934 },
4935 arm: {
4936 src: "myapex-arm.apex",
4937 },
4938 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939 }
4940 `)
4941
Wei Li340ee8e2022-03-18 17:33:24 -07004942 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4943 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004944
Jiyong Parkc95714e2019-03-29 14:23:10 +09004945 expectedInput := "myapex-arm64.apex"
4946 if prebuilt.inputApex.String() != expectedInput {
4947 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4948 }
Wei Li340ee8e2022-03-18 17:33:24 -07004949 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4950 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4951 rule := testingModule.Rule("genProvenanceMetaData")
4952 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4953 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4954 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4955 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004956
4957 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4958 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004960
Paul Duffinc0609c62021-03-01 17:27:16 +00004961func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004962 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004963 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004964 prebuilt_apex {
4965 name: "myapex",
4966 }
4967 `)
4968}
4969
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004970func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004971 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004972 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004973 prebuilt_apex {
4974 name: "myapex",
4975 src: "myapex-arm.apex",
4976 filename: "notmyapex.apex",
4977 }
4978 `)
4979
Wei Li340ee8e2022-03-18 17:33:24 -07004980 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4981 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004982
4983 expected := "notmyapex.apex"
4984 if p.installFilename != expected {
4985 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4986 }
Wei Li340ee8e2022-03-18 17:33:24 -07004987 rule := testingModule.Rule("genProvenanceMetaData")
4988 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4989 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4990 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4991 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004992}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004993
Samiul Islam7c02e262021-09-08 17:48:28 +01004994func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004995 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004996 testApex(t, `
4997 apex_set {
4998 name: "com.company.android.myapex",
4999 apex_name: "com.android.myapex",
5000 set: "company-myapex.apks",
5001 filename: "com.company.android.myapex.apex"
5002 }
5003 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5004
5005 testApex(t, `
5006 apex_set {
5007 name: "com.company.android.myapex",
5008 apex_name: "com.android.myapex",
5009 set: "company-myapex.apks",
5010 filename: "com.company.android.myapex.capex"
5011 }
5012 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5013
5014 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5015 apex_set {
5016 name: "com.company.android.myapex",
5017 apex_name: "com.android.myapex",
5018 set: "company-myapex.apks",
5019 filename: "some-random-suffix"
5020 }
5021 `)
5022}
5023
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005024func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005025 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005026 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005027 prebuilt_apex {
5028 name: "myapex.prebuilt",
5029 src: "myapex-arm.apex",
5030 overrides: [
5031 "myapex",
5032 ],
5033 }
5034 `)
5035
Wei Li340ee8e2022-03-18 17:33:24 -07005036 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5037 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005038
5039 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005040 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005041 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005042 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005043 }
Wei Li340ee8e2022-03-18 17:33:24 -07005044 rule := testingModule.Rule("genProvenanceMetaData")
5045 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5046 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5047 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5048 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005049}
5050
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005051func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005052 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005053 testApex(t, `
5054 prebuilt_apex {
5055 name: "com.company.android.myapex",
5056 apex_name: "com.android.myapex",
5057 src: "company-myapex-arm.apex",
5058 }
5059 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5060
5061 testApex(t, `
5062 apex_set {
5063 name: "com.company.android.myapex",
5064 apex_name: "com.android.myapex",
5065 set: "company-myapex.apks",
5066 }
5067 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5068}
5069
5070func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005071 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005072 _ = android.GroupFixturePreparers(
5073 java.PrepareForTestWithJavaDefaultModules,
5074 PrepareForTestWithApexBuildComponents,
5075 android.FixtureWithRootAndroidBp(`
5076 platform_bootclasspath {
5077 name: "platform-bootclasspath",
5078 fragments: [
5079 {
5080 apex: "com.android.art",
5081 module: "art-bootclasspath-fragment",
5082 },
5083 ],
5084 }
5085
5086 prebuilt_apex {
5087 name: "com.company.android.art",
5088 apex_name: "com.android.art",
5089 src: "com.company.android.art-arm.apex",
5090 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5091 }
5092
5093 prebuilt_bootclasspath_fragment {
5094 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005095 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005096 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005097 hidden_api: {
5098 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5099 metadata: "my-bootclasspath-fragment/metadata.csv",
5100 index: "my-bootclasspath-fragment/index.csv",
5101 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5102 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5103 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005104 }
5105
5106 java_import {
5107 name: "core-oj",
5108 jars: ["prebuilt.jar"],
5109 }
5110 `),
5111 ).RunTest(t)
5112}
5113
Spandan Das59a4a2b2024-01-09 21:35:56 +00005114// A minimal context object for use with DexJarBuildPath
5115type moduleErrorfTestCtx struct {
5116}
5117
5118func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5119}
5120
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005122 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005123 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005124 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005125 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5126 // is disabled.
5127 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005128
5129 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5130 // file creation.
5131 java.FixtureConfigureBootJars("platform:foo"),
5132 android.FixtureModifyMockFS(func(fs android.MockFS) {
5133 fs["platform/Android.bp"] = []byte(`
5134 java_library {
5135 name: "foo",
5136 srcs: ["Test.java"],
5137 compile_dex: true,
5138 }
5139 `)
5140 fs["platform/Test.java"] = nil
5141 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005142 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005143
Paul Duffin40a3f652021-07-19 13:11:24 +01005144 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005145 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005146 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005147 var rule android.TestingBuildParams
5148
5149 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5150 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005151 }
5152
Paul Duffin40a3f652021-07-19 13:11:24 +01005153 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5154 t.Helper()
5155 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5156 var rule android.TestingBuildParams
5157
5158 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5159 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5160 }
5161
Paul Duffin89f570a2021-06-16 01:42:33 +01005162 fragment := java.ApexVariantReference{
5163 Apex: proptools.StringPtr("myapex"),
5164 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5165 }
5166
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005167 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005168 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 bp := `
5170 prebuilt_apex {
5171 name: "myapex",
5172 arch: {
5173 arm64: {
5174 src: "myapex-arm64.apex",
5175 },
5176 arm: {
5177 src: "myapex-arm.apex",
5178 },
5179 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005180 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5181 }
5182
5183 prebuilt_bootclasspath_fragment {
5184 name: "my-bootclasspath-fragment",
5185 contents: ["libfoo", "libbar"],
5186 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005187 hidden_api: {
5188 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5189 metadata: "my-bootclasspath-fragment/metadata.csv",
5190 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005191 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5192 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5193 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005194 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
5196
Spandan Das52c01a12024-09-20 01:09:48 +00005197 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005199 public: {
5200 jars: ["libfoo.jar"],
5201 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005203 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005204 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 }
Paul Duffin37856732021-02-26 14:24:15 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 public: {
5210 jars: ["libbar.jar"],
5211 },
5212 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005213 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005214 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005215 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005216 `
5217
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005219
Paul Duffin537ea3d2021-05-14 10:38:00 +01005220 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005221 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005222 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005223 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005224 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005225 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005226 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005227 })
5228
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005229 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005230 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005231 bp := `
5232 apex_set {
5233 name: "myapex",
5234 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005236 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5237 }
5238
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 prebuilt_bootclasspath_fragment {
5240 name: "my-bootclasspath-fragment",
5241 contents: ["libfoo", "libbar"],
5242 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005243 hidden_api: {
5244 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5245 metadata: "my-bootclasspath-fragment/metadata.csv",
5246 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005247 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5248 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5249 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005250 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 }
5252
Liz Kammer2dc72442023-04-20 10:10:48 -04005253 prebuilt_systemserverclasspath_fragment {
5254 name: "my-systemserverclasspath-fragment",
5255 contents: ["libbaz"],
5256 apex_available: ["myapex"],
5257 }
5258
Spandan Das52c01a12024-09-20 01:09:48 +00005259 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005260 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005261 public: {
5262 jars: ["libfoo.jar"],
5263 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005265 shared_library: false,
5266 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005267 }
5268
Spandan Das52c01a12024-09-20 01:09:48 +00005269
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005270 java_sdk_library_import {
5271 name: "libbar",
5272 public: {
5273 jars: ["libbar.jar"],
5274 },
5275 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005276 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005277 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005278 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005279
5280 java_sdk_library_import {
5281 name: "libbaz",
5282 public: {
5283 jars: ["libbaz.jar"],
5284 },
5285 apex_available: ["myapex"],
5286 shared_library: false,
5287 permitted_packages: ["baz"],
5288 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005289 `
5290
Paul Duffin89f570a2021-06-16 01:42:33 +01005291 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005292
Paul Duffin537ea3d2021-05-14 10:38:00 +01005293 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005294 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005295 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005296 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005297 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005298 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005300
5301 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5302
5303 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005304 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005305 "myjavalib.myapex",
5306 "libfoo.myapex",
5307 "libbar.myapex",
5308 "libbaz.myapex",
5309 }
5310 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5311 for i, e := range mkEntries {
5312 g := e.OverrideName
5313 if w := overrideNames[i]; w != g {
5314 t.Errorf("Expected override name %q, got %q", w, g)
5315 }
5316 }
5317
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005318 })
5319
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005320 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005321 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005322 bp := `
5323 prebuilt_apex {
5324 name: "myapex",
5325 arch: {
5326 arm64: {
5327 src: "myapex-arm64.apex",
5328 },
5329 arm: {
5330 src: "myapex-arm.apex",
5331 },
5332 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005333 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5334 }
5335
5336 prebuilt_bootclasspath_fragment {
5337 name: "my-bootclasspath-fragment",
5338 contents: ["libfoo", "libbar"],
5339 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005340 hidden_api: {
5341 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5342 metadata: "my-bootclasspath-fragment/metadata.csv",
5343 index: "my-bootclasspath-fragment/index.csv",
5344 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5345 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5346 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 }
5348
5349 java_import {
5350 name: "libfoo",
5351 jars: ["libfoo.jar"],
5352 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005353 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_library {
5357 name: "libfoo",
5358 srcs: ["foo/bar/MyClass.java"],
5359 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005360 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005361 }
Paul Duffin37856732021-02-26 14:24:15 +00005362
5363 java_sdk_library_import {
5364 name: "libbar",
5365 public: {
5366 jars: ["libbar.jar"],
5367 },
5368 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005370 }
5371
5372 java_sdk_library {
5373 name: "libbar",
5374 srcs: ["foo/bar/MyClass.java"],
5375 unsafe_ignore_missing_latest_api: true,
5376 apex_available: ["myapex"],
5377 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005378 `
5379
5380 // In this test the source (java_library) libfoo is active since the
5381 // prebuilt (java_import) defaults to prefer:false. However the
5382 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5383 // find the dex boot jar in it. We either need to disable the source libfoo
5384 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005385 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005386 // dexbootjar check is skipped if AllowMissingDependencies is true
5387 preparerAllowMissingDeps := android.GroupFixturePreparers(
5388 preparer,
5389 android.PrepareForTestWithAllowMissingDependencies,
5390 )
5391 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 })
5393
5394 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005395 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005397 apex {
5398 name: "myapex",
5399 key: "myapex.key",
5400 updatable: false,
5401 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5402 }
5403
5404 apex_key {
5405 name: "myapex.key",
5406 public_key: "testkey.avbpubkey",
5407 private_key: "testkey.pem",
5408 }
5409
5410 bootclasspath_fragment {
5411 name: "my-bootclasspath-fragment",
5412 contents: ["libfoo", "libbar"],
5413 apex_available: ["myapex"],
5414 hidden_api: {
5415 split_packages: ["*"],
5416 },
5417 }
5418
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 prebuilt_apex {
5420 name: "myapex",
5421 arch: {
5422 arm64: {
5423 src: "myapex-arm64.apex",
5424 },
5425 arm: {
5426 src: "myapex-arm.apex",
5427 },
5428 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005429 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5430 }
5431
5432 prebuilt_bootclasspath_fragment {
5433 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005434 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005435 contents: ["libfoo", "libbar"],
5436 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005437 hidden_api: {
5438 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5439 metadata: "my-bootclasspath-fragment/metadata.csv",
5440 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005441 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5442 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5443 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005444 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005445 }
5446
Spandan Das52c01a12024-09-20 01:09:48 +00005447 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 name: "libfoo",
5449 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005450 public: {
5451 jars: ["libfoo.jar"],
5452 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005453 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005454 shared_library: false,
5455 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 }
5457
5458 java_library {
5459 name: "libfoo",
5460 srcs: ["foo/bar/MyClass.java"],
5461 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005462 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005463 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005464 }
Paul Duffin37856732021-02-26 14:24:15 +00005465
5466 java_sdk_library_import {
5467 name: "libbar",
5468 prefer: true,
5469 public: {
5470 jars: ["libbar.jar"],
5471 },
5472 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005473 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005474 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005475 }
5476
5477 java_sdk_library {
5478 name: "libbar",
5479 srcs: ["foo/bar/MyClass.java"],
5480 unsafe_ignore_missing_latest_api: true,
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005483 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 `
5485
Paul Duffin89f570a2021-06-16 01:42:33 +01005486 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005487
Paul Duffin537ea3d2021-05-14 10:38:00 +01005488 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005489 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005490 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005491 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005492 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005493 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005494 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005495 })
5496
5497 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005498 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 bp := `
5500 apex {
5501 name: "myapex",
5502 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005503 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005504 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 }
5506
5507 apex_key {
5508 name: "myapex.key",
5509 public_key: "testkey.avbpubkey",
5510 private_key: "testkey.pem",
5511 }
5512
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 bootclasspath_fragment {
5514 name: "my-bootclasspath-fragment",
5515 contents: ["libfoo", "libbar"],
5516 apex_available: ["myapex"],
5517 hidden_api: {
5518 split_packages: ["*"],
5519 },
5520 }
5521
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005522 prebuilt_apex {
5523 name: "myapex",
5524 arch: {
5525 arm64: {
5526 src: "myapex-arm64.apex",
5527 },
5528 arm: {
5529 src: "myapex-arm.apex",
5530 },
5531 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005532 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5533 }
5534
5535 prebuilt_bootclasspath_fragment {
5536 name: "my-bootclasspath-fragment",
5537 contents: ["libfoo", "libbar"],
5538 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005539 hidden_api: {
5540 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5541 metadata: "my-bootclasspath-fragment/metadata.csv",
5542 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005543 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5544 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5545 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005546 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 }
5548
5549 java_import {
5550 name: "libfoo",
5551 jars: ["libfoo.jar"],
5552 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005553 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005554 }
5555
5556 java_library {
5557 name: "libfoo",
5558 srcs: ["foo/bar/MyClass.java"],
5559 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005560 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005561 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005562 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 }
Paul Duffin37856732021-02-26 14:24:15 +00005564
5565 java_sdk_library_import {
5566 name: "libbar",
5567 public: {
5568 jars: ["libbar.jar"],
5569 },
5570 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005571 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005572 }
5573
5574 java_sdk_library {
5575 name: "libbar",
5576 srcs: ["foo/bar/MyClass.java"],
5577 unsafe_ignore_missing_latest_api: true,
5578 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005580 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005581 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005582 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 `
5584
Paul Duffin89f570a2021-06-16 01:42:33 +01005585 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005586
Paul Duffin537ea3d2021-05-14 10:38:00 +01005587 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005588 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005589 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5590 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005591 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5592 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005594 })
5595
5596 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005597 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 bp := `
5599 apex {
5600 name: "myapex",
5601 enabled: false,
5602 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005603 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
5611
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005612 bootclasspath_fragment {
5613 name: "my-bootclasspath-fragment",
5614 enabled: false,
5615 contents: ["libfoo", "libbar"],
5616 apex_available: ["myapex"],
5617 hidden_api: {
5618 split_packages: ["*"],
5619 },
5620 }
5621
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005622 prebuilt_apex {
5623 name: "myapex",
5624 arch: {
5625 arm64: {
5626 src: "myapex-arm64.apex",
5627 },
5628 arm: {
5629 src: "myapex-arm.apex",
5630 },
5631 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005632 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5633 }
5634
5635 prebuilt_bootclasspath_fragment {
5636 name: "my-bootclasspath-fragment",
5637 contents: ["libfoo", "libbar"],
5638 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005639 hidden_api: {
5640 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5641 metadata: "my-bootclasspath-fragment/metadata.csv",
5642 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005643 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5644 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5645 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005646 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005647 }
5648
5649 java_import {
5650 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 jars: ["libfoo.jar"],
5652 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005653 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005654 }
5655
5656 java_library {
5657 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005658 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005659 srcs: ["foo/bar/MyClass.java"],
5660 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005661 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005662 }
Paul Duffin37856732021-02-26 14:24:15 +00005663
5664 java_sdk_library_import {
5665 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005666 public: {
5667 jars: ["libbar.jar"],
5668 },
5669 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005670 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005671 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005672 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005673 }
5674
5675 java_sdk_library {
5676 name: "libbar",
5677 srcs: ["foo/bar/MyClass.java"],
5678 unsafe_ignore_missing_latest_api: true,
5679 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005680 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005681 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 `
Cole Fausta963b942024-04-11 17:43:00 -07005683 // This test disables libbar, which causes the ComponentDepsMutator to add
5684 // deps on libbar.stubs and other sub-modules that don't exist. We can
5685 // enable AllowMissingDependencies to work around that, but enabling that
5686 // causes extra checks for missing source files to dex_bootjars, so add those
5687 // to the mock fs as well.
5688 preparer2 := android.GroupFixturePreparers(
5689 preparer,
5690 android.PrepareForTestWithAllowMissingDependencies,
5691 android.FixtureMergeMockFs(map[string][]byte{
5692 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005693 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005694 }),
5695 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005696
Cole Fausta963b942024-04-11 17:43:00 -07005697 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005698
Paul Duffin537ea3d2021-05-14 10:38:00 +01005699 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005700 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005701 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005702 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005703 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005704 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005705 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706 })
Spandan Das3a392012024-01-17 18:26:27 +00005707
Spandan Dasf2c10572024-02-27 04:49:52 +00005708 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005709 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005710 bp := `
5711 // Source
5712 apex {
5713 name: "myapex",
5714 enabled: false,
5715 key: "myapex.key",
5716 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5717 }
5718
5719 apex_key {
5720 name: "myapex.key",
5721 public_key: "testkey.avbpubkey",
5722 private_key: "testkey.pem",
5723 }
5724
5725 // Prebuilt
5726 prebuilt_apex {
5727 name: "myapex.v1",
5728 source_apex_name: "myapex",
5729 arch: {
5730 arm64: {
5731 src: "myapex-arm64.apex",
5732 },
5733 arm: {
5734 src: "myapex-arm.apex",
5735 },
5736 },
5737 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5738 prefer: true,
5739 }
5740 prebuilt_apex {
5741 name: "myapex.v2",
5742 source_apex_name: "myapex",
5743 arch: {
5744 arm64: {
5745 src: "myapex-arm64.apex",
5746 },
5747 arm: {
5748 src: "myapex-arm.apex",
5749 },
5750 },
5751 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5752 prefer: true,
5753 }
5754
5755 prebuilt_bootclasspath_fragment {
5756 name: "my-bootclasspath-fragment",
5757 contents: ["libfoo", "libbar"],
5758 apex_available: ["myapex"],
5759 hidden_api: {
5760 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5761 metadata: "my-bootclasspath-fragment/metadata.csv",
5762 index: "my-bootclasspath-fragment/index.csv",
5763 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5764 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5765 },
5766 prefer: true,
5767 }
5768
5769 java_import {
5770 name: "libfoo",
5771 jars: ["libfoo.jar"],
5772 apex_available: ["myapex"],
5773 prefer: true,
5774 }
5775 java_import {
5776 name: "libbar",
5777 jars: ["libbar.jar"],
5778 apex_available: ["myapex"],
5779 prefer: true,
5780 }
5781 `
5782
Spandan Dasf2c10572024-02-27 04:49:52 +00005783 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005784 })
5785
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005786}
5787
Roland Levillain630846d2019-06-26 12:48:34 +01005788func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005789 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005790 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005791 apex_test {
5792 name: "myapex",
5793 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005794 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005795 tests: [
5796 "mytest",
5797 ],
5798 }
5799
5800 apex_key {
5801 name: "myapex.key",
5802 public_key: "testkey.avbpubkey",
5803 private_key: "testkey.pem",
5804 }
5805
Liz Kammer1c14a212020-05-12 15:26:55 -07005806 filegroup {
5807 name: "fg",
5808 srcs: [
5809 "baz",
5810 "bar/baz"
5811 ],
5812 }
5813
Roland Levillain630846d2019-06-26 12:48:34 +01005814 cc_test {
5815 name: "mytest",
5816 gtest: false,
5817 srcs: ["mytest.cpp"],
5818 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005819 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005820 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005821 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005822 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005823 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005824
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005825 cc_library {
5826 name: "mylib",
5827 srcs: ["mylib.cpp"],
5828 system_shared_libs: [],
5829 stl: "none",
5830 }
5831
Liz Kammer5bd365f2020-05-27 15:15:11 -07005832 filegroup {
5833 name: "fg2",
5834 srcs: [
5835 "testdata/baz"
5836 ],
5837 }
Roland Levillain630846d2019-06-26 12:48:34 +01005838 `)
5839
Jooyung Hana0503a52023-08-23 13:12:50 +09005840 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005841 copyCmds := apexRule.Args["copy_commands"]
5842
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005843 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005844 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005845 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005846
Liz Kammer1c14a212020-05-12 15:26:55 -07005847 //Ensure that test data are copied into apex.
5848 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5849 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5850
Roland Levillainf89cd092019-07-29 16:22:59 +01005851 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005852 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005853 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005854 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005855 prefix := "TARGET_"
5856 var builder strings.Builder
5857 data.Custom(&builder, name, prefix, "", data)
5858 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005859 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005860 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005861}
5862
Jooyung Hand48f3c32019-08-23 11:18:57 +09005863func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005864 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005865 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5866 apex {
5867 name: "myapex",
5868 key: "myapex.key",
5869 native_shared_libs: ["libfoo"],
5870 }
5871
5872 apex_key {
5873 name: "myapex.key",
5874 public_key: "testkey.avbpubkey",
5875 private_key: "testkey.pem",
5876 }
5877
5878 cc_library {
5879 name: "libfoo",
5880 stl: "none",
5881 system_shared_libs: [],
5882 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005883 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005884 }
5885 `)
5886 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 java_libs: ["myjar"],
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 java_library {
5900 name: "myjar",
5901 srcs: ["foo/bar/MyClass.java"],
5902 sdk_version: "none",
5903 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005904 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005905 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005906 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005907 }
5908 `)
5909}
5910
Bill Peckhama41a6962021-01-11 10:58:54 -08005911func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005912 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005913 apex {
5914 name: "myapex",
5915 key: "myapex.key",
5916 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005917 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005918 }
5919
5920 apex_key {
5921 name: "myapex.key",
5922 public_key: "testkey.avbpubkey",
5923 private_key: "testkey.pem",
5924 }
5925
5926 java_import {
5927 name: "myjavaimport",
5928 apex_available: ["myapex"],
5929 jars: ["my.jar"],
5930 compile_dex: true,
5931 }
5932 `)
5933
Jooyung Hana0503a52023-08-23 13:12:50 +09005934 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005935 apexRule := module.Rule("apexRule")
5936 copyCmds := apexRule.Args["copy_commands"]
5937 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5938}
5939
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005940func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005942 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005943 apex {
5944 name: "myapex",
5945 key: "myapex.key",
5946 apps: [
5947 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005948 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005949 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005950 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005951 }
5952
5953 apex_key {
5954 name: "myapex.key",
5955 public_key: "testkey.avbpubkey",
5956 private_key: "testkey.pem",
5957 }
5958
5959 android_app {
5960 name: "AppFoo",
5961 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005962 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005963 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005964 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005965 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005967 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005968 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005969
5970 android_app {
5971 name: "AppFooPriv",
5972 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005973 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005974 system_modules: "none",
5975 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005976 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005977 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005978 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005979 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005980
5981 cc_library_shared {
5982 name: "libjni",
5983 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005984 shared_libs: ["libfoo"],
5985 stl: "none",
5986 system_shared_libs: [],
5987 apex_available: [ "myapex" ],
5988 sdk_version: "current",
5989 }
5990
5991 cc_library_shared {
5992 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005993 stl: "none",
5994 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005995 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005996 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005998 `)
5999
Jooyung Hana0503a52023-08-23 13:12:50 +09006000 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006001 apexRule := module.Rule("apexRule")
6002 copyCmds := apexRule.Args["copy_commands"]
6003
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006004 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6005 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006006 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006007
Colin Crossaede88c2020-08-11 12:17:01 -07006008 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006009 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006010 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006011 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006012 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries including transitive deps are
6014 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006015 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006016 // ... embedded inside APK (jnilibs.zip)
6017 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6018 // ... and not directly inside the APEX
6019 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6020 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006021
6022 apexBundle := module.Module().(*apexBundle)
6023 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6024 var builder strings.Builder
6025 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6026 androidMk := builder.String()
6027 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6028 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6029 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6030 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6031 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6032 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 +01006033}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006034
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006035func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006036 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006037 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6038 for _, id := range invalidBuildIds {
6039 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6040 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6041 variables.BuildId = proptools.StringPtr(id)
6042 })
6043 testApexError(t, message, `apex {
6044 name: "myapex",
6045 key: "myapex.key",
6046 apps: ["AppFooPrebuilt"],
6047 updatable: false,
6048 }
6049
6050 apex_key {
6051 name: "myapex.key",
6052 public_key: "testkey.avbpubkey",
6053 private_key: "testkey.pem",
6054 }
6055
6056 android_app_import {
6057 name: "AppFooPrebuilt",
6058 apk: "PrebuiltAppFoo.apk",
6059 presigned: true,
6060 apex_available: ["myapex"],
6061 }
6062 `, fixture)
6063 }
6064}
6065
Dario Frenicde2a032019-10-27 00:29:22 +01006066func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006067 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006068 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006069 apex {
6070 name: "myapex",
6071 key: "myapex.key",
6072 apps: [
6073 "AppFooPrebuilt",
6074 "AppFooPrivPrebuilt",
6075 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006076 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006077 }
6078
6079 apex_key {
6080 name: "myapex.key",
6081 public_key: "testkey.avbpubkey",
6082 private_key: "testkey.pem",
6083 }
6084
6085 android_app_import {
6086 name: "AppFooPrebuilt",
6087 apk: "PrebuiltAppFoo.apk",
6088 presigned: true,
6089 dex_preopt: {
6090 enabled: false,
6091 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006092 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006093 }
6094
6095 android_app_import {
6096 name: "AppFooPrivPrebuilt",
6097 apk: "PrebuiltAppFooPriv.apk",
6098 privileged: true,
6099 presigned: true,
6100 dex_preopt: {
6101 enabled: false,
6102 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006103 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006104 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006105 }
6106 `)
6107
Jooyung Hana0503a52023-08-23 13:12:50 +09006108 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006109 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/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6113 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006114}
6115
6116func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006117 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006118 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 apps: [
6123 "AppFoo",
6124 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006125 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
6134 android_app {
6135 name: "AppFoo",
6136 srcs: ["foo/bar/MyClass.java"],
6137 sdk_version: "none",
6138 system_modules: "none",
6139 apex_available: [ "myapex" ],
6140 }
6141
6142 android_app_import {
6143 name: "AppFoo",
6144 apk: "AppFooPrebuilt.apk",
6145 filename: "AppFooPrebuilt.apk",
6146 presigned: true,
6147 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006148 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006149 }
6150 `, withFiles(map[string][]byte{
6151 "AppFooPrebuilt.apk": nil,
6152 }))
6153
Jooyung Hana0503a52023-08-23 13:12:50 +09006154 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006155 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006156 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006157}
6158
Dario Freni6f3937c2019-12-20 22:58:03 +00006159func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006160 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006161 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006162 apex {
6163 name: "myapex",
6164 key: "myapex.key",
6165 apps: [
6166 "TesterHelpAppFoo",
6167 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 android_test_helper_app {
6178 name: "TesterHelpAppFoo",
6179 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006180 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006181 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006182 }
6183
6184 `)
6185
Jooyung Hana0503a52023-08-23 13:12:50 +09006186 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006187 apexRule := module.Rule("apexRule")
6188 copyCmds := apexRule.Args["copy_commands"]
6189
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006190 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191}
6192
Jooyung Han18020ea2019-11-13 10:50:48 +09006193func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006194 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006195 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006196 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 apex {
6211 name: "otherapex",
6212 key: "myapex.key",
6213 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006214 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006215 }
6216
6217 cc_defaults {
6218 name: "libfoo-defaults",
6219 apex_available: ["otherapex"],
6220 }
6221
6222 cc_library {
6223 name: "libfoo",
6224 defaults: ["libfoo-defaults"],
6225 stl: "none",
6226 system_shared_libs: [],
6227 }`)
6228}
6229
Paul Duffine52e66f2020-03-30 17:54:29 +01006230func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006231 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006232 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006233 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006234 apex {
6235 name: "myapex",
6236 key: "myapex.key",
6237 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006238 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 apex {
6248 name: "otherapex",
6249 key: "otherapex.key",
6250 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006251 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006252 }
6253
6254 apex_key {
6255 name: "otherapex.key",
6256 public_key: "testkey.avbpubkey",
6257 private_key: "testkey.pem",
6258 }
6259
6260 cc_library {
6261 name: "libfoo",
6262 stl: "none",
6263 system_shared_libs: [],
6264 apex_available: ["otherapex"],
6265 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006266
6267 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6268 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6269 testApex(t, `
6270 apex {
6271 name: "com.sdv.myapex",
6272 key: "myapex.key",
6273 native_shared_libs: ["libfoo"],
6274 updatable: false,
6275 product_specific: true,
6276 }
6277
6278 apex_key {
6279 name: "myapex.key",
6280 public_key: "testkey.avbpubkey",
6281 private_key: "testkey.pem",
6282 }
6283
6284 apex {
6285 name: "com.any.otherapex",
6286 key: "otherapex.key",
6287 native_shared_libs: ["libfoo"],
6288 updatable: false,
6289 }
6290
6291 apex_key {
6292 name: "otherapex.key",
6293 public_key: "testkey.avbpubkey",
6294 private_key: "testkey.pem",
6295 }
6296
6297 cc_library {
6298 name: "libfoo",
6299 stl: "none",
6300 system_shared_libs: [],
6301 apex_available: ["com.any.otherapex"],
6302 product_specific: true,
6303 }`,
6304 android.FixtureMergeMockFs(android.MockFS{
6305 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6306 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6307 }))
6308
6309 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6310 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6311 apex {
6312 name: "com.sdv.myapex",
6313 key: "myapex.key",
6314 native_shared_libs: ["libfoo"],
6315 updatable: false,
6316 }
6317
6318 apex_key {
6319 name: "myapex.key",
6320 public_key: "testkey.avbpubkey",
6321 private_key: "testkey.pem",
6322 }
6323
6324 apex {
6325 name: "com.any.otherapex",
6326 key: "otherapex.key",
6327 native_shared_libs: ["libfoo"],
6328 updatable: false,
6329 }
6330
6331 apex_key {
6332 name: "otherapex.key",
6333 public_key: "testkey.avbpubkey",
6334 private_key: "testkey.pem",
6335 }
6336
6337 cc_library {
6338 name: "libfoo",
6339 stl: "none",
6340 system_shared_libs: [],
6341 apex_available: ["com.any.otherapex"],
6342 }`,
6343 android.FixtureMergeMockFs(android.MockFS{
6344 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6345 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6346 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006347}
Jiyong Park127b40b2019-09-30 16:04:35 +09006348
Paul Duffine52e66f2020-03-30 17:54:29 +01006349func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006350 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006351 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006352 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006353.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006354.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006355.*via tag cc\.dependencyTag.*
6356.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006357.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006358.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006359.*via tag cc\.dependencyTag.*
6360.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006361.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006362.*-> libbaz.*link:shared.*
6363.*via tag cc\.dependencyTag.*
6364.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006365 apex {
6366 name: "myapex",
6367 key: "myapex.key",
6368 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006369 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006370 }
6371
6372 apex_key {
6373 name: "myapex.key",
6374 public_key: "testkey.avbpubkey",
6375 private_key: "testkey.pem",
6376 }
6377
Jiyong Park127b40b2019-09-30 16:04:35 +09006378 cc_library {
6379 name: "libfoo",
6380 stl: "none",
6381 shared_libs: ["libbar"],
6382 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006383 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006384 }
6385
6386 cc_library {
6387 name: "libbar",
6388 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006389 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006390 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006391 apex_available: ["myapex"],
6392 }
6393
6394 cc_library {
6395 name: "libbaz",
6396 stl: "none",
6397 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006398 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006399
6400 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6401 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6402 testApex(t, `
6403 apex {
6404 name: "com.sdv.myapex",
6405 key: "myapex.key",
6406 native_shared_libs: ["libfoo"],
6407 updatable: false,
6408 product_specific: true,
6409 }
6410
6411 apex_key {
6412 name: "myapex.key",
6413 public_key: "testkey.avbpubkey",
6414 private_key: "testkey.pem",
6415 }
6416
6417 cc_library {
6418 name: "libfoo",
6419 stl: "none",
6420 shared_libs: ["libbar"],
6421 system_shared_libs: [],
6422 apex_available: ["com.sdv.myapex"],
6423 product_specific: true,
6424 }
6425
6426 cc_library {
6427 name: "libbar",
6428 stl: "none",
6429 shared_libs: ["libbaz"],
6430 system_shared_libs: [],
6431 apex_available: ["com.sdv.myapex"],
6432 product_specific: true,
6433 }
6434
6435 cc_library {
6436 name: "libbaz",
6437 stl: "none",
6438 system_shared_libs: [],
6439 product_specific: true,
6440 }`,
6441 android.FixtureMergeMockFs(android.MockFS{
6442 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6443 }))
6444
6445 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6446 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6447 apex {
6448 name: "com.sdv.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 shared_libs: ["libbar"],
6464 system_shared_libs: [],
6465 apex_available: ["com.sdv.myapex"],
6466 }
6467
6468 cc_library {
6469 name: "libbar",
6470 stl: "none",
6471 shared_libs: ["libbaz"],
6472 system_shared_libs: [],
6473 apex_available: ["com.sdv.myapex"],
6474 }
6475
6476 cc_library {
6477 name: "libbaz",
6478 stl: "none",
6479 system_shared_libs: [],
6480 }`,
6481 android.FixtureMergeMockFs(android.MockFS{
6482 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6483 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006484}
Jiyong Park127b40b2019-09-30 16:04:35 +09006485
Liz Kammer5f108fa2023-05-11 14:33:17 -04006486func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006487 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006488 testApex(t, `
6489 apex {
6490 name: "myapex",
6491 key: "myapex.key",
6492 native_shared_libs: ["libfoo"],
6493 updatable: false,
6494 }
6495
6496 apex_key {
6497 name: "myapex.key",
6498 public_key: "testkey.avbpubkey",
6499 private_key: "testkey.pem",
6500 }
6501
6502 cc_library {
6503 name: "libfoo",
6504 stl: "none",
6505 static_libs: ["libbar"],
6506 system_shared_libs: [],
6507 apex_available: ["myapex"],
6508 }
6509
6510 cc_library {
6511 name: "libbar",
6512 stl: "none",
6513 shared_libs: ["libbaz"],
6514 system_shared_libs: [],
6515 apex_available: ["myapex"],
6516 }
6517
6518 cc_library {
6519 name: "libbaz",
6520 stl: "none",
6521 system_shared_libs: [],
6522 }`)
6523
6524 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 native_shared_libs: ["libfoo"],
6529 updatable: false,
6530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537
6538 cc_library {
6539 name: "libfoo",
6540 stl: "none",
6541 static_libs: ["libbar"],
6542 system_shared_libs: [],
6543 apex_available: ["myapex"],
6544 }
6545
6546 cc_library {
6547 name: "libbar",
6548 stl: "none",
6549 system_shared_libs: [],
6550 }`)
6551}
6552
Paul Duffine52e66f2020-03-30 17:54:29 +01006553func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006554 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006555 testApexError(t, "\"otherapex\" is not a valid module name", `
6556 apex {
6557 name: "myapex",
6558 key: "myapex.key",
6559 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006560 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 }
6562
6563 apex_key {
6564 name: "myapex.key",
6565 public_key: "testkey.avbpubkey",
6566 private_key: "testkey.pem",
6567 }
6568
6569 cc_library {
6570 name: "libfoo",
6571 stl: "none",
6572 system_shared_libs: [],
6573 apex_available: ["otherapex"],
6574 }`)
6575
Paul Duffine52e66f2020-03-30 17:54:29 +01006576 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006577 apex {
6578 name: "myapex",
6579 key: "myapex.key",
6580 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006581 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 }
6583
6584 apex_key {
6585 name: "myapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
6590 cc_library {
6591 name: "libfoo",
6592 stl: "none",
6593 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006594 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006595 apex_available: ["myapex"],
6596 }
6597
6598 cc_library {
6599 name: "libbar",
6600 stl: "none",
6601 system_shared_libs: [],
6602 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006603 }
6604
6605 cc_library {
6606 name: "libbaz",
6607 stl: "none",
6608 system_shared_libs: [],
6609 stubs: {
6610 versions: ["10", "20", "30"],
6611 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006612 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006613}
Jiyong Park127b40b2019-09-30 16:04:35 +09006614
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006615func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006616 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006617 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006618 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006619 testApexError(t, "expected an integer between 0-9; got -1", `
6620 apex {
6621 name: "myapex",
6622 key: "myapex.key",
6623 apex_available_name: "com.android.foo",
6624 variant_version: "-1",
6625 updatable: false,
6626 }
6627 apex_key {
6628 name: "myapex.key",
6629 public_key: "testkey.avbpubkey",
6630 private_key: "testkey.pem",
6631 }
6632 `)
6633 })
6634
6635 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006636 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006637 testApexError(t, "expected an integer between 0-9; got 10", `
6638 apex {
6639 name: "myapex",
6640 key: "myapex.key",
6641 apex_available_name: "com.android.foo",
6642 variant_version: "10",
6643 updatable: false,
6644 }
6645 apex_key {
6646 name: "myapex.key",
6647 public_key: "testkey.avbpubkey",
6648 private_key: "testkey.pem",
6649 }
6650 `)
6651 })
6652}
6653
6654func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006655 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006656 context := android.GroupFixturePreparers(
6657 android.PrepareForIntegrationTestWithAndroid,
6658 PrepareForTestWithApexBuildComponents,
6659 android.FixtureMergeMockFs(android.MockFS{
6660 "system/sepolicy/apex/foo-file_contexts": nil,
6661 "system/sepolicy/apex/bar-file_contexts": nil,
6662 }),
6663 )
6664 result := context.RunTestWithBp(t, `
6665 apex {
6666 name: "foo",
6667 key: "myapex.key",
6668 apex_available_name: "com.android.foo",
6669 variant_version: "0",
6670 updatable: false,
6671 }
6672 apex {
6673 name: "bar",
6674 key: "myapex.key",
6675 apex_available_name: "com.android.foo",
6676 variant_version: "3",
6677 updatable: false,
6678 }
6679 apex_key {
6680 name: "myapex.key",
6681 public_key: "testkey.avbpubkey",
6682 private_key: "testkey.pem",
6683 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006684 override_apex {
6685 name: "myoverrideapex",
6686 base: "bar",
6687 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006688 `)
6689
Jooyung Hana0503a52023-08-23 13:12:50 +09006690 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006691 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006692 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6693 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6694 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6695 }
6696
Jooyung Hana0503a52023-08-23 13:12:50 +09006697 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006698 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006699 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6700 barActualDefaultVersion := barManifestRule.Args["default_version"]
6701 if barActualDefaultVersion != barExpectedDefaultVersion {
6702 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6703 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006704
Spandan Das50801e22024-05-13 18:29:45 +00006705 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006706 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6707 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6708 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6709 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006710}
6711
Sam Delmericoca816532023-06-02 14:09:50 -04006712func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006713 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006714 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 -07006715 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006716 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6717 apex {
6718 name: "myapex_sminus",
6719 key: "myapex.key",
6720 apps: ["AppFoo"],
6721 apex_available_name: "myapex",
6722 updatable: false,
6723 }
6724 apex {
6725 name: "myapex",
6726 key: "myapex.key",
6727 apps: ["AppFoo"],
6728 updatable: false,
6729 }
6730 apex_key {
6731 name: "myapex.key",
6732 public_key: "testkey.avbpubkey",
6733 private_key: "testkey.pem",
6734 }
6735 android_app {
6736 name: "AppFoo",
6737 srcs: ["foo/bar/MyClass.java"],
6738 sdk_version: "none",
6739 system_modules: "none",
6740 apex_available: [ "myapex_sminus" ],
6741 }`,
6742 android.FixtureMergeMockFs(android.MockFS{
6743 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6744 }),
6745 )
6746 })
6747
6748 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 -07006749 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006750 testApex(t, `
6751 apex {
6752 name: "myapex_sminus",
6753 key: "myapex.key",
6754 apps: ["AppFoo"],
6755 apex_available_name: "myapex",
6756 updatable: false,
6757 }
6758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 apps: ["AppFoo"],
6762 updatable: false,
6763 }
6764 apex_key {
6765 name: "myapex.key",
6766 public_key: "testkey.avbpubkey",
6767 private_key: "testkey.pem",
6768 }
6769 android_app {
6770 name: "AppFoo",
6771 srcs: ["foo/bar/MyClass.java"],
6772 sdk_version: "none",
6773 system_modules: "none",
6774 apex_available: [ "myapex" ],
6775 }`,
6776 android.FixtureMergeMockFs(android.MockFS{
6777 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6778 }),
6779 )
6780 })
6781
6782 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006783 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006784 testApex(t, `
6785 override_apex {
6786 name: "myoverrideapex_sminus",
6787 base: "myapex_sminus",
6788 key: "myapex.key",
6789 apps: ["AppFooOverride"],
6790 }
6791 override_apex {
6792 name: "myoverrideapex",
6793 base: "myapex",
6794 key: "myapex.key",
6795 apps: ["AppFooOverride"],
6796 }
6797 apex {
6798 name: "myapex_sminus",
6799 key: "myapex.key",
6800 apps: ["AppFoo"],
6801 apex_available_name: "myapex",
6802 updatable: false,
6803 }
6804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
6807 apps: ["AppFoo"],
6808 updatable: false,
6809 }
6810 apex_key {
6811 name: "myapex.key",
6812 public_key: "testkey.avbpubkey",
6813 private_key: "testkey.pem",
6814 }
6815 android_app {
6816 name: "AppFooOverride",
6817 srcs: ["foo/bar/MyClass.java"],
6818 sdk_version: "none",
6819 system_modules: "none",
6820 apex_available: [ "myapex" ],
6821 }
6822 android_app {
6823 name: "AppFoo",
6824 srcs: ["foo/bar/MyClass.java"],
6825 sdk_version: "none",
6826 system_modules: "none",
6827 apex_available: [ "myapex" ],
6828 }`,
6829 android.FixtureMergeMockFs(android.MockFS{
6830 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6831 }),
6832 )
6833 })
6834}
6835
6836func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006837 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006838 context := android.GroupFixturePreparers(
6839 android.PrepareForIntegrationTestWithAndroid,
6840 PrepareForTestWithApexBuildComponents,
6841 java.PrepareForTestWithDexpreopt,
6842 android.FixtureMergeMockFs(android.MockFS{
6843 "system/sepolicy/apex/myapex-file_contexts": nil,
6844 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6845 }),
6846 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6847 variables.BuildId = proptools.StringPtr("buildid")
6848 }),
6849 )
6850 context.RunTestWithBp(t, `
6851 override_apex {
6852 name: "myoverrideapex_sminus",
6853 base: "myapex_sminus",
6854 }
6855 override_apex {
6856 name: "myoverrideapex",
6857 base: "myapex",
6858 }
6859 apex {
6860 name: "myapex",
6861 key: "myapex.key",
6862 apps: ["AppFoo"],
6863 updatable: false,
6864 }
6865 apex {
6866 name: "myapex_sminus",
6867 apex_available_name: "myapex",
6868 key: "myapex.key",
6869 apps: ["AppFoo_sminus"],
6870 updatable: false,
6871 }
6872 apex_key {
6873 name: "myapex.key",
6874 public_key: "testkey.avbpubkey",
6875 private_key: "testkey.pem",
6876 }
6877 android_app {
6878 name: "AppFoo",
6879 srcs: ["foo/bar/MyClass.java"],
6880 sdk_version: "none",
6881 system_modules: "none",
6882 apex_available: [ "myapex" ],
6883 }
6884 android_app {
6885 name: "AppFoo_sminus",
6886 srcs: ["foo/bar/MyClass.java"],
6887 sdk_version: "none",
6888 min_sdk_version: "29",
6889 system_modules: "none",
6890 apex_available: [ "myapex" ],
6891 }`)
6892}
6893
Jiyong Park89e850a2020-04-07 16:37:39 +09006894func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006896 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006897 apex {
6898 name: "myapex",
6899 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006900 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006901 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006902 }
6903
6904 apex_key {
6905 name: "myapex.key",
6906 public_key: "testkey.avbpubkey",
6907 private_key: "testkey.pem",
6908 }
6909
6910 cc_library {
6911 name: "libfoo",
6912 stl: "none",
6913 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006914 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006915 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006916 }
6917
6918 cc_library {
6919 name: "libfoo2",
6920 stl: "none",
6921 system_shared_libs: [],
6922 shared_libs: ["libbaz"],
6923 apex_available: ["//apex_available:platform"],
6924 }
6925
6926 cc_library {
6927 name: "libbar",
6928 stl: "none",
6929 system_shared_libs: [],
6930 apex_available: ["myapex"],
6931 }
6932
6933 cc_library {
6934 name: "libbaz",
6935 stl: "none",
6936 system_shared_libs: [],
6937 apex_available: ["myapex"],
6938 stubs: {
6939 versions: ["1"],
6940 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006941 }`)
6942
Jiyong Park89e850a2020-04-07 16:37:39 +09006943 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6944 // because it depends on libbar which isn't available to platform
6945 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6946 if libfoo.NotAvailableForPlatform() != true {
6947 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6948 }
6949
6950 // libfoo2 however can be available to platform because it depends on libbaz which provides
6951 // stubs
6952 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6953 if libfoo2.NotAvailableForPlatform() == true {
6954 t.Errorf("%q should be available to platform", libfoo2.String())
6955 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006956}
Jiyong Parka90ca002019-10-07 15:47:24 +09006957
Paul Duffine52e66f2020-03-30 17:54:29 +01006958func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006959 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006960 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006961 apex {
6962 name: "myapex",
6963 key: "myapex.key",
6964 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006965 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006966 }
6967
6968 apex_key {
6969 name: "myapex.key",
6970 public_key: "testkey.avbpubkey",
6971 private_key: "testkey.pem",
6972 }
6973
6974 cc_library {
6975 name: "libfoo",
6976 stl: "none",
6977 system_shared_libs: [],
6978 apex_available: ["myapex"],
6979 static: {
6980 apex_available: ["//apex_available:platform"],
6981 },
6982 }`)
6983
Jiyong Park89e850a2020-04-07 16:37:39 +09006984 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6985 if libfooShared.NotAvailableForPlatform() != true {
6986 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6987 }
6988 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6989 if libfooStatic.NotAvailableForPlatform() != false {
6990 t.Errorf("%q should be available to platform", libfooStatic.String())
6991 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006992}
6993
Jooyung Han9a419e22024-08-16 17:14:21 +09006994func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006995 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006996
6997 for _, tc := range []struct {
6998 name string
6999 apexAvailable string
7000 expectedError string
7001 }{
7002 {
7003 name: "prefix matches correctly",
7004 apexAvailable: "com.foo.*",
7005 },
7006 {
7007 name: "prefix doesn't match",
7008 apexAvailable: "com.bar.*",
7009 expectedError: `Consider .* "com.foo\.\*"`,
7010 },
7011 {
7012 name: "short prefix",
7013 apexAvailable: "com.*",
7014 expectedError: "requires two or more components",
7015 },
7016 {
7017 name: "wildcard not in the end",
7018 apexAvailable: "com.*.foo",
7019 expectedError: "should end with .*",
7020 },
7021 {
7022 name: "wildcard in the middle",
7023 apexAvailable: "com.foo*.*",
7024 expectedError: "not allowed in the middle",
7025 },
7026 {
7027 name: "hint with prefix pattern",
7028 apexAvailable: "//apex_available:platform",
7029 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7030 },
7031 } {
7032 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007033 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007034 errorHandler := android.FixtureExpectsNoErrors
7035 if tc.expectedError != "" {
7036 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7037 }
7038 context := android.GroupFixturePreparers(
7039 prepareForApexTest,
7040 android.FixtureMergeMockFs(android.MockFS{
7041 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7042 }),
7043 ).ExtendWithErrorHandler(errorHandler)
7044
7045 context.RunTestWithBp(t, `
7046 apex {
7047 name: "com.foo.bar",
7048 key: "myapex.key",
7049 native_shared_libs: ["libfoo"],
7050 updatable: false,
7051 }
7052
7053 apex_key {
7054 name: "myapex.key",
7055 public_key: "testkey.avbpubkey",
7056 private_key: "testkey.pem",
7057 }
7058
7059 cc_library {
7060 name: "libfoo",
7061 stl: "none",
7062 system_shared_libs: [],
7063 apex_available: ["`+tc.apexAvailable+`"],
7064 }`)
7065 })
7066 }
7067 testApexError(t, `Consider adding "com.foo" to`, `
7068 apex {
7069 name: "com.foo", // too short for a partner apex
7070 key: "myapex.key",
7071 native_shared_libs: ["libfoo"],
7072 updatable: false,
7073 }
7074
7075 apex_key {
7076 name: "myapex.key",
7077 public_key: "testkey.avbpubkey",
7078 private_key: "testkey.pem",
7079 }
7080
7081 cc_library {
7082 name: "libfoo",
7083 stl: "none",
7084 system_shared_libs: [],
7085 }
7086 `)
7087}
7088
Jooyung Hanb9518072024-11-22 14:05:20 +09007089func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7090 t.Parallel()
7091 ctx := testApex(t, `
7092 apex_test {
7093 name: "myapex",
7094 key: "myapex.key",
7095 skip_validations: {
7096 host_apex_verifier: true,
7097 },
7098 updatable: false,
7099 }
7100 apex_key {
7101 name: "myapex.key",
7102 public_key: "testkey.avbpubkey",
7103 private_key: "testkey.pem",
7104 }
7105 `)
7106
7107 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7108 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7109 t.Error("should not run host_apex_verifier")
7110 }
7111}
7112
7113func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7114 t.Parallel()
7115 ctx := testApex(t, `
7116 apex_test {
7117 name: "myapex",
7118 key: "myapex.key",
7119 updatable: false,
7120 }
7121 apex_key {
7122 name: "myapex.key",
7123 public_key: "testkey.avbpubkey",
7124 private_key: "testkey.pem",
7125 }
7126 `)
7127
7128 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7129 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7130 t.Error("should run host_apex_verifier")
7131 }
7132}
7133
Jiyong Park5d790c32019-11-15 18:40:32 +09007134func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007135 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007136 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007137 apex {
7138 name: "myapex",
7139 key: "myapex.key",
7140 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007141 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007142 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007143 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007144 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007145 }
7146
7147 override_apex {
7148 name: "override_myapex",
7149 base: "myapex",
7150 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007151 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007152 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007153 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007154 compile_multilib: "first",
7155 multilib: {
7156 lib32: {
7157 native_shared_libs: ["mylib32"],
7158 },
7159 lib64: {
7160 native_shared_libs: ["mylib64"],
7161 },
7162 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007163 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007164 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007165 key: "mynewapex.key",
7166 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007167 }
7168
7169 apex_key {
7170 name: "myapex.key",
7171 public_key: "testkey.avbpubkey",
7172 private_key: "testkey.pem",
7173 }
7174
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007175 apex_key {
7176 name: "mynewapex.key",
7177 public_key: "testkey2.avbpubkey",
7178 private_key: "testkey2.pem",
7179 }
7180
7181 android_app_certificate {
7182 name: "myapex.certificate",
7183 certificate: "testkey",
7184 }
7185
Jiyong Park5d790c32019-11-15 18:40:32 +09007186 android_app {
7187 name: "app",
7188 srcs: ["foo/bar/MyClass.java"],
7189 package_name: "foo",
7190 sdk_version: "none",
7191 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007192 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007193 }
7194
7195 override_android_app {
7196 name: "override_app",
7197 base: "app",
7198 package_name: "bar",
7199 }
markchien7c803b82021-08-26 22:10:06 +08007200
7201 bpf {
7202 name: "bpf",
7203 srcs: ["bpf.c"],
7204 }
7205
7206 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007207 name: "overrideBpf",
7208 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007209 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007210
7211 prebuilt_etc {
7212 name: "myetc",
7213 src: "myprebuilt",
7214 }
7215
7216 prebuilt_etc {
7217 name: "override_myetc",
7218 src: "override_myprebuilt",
7219 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007220
7221 cc_library {
7222 name: "mylib32",
7223 apex_available: [ "myapex" ],
7224 }
7225
7226 cc_library {
7227 name: "mylib64",
7228 apex_available: [ "myapex" ],
7229 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007230 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007231
Jooyung Hana0503a52023-08-23 13:12:50 +09007232 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007233 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007234 if originalVariant.GetOverriddenBy() != "" {
7235 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7236 }
7237 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7238 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7239 }
7240
Spandan Das50801e22024-05-13 18:29:45 +00007241 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007242 apexRule := module.Rule("apexRule")
7243 copyCmds := apexRule.Args["copy_commands"]
7244
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007245 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7246 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007247
markchien7c803b82021-08-26 22:10:06 +08007248 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007249 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007250
Daniel Norman5a3ce132021-08-26 15:44:43 -07007251 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7252 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7253
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007254 apexBundle := module.Module().(*apexBundle)
7255 name := apexBundle.Name()
7256 if name != "override_myapex" {
7257 t.Errorf("name should be \"override_myapex\", but was %q", name)
7258 }
7259
Baligh Uddin004d7172020-02-19 21:29:28 -08007260 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7261 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7262 }
7263
Jiyong Park20bacab2020-03-03 11:45:41 +09007264 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007265 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007266 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7267
7268 signApkRule := module.Rule("signapk")
7269 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007270
Colin Crossaa255532020-07-03 13:18:24 -07007271 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007272 var builder strings.Builder
7273 data.Custom(&builder, name, "TARGET_", "", data)
7274 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007275 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7276 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007277 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007278 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007279 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007280 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007281 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007282 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007283}
7284
Albert Martineefabcf2022-03-21 20:11:16 +00007285func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007286 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007287 // Override from 29 to 31
7288 minSdkOverride31 := "31"
7289 ctx := testApex(t, `
7290 apex {
7291 name: "myapex",
7292 key: "myapex.key",
7293 native_shared_libs: ["mylib"],
7294 updatable: true,
7295 min_sdk_version: "29"
7296 }
7297
7298 override_apex {
7299 name: "override_myapex",
7300 base: "myapex",
7301 logging_parent: "com.foo.bar",
7302 package_name: "test.overridden.package"
7303 }
7304
7305 apex_key {
7306 name: "myapex.key",
7307 public_key: "testkey.avbpubkey",
7308 private_key: "testkey.pem",
7309 }
7310
7311 cc_library {
7312 name: "mylib",
7313 srcs: ["mylib.cpp"],
7314 runtime_libs: ["libbar"],
7315 system_shared_libs: [],
7316 stl: "none",
7317 apex_available: [ "myapex" ],
7318 min_sdk_version: "apex_inherit"
7319 }
7320
7321 cc_library {
7322 name: "libbar",
7323 srcs: ["mylib.cpp"],
7324 system_shared_libs: [],
7325 stl: "none",
7326 apex_available: [ "myapex" ],
7327 min_sdk_version: "apex_inherit"
7328 }
7329
7330 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7331
Jooyung Hana0503a52023-08-23 13:12:50 +09007332 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007333 copyCmds := apexRule.Args["copy_commands"]
7334
7335 // Ensure that direct non-stubs dep is always included
7336 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7337
7338 // Ensure that runtime_libs dep in included
7339 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7340
7341 // Ensure libraries target overridden min_sdk_version value
7342 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7343}
7344
7345func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007346 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007347 // Attempt to override from 31 to 29, should be a NOOP
7348 minSdkOverride29 := "29"
7349 ctx := testApex(t, `
7350 apex {
7351 name: "myapex",
7352 key: "myapex.key",
7353 native_shared_libs: ["mylib"],
7354 updatable: true,
7355 min_sdk_version: "31"
7356 }
7357
7358 override_apex {
7359 name: "override_myapex",
7360 base: "myapex",
7361 logging_parent: "com.foo.bar",
7362 package_name: "test.overridden.package"
7363 }
7364
7365 apex_key {
7366 name: "myapex.key",
7367 public_key: "testkey.avbpubkey",
7368 private_key: "testkey.pem",
7369 }
7370
7371 cc_library {
7372 name: "mylib",
7373 srcs: ["mylib.cpp"],
7374 runtime_libs: ["libbar"],
7375 system_shared_libs: [],
7376 stl: "none",
7377 apex_available: [ "myapex" ],
7378 min_sdk_version: "apex_inherit"
7379 }
7380
7381 cc_library {
7382 name: "libbar",
7383 srcs: ["mylib.cpp"],
7384 system_shared_libs: [],
7385 stl: "none",
7386 apex_available: [ "myapex" ],
7387 min_sdk_version: "apex_inherit"
7388 }
7389
7390 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7391
Jooyung Hana0503a52023-08-23 13:12:50 +09007392 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007393 copyCmds := apexRule.Args["copy_commands"]
7394
7395 // Ensure that direct non-stubs dep is always included
7396 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7397
7398 // Ensure that runtime_libs dep in included
7399 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7400
7401 // Ensure libraries target the original min_sdk_version value rather than the overridden
7402 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7403}
7404
Jooyung Han214bf372019-11-12 13:03:50 +09007405func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007406 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007407 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007408 apex {
7409 name: "myapex",
7410 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007411 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007412 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007413 }
7414
7415 apex_key {
7416 name: "myapex.key",
7417 public_key: "testkey.avbpubkey",
7418 private_key: "testkey.pem",
7419 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007420
7421 cc_library {
7422 name: "mylib",
7423 srcs: ["mylib.cpp"],
7424 stl: "libc++",
7425 system_shared_libs: [],
7426 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007427 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007428 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007429 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007430
Jooyung Hana0503a52023-08-23 13:12:50 +09007431 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007432 args := module.Rule("apexRule").Args
7433 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007434 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007435
7436 // The copies of the libraries in the apex should have one more dependency than
7437 // the ones outside the apex, namely the unwinder. Ideally we should check
7438 // the dependency names directly here but for some reason the names are blank in
7439 // this test.
7440 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007441 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007442 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7443 if len(apexImplicits) != len(nonApexImplicits)+1 {
7444 t.Errorf("%q missing unwinder dep", lib)
7445 }
7446 }
Jooyung Han214bf372019-11-12 13:03:50 +09007447}
7448
Paul Duffine05480a2021-03-08 15:07:14 +00007449var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007450 "api/current.txt": nil,
7451 "api/removed.txt": nil,
7452 "api/system-current.txt": nil,
7453 "api/system-removed.txt": nil,
7454 "api/test-current.txt": nil,
7455 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007456
Anton Hanssondff2c782020-12-21 17:10:01 +00007457 "100/public/api/foo.txt": nil,
7458 "100/public/api/foo-removed.txt": nil,
7459 "100/system/api/foo.txt": nil,
7460 "100/system/api/foo-removed.txt": nil,
7461
Paul Duffineedc5d52020-06-12 17:46:39 +01007462 // For java_sdk_library_import
7463 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007464}
7465
Jooyung Han58f26ab2019-12-18 15:34:32 +09007466func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007467 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007468 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007469 apex {
7470 name: "myapex",
7471 key: "myapex.key",
7472 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007473 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007474 }
7475
7476 apex_key {
7477 name: "myapex.key",
7478 public_key: "testkey.avbpubkey",
7479 private_key: "testkey.pem",
7480 }
7481
7482 java_sdk_library {
7483 name: "foo",
7484 srcs: ["a.java"],
7485 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007486 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007487 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007488
7489 prebuilt_apis {
7490 name: "sdk",
7491 api_dirs: ["100"],
7492 }
Paul Duffin9b879592020-05-26 13:21:35 +01007493 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007494
7495 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007496 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007497 "javalib/foo.jar",
7498 "etc/permissions/foo.xml",
7499 })
7500 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007501 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7502 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7503 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007504}
7505
Spandan Das3ee19692024-06-19 04:47:40 +00007506func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007507 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007508 ctx := testApex(t, `
7509 override_apex {
7510 name: "mycompanyapex",
7511 base: "myapex",
7512 }
7513 apex {
7514 name: "myapex",
7515 key: "myapex.key",
7516 java_libs: ["foo"],
7517 updatable: false,
7518 }
7519
7520 apex_key {
7521 name: "myapex.key",
7522 public_key: "testkey.avbpubkey",
7523 private_key: "testkey.pem",
7524 }
7525
7526 java_sdk_library {
7527 name: "foo",
7528 srcs: ["a.java"],
7529 api_packages: ["foo"],
7530 apex_available: [ "myapex" ],
7531 }
7532
7533 prebuilt_apis {
7534 name: "sdk",
7535 api_dirs: ["100"],
7536 }
7537 `, withFiles(filesForSdkLibrary))
7538
7539 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7540 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7541 // (com.android.foo), the filepath should not contain override apex name.
7542 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7543 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7544 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7545}
7546
Paul Duffin9b879592020-05-26 13:21:35 +01007547func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007548 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007549 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007550 apex {
7551 name: "myapex",
7552 key: "myapex.key",
7553 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007554 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007555 }
7556
7557 apex_key {
7558 name: "myapex.key",
7559 public_key: "testkey.avbpubkey",
7560 private_key: "testkey.pem",
7561 }
7562
7563 java_sdk_library {
7564 name: "foo",
7565 srcs: ["a.java"],
7566 api_packages: ["foo"],
7567 apex_available: ["myapex"],
7568 sdk_version: "none",
7569 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007570 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007571 }
7572
7573 java_library {
7574 name: "bar",
7575 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007576 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007577 apex_available: ["myapex"],
7578 sdk_version: "none",
7579 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007580 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007581 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007582
7583 prebuilt_apis {
7584 name: "sdk",
7585 api_dirs: ["100"],
7586 }
Paul Duffin9b879592020-05-26 13:21:35 +01007587 `, withFiles(filesForSdkLibrary))
7588
7589 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007590 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007591 "javalib/bar.jar",
7592 "javalib/foo.jar",
7593 "etc/permissions/foo.xml",
7594 })
7595
7596 // The bar library should depend on the implementation jar.
7597 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007598 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007599 t.Errorf("expected %q, found %#q", expected, actual)
7600 }
7601}
7602
7603func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007604 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007605 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007606 apex {
7607 name: "myapex",
7608 key: "myapex.key",
7609 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007610 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007611 }
7612
7613 apex_key {
7614 name: "myapex.key",
7615 public_key: "testkey.avbpubkey",
7616 private_key: "testkey.pem",
7617 }
7618
7619 java_sdk_library {
7620 name: "foo",
7621 srcs: ["a.java"],
7622 api_packages: ["foo"],
7623 apex_available: ["myapex"],
7624 sdk_version: "none",
7625 system_modules: "none",
7626 }
7627
7628 java_library {
7629 name: "bar",
7630 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007631 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007632 sdk_version: "none",
7633 system_modules: "none",
7634 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007635
7636 prebuilt_apis {
7637 name: "sdk",
7638 api_dirs: ["100"],
7639 }
Paul Duffin9b879592020-05-26 13:21:35 +01007640 `, withFiles(filesForSdkLibrary))
7641
7642 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007643 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007644 "javalib/foo.jar",
7645 "etc/permissions/foo.xml",
7646 })
7647
7648 // The bar library should depend on the stubs jar.
7649 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007650 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007651 t.Errorf("expected %q, found %#q", expected, actual)
7652 }
7653}
7654
Paul Duffineedc5d52020-06-12 17:46:39 +01007655func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007656 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007657 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007658 prebuilt_apis {
7659 name: "sdk",
7660 api_dirs: ["100"],
7661 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007662 withFiles(map[string][]byte{
7663 "apex/a.java": nil,
7664 "apex/apex_manifest.json": nil,
7665 "apex/Android.bp": []byte(`
7666 package {
7667 default_visibility: ["//visibility:private"],
7668 }
7669
7670 apex {
7671 name: "myapex",
7672 key: "myapex.key",
7673 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007674 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007675 }
7676
7677 apex_key {
7678 name: "myapex.key",
7679 public_key: "testkey.avbpubkey",
7680 private_key: "testkey.pem",
7681 }
7682
7683 java_library {
7684 name: "bar",
7685 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007686 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007687 apex_available: ["myapex"],
7688 sdk_version: "none",
7689 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007690 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007691 }
7692`),
7693 "source/a.java": nil,
7694 "source/api/current.txt": nil,
7695 "source/api/removed.txt": nil,
7696 "source/Android.bp": []byte(`
7697 package {
7698 default_visibility: ["//visibility:private"],
7699 }
7700
7701 java_sdk_library {
7702 name: "foo",
7703 visibility: ["//apex"],
7704 srcs: ["a.java"],
7705 api_packages: ["foo"],
7706 apex_available: ["myapex"],
7707 sdk_version: "none",
7708 system_modules: "none",
7709 public: {
7710 enabled: true,
7711 },
Colin Crosse4f34882024-11-14 12:26:00 -08007712 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007713 }
7714`),
7715 "prebuilt/a.jar": nil,
7716 "prebuilt/Android.bp": []byte(`
7717 package {
7718 default_visibility: ["//visibility:private"],
7719 }
7720
7721 java_sdk_library_import {
7722 name: "foo",
7723 visibility: ["//apex", "//source"],
7724 apex_available: ["myapex"],
7725 prefer: true,
7726 public: {
7727 jars: ["a.jar"],
7728 },
Colin Crosse4f34882024-11-14 12:26:00 -08007729 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007730 }
7731`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007732 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007733 )
7734
7735 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007736 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007737 "javalib/bar.jar",
7738 "javalib/foo.jar",
7739 "etc/permissions/foo.xml",
7740 })
7741
7742 // The bar library should depend on the implementation jar.
7743 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007744 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007745 t.Errorf("expected %q, found %#q", expected, actual)
7746 }
7747}
7748
7749func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007750 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007751 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7752 apex {
7753 name: "myapex",
7754 key: "myapex.key",
7755 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007756 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007757 }
7758
7759 apex_key {
7760 name: "myapex.key",
7761 public_key: "testkey.avbpubkey",
7762 private_key: "testkey.pem",
7763 }
7764
7765 java_sdk_library_import {
7766 name: "foo",
7767 apex_available: ["myapex"],
7768 prefer: true,
7769 public: {
7770 jars: ["a.jar"],
7771 },
7772 }
7773
7774 `, withFiles(filesForSdkLibrary))
7775}
7776
atrost6e126252020-01-27 17:01:16 +00007777func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007778 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007779 result := android.GroupFixturePreparers(
7780 prepareForApexTest,
7781 java.PrepareForTestWithPlatformCompatConfig,
7782 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007786 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007787 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007788 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007789 }
7790
7791 apex_key {
7792 name: "myapex.key",
7793 public_key: "testkey.avbpubkey",
7794 private_key: "testkey.pem",
7795 }
7796
7797 platform_compat_config {
7798 name: "myjar-platform-compat-config",
7799 src: ":myjar",
7800 }
7801
7802 java_library {
7803 name: "myjar",
7804 srcs: ["foo/bar/MyClass.java"],
7805 sdk_version: "none",
7806 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007807 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007808 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007809 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007810
7811 // Make sure that a preferred prebuilt does not affect the apex contents.
7812 prebuilt_platform_compat_config {
7813 name: "myjar-platform-compat-config",
7814 metadata: "compat-config/metadata.xml",
7815 prefer: true,
7816 }
atrost6e126252020-01-27 17:01:16 +00007817 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007818 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007819 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007820 "etc/compatconfig/myjar-platform-compat-config.xml",
7821 "javalib/myjar.jar",
7822 })
7823}
7824
Jooyung Han862c0d62022-12-21 10:15:37 +09007825func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007826 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007827 android.GroupFixturePreparers(
7828 android.PrepareForTestWithAndroidBuildComponents,
7829 PrepareForTestWithApexBuildComponents,
7830 prepareForTestWithMyapex,
7831 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7832 ).
7833 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7834 RunTestWithBp(t, `
7835 apex {
7836 name: "myapex",
7837 key: "myapex.key",
7838 prebuilts: ["foo", "bar"],
7839 updatable: false,
7840 }
7841
7842 apex_key {
7843 name: "myapex.key",
7844 public_key: "testkey.avbpubkey",
7845 private_key: "testkey.pem",
7846 }
7847
7848 prebuilt_etc {
7849 name: "foo",
7850 src: "myprebuilt",
7851 filename_from_src: true,
7852 }
7853
7854 prebuilt_etc {
7855 name: "bar",
7856 src: "myprebuilt",
7857 filename_from_src: true,
7858 }
7859 `)
7860}
7861
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007862func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007863 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007864 bp := `
7865 apex {
7866 name: "myapex",
7867 key: "myapex.key",
7868 native_shared_libs: ["libfoo"],
7869 updatable: false,
7870 unwanted_transitive_deps: ["libbar"],
7871 }
7872
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }
7878
7879 cc_library {
7880 name: "libfoo",
7881 srcs: ["foo.cpp"],
7882 shared_libs: ["libbar"],
7883 apex_available: ["myapex"],
7884 }
7885
7886 cc_library {
7887 name: "libbar",
7888 srcs: ["bar.cpp"],
7889 apex_available: ["myapex"],
7890 }`
7891 ctx := testApex(t, bp)
7892 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7893 "*/libc++.so",
7894 "*/libfoo.so",
7895 // not libbar.so
7896 })
7897}
7898
Jiyong Park479321d2019-12-16 11:47:12 +09007899func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007900 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007901 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7902 apex {
7903 name: "myapex",
7904 key: "myapex.key",
7905 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007906 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007907 }
7908
7909 apex_key {
7910 name: "myapex.key",
7911 public_key: "testkey.avbpubkey",
7912 private_key: "testkey.pem",
7913 }
7914
7915 java_library {
7916 name: "myjar",
7917 srcs: ["foo/bar/MyClass.java"],
7918 sdk_version: "none",
7919 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007920 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007921 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007922 }
7923 `)
7924}
7925
Jiyong Park7cd10e32020-01-14 09:22:18 +09007926func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007927 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007928 bp := `
7929 apex {
7930 name: "myapex",
7931 key: "myapex.key",
7932 native_shared_libs: ["mylib"],
7933 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007934 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007935 }
7936
Jiyong Park9d677202020-02-19 16:29:35 +09007937 apex {
7938 name: "myapex.updatable",
7939 key: "myapex.key",
7940 native_shared_libs: ["mylib"],
7941 java_libs: ["myjar"],
7942 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007943 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007944 }
7945
Jiyong Park7cd10e32020-01-14 09:22:18 +09007946 apex_key {
7947 name: "myapex.key",
7948 public_key: "testkey.avbpubkey",
7949 private_key: "testkey.pem",
7950 }
7951
7952 cc_library {
7953 name: "mylib",
7954 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007955 shared_libs: [
7956 "myotherlib",
7957 "myotherlib_ext",
7958 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 system_shared_libs: [],
7960 stl: "none",
7961 apex_available: [
7962 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007963 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007964 "//apex_available:platform",
7965 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007966 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967 }
7968
7969 cc_library {
7970 name: "myotherlib",
7971 srcs: ["mylib.cpp"],
7972 system_shared_libs: [],
7973 stl: "none",
7974 apex_available: [
7975 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007976 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007977 "//apex_available:platform",
7978 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007979 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007980 }
7981
Jiyong Parkce243632023-02-17 18:22:25 +09007982 cc_library {
7983 name: "myotherlib_ext",
7984 srcs: ["mylib.cpp"],
7985 system_shared_libs: [],
7986 system_ext_specific: true,
7987 stl: "none",
7988 apex_available: [
7989 "myapex",
7990 "myapex.updatable",
7991 "//apex_available:platform",
7992 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007993 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007994 }
7995
Jiyong Park7cd10e32020-01-14 09:22:18 +09007996 java_library {
7997 name: "myjar",
7998 srcs: ["foo/bar/MyClass.java"],
7999 sdk_version: "none",
8000 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008001 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008002 apex_available: [
8003 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008004 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008005 "//apex_available:platform",
8006 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008007 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008008 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008009 }
8010
8011 java_library {
8012 name: "myotherjar",
8013 srcs: ["foo/bar/MyClass.java"],
8014 sdk_version: "none",
8015 system_modules: "none",
8016 apex_available: [
8017 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008018 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008019 "//apex_available:platform",
8020 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008021 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008022 }
8023 `
8024
8025 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8026 for _, f := range files {
8027 if f.path == file {
8028 if f.isLink {
8029 t.Errorf("%q is not a real file", file)
8030 }
8031 return
8032 }
8033 }
8034 t.Errorf("%q is not found", file)
8035 }
8036
Jiyong Parkce243632023-02-17 18:22:25 +09008037 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008038 for _, f := range files {
8039 if f.path == file {
8040 if !f.isLink {
8041 t.Errorf("%q is not a symlink", file)
8042 }
Jiyong Parkce243632023-02-17 18:22:25 +09008043 if f.src != target {
8044 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8045 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008046 return
8047 }
8048 }
8049 t.Errorf("%q is not found", file)
8050 }
8051
Jiyong Park9d677202020-02-19 16:29:35 +09008052 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8053 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008054 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008055 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008056 ensureRealfileExists(t, files, "javalib/myjar.jar")
8057 ensureRealfileExists(t, files, "lib64/mylib.so")
8058 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008059 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008060
Jooyung Hana0503a52023-08-23 13:12:50 +09008061 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008062 ensureRealfileExists(t, files, "javalib/myjar.jar")
8063 ensureRealfileExists(t, files, "lib64/mylib.so")
8064 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008065 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008066
8067 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008068 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008069 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008070 ensureRealfileExists(t, files, "javalib/myjar.jar")
8071 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008072 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8073 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008074
Jooyung Hana0503a52023-08-23 13:12:50 +09008075 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008076 ensureRealfileExists(t, files, "javalib/myjar.jar")
8077 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008078 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8079 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008080}
8081
Yo Chiange8128052020-07-23 20:09:18 +08008082func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008083 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008084 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008085 apex {
8086 name: "myapex",
8087 key: "myapex.key",
8088 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008089 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008090 }
8091
8092 apex_key {
8093 name: "myapex.key",
8094 public_key: "testkey.avbpubkey",
8095 private_key: "testkey.pem",
8096 }
8097
8098 cc_library_shared {
8099 name: "mylib",
8100 srcs: ["mylib.cpp"],
8101 shared_libs: ["myotherlib"],
8102 system_shared_libs: [],
8103 stl: "none",
8104 apex_available: [
8105 "myapex",
8106 "//apex_available:platform",
8107 ],
8108 }
8109
8110 cc_prebuilt_library_shared {
8111 name: "myotherlib",
8112 srcs: ["prebuilt.so"],
8113 system_shared_libs: [],
8114 stl: "none",
8115 apex_available: [
8116 "myapex",
8117 "//apex_available:platform",
8118 ],
8119 }
8120 `)
8121
Jooyung Hana0503a52023-08-23 13:12:50 +09008122 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008123 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008124 var builder strings.Builder
8125 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8126 androidMk := builder.String()
8127 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008128 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008129 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8130 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8131 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008132 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008133}
8134
Jooyung Han643adc42020-02-27 13:50:06 +09008135func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008137 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008138 apex {
8139 name: "myapex",
8140 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008141 binaries: ["mybin"],
8142 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008143 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008144 }
8145
8146 apex_key {
8147 name: "myapex.key",
8148 public_key: "testkey.avbpubkey",
8149 private_key: "testkey.pem",
8150 }
8151
8152 cc_library {
8153 name: "mylib",
8154 srcs: ["mylib.cpp"],
8155 shared_libs: ["mylib2"],
8156 system_shared_libs: [],
8157 stl: "none",
8158 apex_available: [ "myapex" ],
8159 }
8160
8161 cc_library {
8162 name: "mylib2",
8163 srcs: ["mylib.cpp"],
8164 system_shared_libs: [],
8165 stl: "none",
8166 apex_available: [ "myapex" ],
8167 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008168
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008169 // Used as both a JNI library and a regular shared library.
8170 cc_library {
8171 name: "mylib3",
8172 srcs: ["mylib.cpp"],
8173 system_shared_libs: [],
8174 stl: "none",
8175 apex_available: [ "myapex" ],
8176 }
8177
8178 cc_binary {
8179 name: "mybin",
8180 srcs: ["mybin.cpp"],
8181 shared_libs: ["mylib3"],
8182 system_shared_libs: [],
8183 stl: "none",
8184 apex_available: [ "myapex" ],
8185 }
8186
Jiyong Park34d5c332022-02-24 18:02:44 +09008187 rust_ffi_shared {
8188 name: "libfoo.rust",
8189 crate_name: "foo",
8190 srcs: ["foo.rs"],
8191 shared_libs: ["libfoo.shared_from_rust"],
8192 prefer_rlib: true,
8193 apex_available: ["myapex"],
8194 }
8195
8196 cc_library_shared {
8197 name: "libfoo.shared_from_rust",
8198 srcs: ["mylib.cpp"],
8199 system_shared_libs: [],
8200 stl: "none",
8201 stubs: {
8202 versions: ["10", "11", "12"],
8203 },
8204 }
8205
Jooyung Han643adc42020-02-27 13:50:06 +09008206 `)
8207
Jooyung Hana0503a52023-08-23 13:12:50 +09008208 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008209 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008210 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008211 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008212 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008213 "lib64/mylib.so",
8214 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008215 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008216 "lib64/libfoo.rust.so",
8217 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8218 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008219 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008220
8221 // b/220397949
8222 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008223}
8224
Jooyung Han49f67012020-04-17 13:43:10 +09008225func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008226 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008227 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008228 apex {
8229 name: "myapex",
8230 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008231 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008232 }
8233 apex_key {
8234 name: "myapex.key",
8235 public_key: "testkey.avbpubkey",
8236 private_key: "testkey.pem",
8237 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008238 `,
8239 android.FixtureModifyConfig(func(config android.Config) {
8240 delete(config.Targets, android.Android)
8241 config.AndroidCommonTarget = android.Target{}
8242 }),
8243 )
Jooyung Han49f67012020-04-17 13:43:10 +09008244
8245 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8246 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8247 }
8248}
8249
Jiyong Parkbd159612020-02-28 15:22:21 +09008250func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008251 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008252 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008253 apex {
8254 name: "myapex",
8255 key: "myapex.key",
8256 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008257 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008258 }
8259
8260 apex_key {
8261 name: "myapex.key",
8262 public_key: "testkey.avbpubkey",
8263 private_key: "testkey.pem",
8264 }
8265
8266 android_app {
8267 name: "AppFoo",
8268 srcs: ["foo/bar/MyClass.java"],
8269 sdk_version: "none",
8270 system_modules: "none",
8271 apex_available: [ "myapex" ],
8272 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008273 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008274
Jooyung Hana0503a52023-08-23 13:12:50 +09008275 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008276 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008277
8278 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008279 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 +09008280}
8281
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008282func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008283 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008284 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008285 apex {
8286 name: "myapex",
8287 key: "myapex.key",
8288 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008289 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008290 }
8291
8292 apex_key {
8293 name: "myapex.key",
8294 public_key: "testkey.avbpubkey",
8295 private_key: "testkey.pem",
8296 }
8297
8298 android_app_set {
8299 name: "AppSet",
8300 set: "AppSet.apks",
8301 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008302 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008303 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008304 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008305 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8306 s := mod.Rule("apexRule").Args["copy_commands"]
8307 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008308 if len(copyCmds) != 4 {
8309 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008310 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008311 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8312 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008313 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8314 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008315
8316 // Ensure that canned_fs_config has an entry for the app set zip file
8317 generateFsRule := mod.Rule("generateFsConfig")
8318 cmd := generateFsRule.RuleParams.Command
8319 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008320}
8321
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008322func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008323 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008324 apex_set {
8325 name: "myapex",
8326 filename: "foo_v2.apex",
8327 sanitized: {
8328 none: { set: "myapex.apks", },
8329 hwaddress: { set: "myapex.hwasan.apks", },
8330 },
Paul Duffin24704672021-04-06 16:09:30 +01008331 }
8332 `
8333 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008334
Paul Duffin24704672021-04-06 16:09:30 +01008335 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008336 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008337
Spandan Das9d6e2092024-09-21 02:50:00 +00008338 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008339 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008340
Paul Duffin24704672021-04-06 16:09:30 +01008341 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8342
8343 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008344 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8345 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008346
8347 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008348}
8349
Pranav Guptaeba03b02022-09-27 00:27:08 +00008350func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008351 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008352 ctx := testApex(t, `
8353 apex_set {
8354 name: "myapex",
8355 set: ":myapex_apks_file",
8356 }
8357
8358 filegroup {
8359 name: "myapex_apks_file",
8360 srcs: ["myapex.apks"],
8361 }
8362 `)
8363
Spandan Das9d6e2092024-09-21 02:50:00 +00008364 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008365
8366 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008367 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008368 extractedApex := m.Output(extractorOutput)
8369
8370 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8371}
8372
Paul Duffin89f570a2021-06-16 01:42:33 +01008373func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008374 t.Helper()
8375
Paul Duffin55607122021-03-30 23:32:51 +01008376 fs := android.MockFS{
8377 "a.java": nil,
8378 "a.jar": nil,
8379 "apex_manifest.json": nil,
8380 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008381 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008382 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8383 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8384 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008385 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008386 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008387
Paul Duffin55607122021-03-30 23:32:51 +01008388 errorHandler := android.FixtureExpectsNoErrors
8389 if errmsg != "" {
8390 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008391 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008392
Paul Duffin55607122021-03-30 23:32:51 +01008393 result := android.GroupFixturePreparers(
8394 cc.PrepareForTestWithCcDefaultModules,
8395 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008396 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008397 java.PrepareForTestWithJavaSdkLibraryFiles,
8398 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008399 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008400 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008401 android.FixtureModifyMockFS(func(fs android.MockFS) {
8402 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8403 insert := ""
8404 for _, fragment := range fragments {
8405 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8406 }
8407 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8408 platform_bootclasspath {
8409 name: "platform-bootclasspath",
8410 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008411 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008412 %s
8413 ],
8414 }
8415 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008416 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008417 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008418 // Dexpreopt for boot jars requires the ART boot image profile.
8419 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8420 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008421 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008422 ).
8423 ExtendWithErrorHandler(errorHandler).
8424 RunTestWithBp(t, bp)
8425
8426 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008427}
8428
Jooyung Han548640b2020-04-27 12:10:30 +09008429func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008430 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008431 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8432 apex {
8433 name: "myapex",
8434 key: "myapex.key",
8435 updatable: true,
8436 }
8437
8438 apex_key {
8439 name: "myapex.key",
8440 public_key: "testkey.avbpubkey",
8441 private_key: "testkey.pem",
8442 }
8443 `)
8444}
8445
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008446func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008447 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008448 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8449 apex {
8450 name: "myapex",
8451 key: "myapex.key",
8452 }
8453
8454 apex_key {
8455 name: "myapex.key",
8456 public_key: "testkey.avbpubkey",
8457 private_key: "testkey.pem",
8458 }
8459 `)
8460}
8461
satayevb98371c2021-06-15 16:49:50 +01008462func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008463 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008464 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8465 apex {
8466 name: "myapex",
8467 key: "myapex.key",
8468 systemserverclasspath_fragments: [
8469 "mysystemserverclasspathfragment",
8470 ],
8471 min_sdk_version: "29",
8472 updatable: true,
8473 }
8474
8475 apex_key {
8476 name: "myapex.key",
8477 public_key: "testkey.avbpubkey",
8478 private_key: "testkey.pem",
8479 }
8480
8481 java_library {
8482 name: "foo",
8483 srcs: ["b.java"],
8484 min_sdk_version: "29",
8485 installable: true,
8486 apex_available: [
8487 "myapex",
8488 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008489 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008490 }
8491
8492 systemserverclasspath_fragment {
8493 name: "mysystemserverclasspathfragment",
8494 generate_classpaths_proto: false,
8495 contents: [
8496 "foo",
8497 ],
8498 apex_available: [
8499 "myapex",
8500 ],
8501 }
satayevabcd5972021-08-06 17:49:46 +01008502 `,
8503 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8504 )
satayevb98371c2021-06-15 16:49:50 +01008505}
8506
Paul Duffin064b70c2020-11-02 17:32:38 +00008507func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008508 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008509 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008510 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008511 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008512 fragment := java.ApexVariantReference{
8513 Apex: proptools.StringPtr("myapex"),
8514 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8515 }
8516
Paul Duffin064b70c2020-11-02 17:32:38 +00008517 testDexpreoptWithApexes(t, `
8518 prebuilt_apex {
8519 name: "myapex" ,
8520 arch: {
8521 arm64: {
8522 src: "myapex-arm64.apex",
8523 },
8524 arm: {
8525 src: "myapex-arm.apex",
8526 },
8527 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008528 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8529 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008530
Paul Duffin89f570a2021-06-16 01:42:33 +01008531 prebuilt_bootclasspath_fragment {
8532 name: "my-bootclasspath-fragment",
8533 contents: ["libfoo"],
8534 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008535 hidden_api: {
8536 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8537 metadata: "my-bootclasspath-fragment/metadata.csv",
8538 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008539 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8540 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8541 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008542 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008543 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008544
Spandan Das52c01a12024-09-20 01:09:48 +00008545 java_sdk_library_import {
8546 name: "libfoo",
8547 prefer: true,
8548 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008549 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008550 },
8551 apex_available: ["myapex"],
8552 shared_library: false,
8553 permitted_packages: ["libfoo"],
8554 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008555 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008556 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008557}
8558
Spandan Dasf14e2542021-11-12 00:01:37 +00008559func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008560 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008561 bp += `
8562 apex_key {
8563 name: "myapex.key",
8564 public_key: "testkey.avbpubkey",
8565 private_key: "testkey.pem",
8566 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008567 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008568 "lib1/src/A.java": nil,
8569 "lib2/src/B.java": nil,
8570 "system/sepolicy/apex/myapex-file_contexts": nil,
8571 }
8572
Paul Duffin45338f02021-03-30 23:07:52 +01008573 errorHandler := android.FixtureExpectsNoErrors
8574 if errmsg != "" {
8575 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008576 }
Colin Crossae8600b2020-10-29 17:09:13 -07008577
Paul Duffin45338f02021-03-30 23:07:52 +01008578 android.GroupFixturePreparers(
8579 android.PrepareForTestWithAndroidBuildComponents,
8580 java.PrepareForTestWithJavaBuildComponents,
8581 PrepareForTestWithApexBuildComponents,
8582 android.PrepareForTestWithNeverallowRules(rules),
8583 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008584 apexBootJars := make([]string, 0, len(bootJars))
8585 for _, apexBootJar := range bootJars {
8586 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008587 }
satayevd604b212021-07-21 14:23:52 +01008588 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008589 }),
8590 fs.AddToFixture(),
8591 ).
8592 ExtendWithErrorHandler(errorHandler).
8593 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008594}
8595
8596func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008597 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008598 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008599 name string
8600 expectedError string
8601 bp string
8602 bootJars []string
8603 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008604 }{
8605
8606 {
8607 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8608 expectedError: "",
8609 bp: `
8610 java_library {
8611 name: "bcp_lib1",
8612 srcs: ["lib1/src/*.java"],
8613 permitted_packages: ["foo.bar"],
8614 apex_available: ["myapex"],
8615 sdk_version: "none",
8616 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008617 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008618 }
8619 java_library {
8620 name: "nonbcp_lib2",
8621 srcs: ["lib2/src/*.java"],
8622 apex_available: ["myapex"],
8623 permitted_packages: ["a.b"],
8624 sdk_version: "none",
8625 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008626 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008627 }
8628 apex {
8629 name: "myapex",
8630 key: "myapex.key",
8631 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008632 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008633 }`,
8634 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008635 bcpPermittedPackages: map[string][]string{
8636 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008637 "foo.bar",
8638 },
8639 },
8640 },
8641 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008642 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008643 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 +01008644 bp: `
8645 java_library {
8646 name: "bcp_lib1",
8647 srcs: ["lib1/src/*.java"],
8648 apex_available: ["myapex"],
8649 permitted_packages: ["foo.bar"],
8650 sdk_version: "none",
8651 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008652 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008653 }
8654 java_library {
8655 name: "bcp_lib2",
8656 srcs: ["lib2/src/*.java"],
8657 apex_available: ["myapex"],
8658 permitted_packages: ["foo.bar", "bar.baz"],
8659 sdk_version: "none",
8660 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008661 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008662 }
8663 apex {
8664 name: "myapex",
8665 key: "myapex.key",
8666 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008667 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 }
8669 `,
8670 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008671 bcpPermittedPackages: map[string][]string{
8672 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008673 "foo.bar",
8674 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008675 "bcp_lib2": []string{
8676 "foo.bar",
8677 },
8678 },
8679 },
8680 {
8681 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8682 expectedError: "",
8683 bp: `
8684 java_library {
8685 name: "bcp_lib_restricted",
8686 srcs: ["lib1/src/*.java"],
8687 apex_available: ["myapex"],
8688 permitted_packages: ["foo.bar"],
8689 sdk_version: "none",
8690 min_sdk_version: "29",
8691 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008692 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008693 }
8694 java_library {
8695 name: "bcp_lib_unrestricted",
8696 srcs: ["lib2/src/*.java"],
8697 apex_available: ["myapex"],
8698 permitted_packages: ["foo.bar", "bar.baz"],
8699 sdk_version: "none",
8700 min_sdk_version: "29",
8701 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008702 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008703 }
8704 apex {
8705 name: "myapex",
8706 key: "myapex.key",
8707 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8708 updatable: true,
8709 min_sdk_version: "29",
8710 }
8711 `,
8712 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8713 bcpPermittedPackages: map[string][]string{
8714 "bcp_lib1_non_updateable": []string{
8715 "foo.bar",
8716 },
8717 // 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 +01008718 },
8719 },
8720 }
8721 for _, tc := range testcases {
8722 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008723 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008724 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8725 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008726 })
8727 }
8728}
8729
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008730// TODO(jungjw): Move this to proptools
8731func intPtr(i int) *int {
8732 return &i
8733}
8734
8735func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008736 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008737 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008738 apex_set {
8739 name: "myapex",
8740 set: "myapex.apks",
8741 filename: "foo_v2.apex",
8742 overrides: ["foo"],
8743 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008744 `,
8745 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8746 variables.Platform_sdk_version = intPtr(30)
8747 }),
8748 android.FixtureModifyConfig(func(config android.Config) {
8749 config.Targets[android.Android] = []android.Target{
8750 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8751 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8752 }
8753 }),
8754 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008755
Spandan Das9d6e2092024-09-21 02:50:00 +00008756 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008757
8758 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008759 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008760 actual := extractedApex.Args["abis"]
8761 expected := "ARMEABI_V7A,ARM64_V8A"
8762 if actual != expected {
8763 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8764 }
8765 actual = extractedApex.Args["sdk-version"]
8766 expected = "30"
8767 if actual != expected {
8768 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8769 }
8770
Paul Duffin6717d882021-06-15 19:09:41 +01008771 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008772 a := m.Module().(*ApexSet)
8773 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008774 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008775 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8776 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8777 }
8778}
8779
Anton Hansson805e0a52022-11-25 14:06:46 +00008780func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008781 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008782 ctx := testApex(t, `
8783 apex_set {
8784 name: "myapex",
8785 set: "myapex.apks",
8786 filename: "foo_v2.apex",
8787 overrides: ["foo"],
8788 }
8789 `,
8790 android.FixtureModifyConfig(func(config android.Config) {
8791 config.Targets[android.Android] = []android.Target{
8792 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8793 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8794 }
8795 }),
8796 )
8797
Spandan Das9d6e2092024-09-21 02:50:00 +00008798 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008799
8800 // Check extract_apks tool parameters. No native bridge arch expected
8801 extractedApex := m.Output("extracted/myapex.apks")
8802 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8803}
8804
Jiyong Park7d95a512020-05-10 15:16:24 +09008805func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008806 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008807 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8808 apex {
8809 name: "myapex",
8810 key: "myapex.key",
8811 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008812 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008813 }
8814
8815 apex_key {
8816 name: "myapex.key",
8817 public_key: "testkey.avbpubkey",
8818 private_key: "testkey.pem",
8819 }
8820
8821 cc_library {
8822 name: "mylib",
8823 srcs: ["mylib.cpp"],
8824 static_libs: ["otherlib"],
8825 system_shared_libs: [],
8826 stl: "none",
8827 apex_available: [ "myapex" ],
8828 }
8829
8830 cc_library {
8831 name: "otherlib",
8832 srcs: ["mylib.cpp"],
8833 system_shared_libs: [],
8834 stl: "none",
8835 stubs: {
8836 versions: ["1", "2", "3"],
8837 },
8838 apex_available: [ "myapex" ],
8839 }
8840 `)
8841}
8842
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008843func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008844 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008845 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008846 apex {
8847 name: "myapex",
8848 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008849 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008850 custom_sign_tool: "sign_myapex",
8851 }
8852
8853 apex_key {
8854 name: "myapex.key",
8855 public_key: "testkey.avbpubkey",
8856 private_key: "testkey.pem",
8857 }
8858 `)
8859
Jooyung Han286957d2023-10-30 16:17:56 +09008860 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008861 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008862 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 +09008863}
8864
8865func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008866 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008867 ctx := testApex(t, `
8868 apex {
8869 name: "myapex",
8870 key: "myapex.key",
8871 updatable: false,
8872 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008873 }
8874
8875 apex_key {
8876 name: "myapex.key",
8877 public_key: "testkey.avbpubkey",
8878 private_key: "testkey.pem",
8879 }
8880
8881 prebuilt_apex {
8882 name: "myapex",
8883 prefer: true,
8884 arch: {
8885 arm64: {
8886 src: "myapex-arm64.apex",
8887 },
8888 arm: {
8889 src: "myapex-arm.apex",
8890 },
8891 },
8892 }
8893
8894 apex_set {
8895 name: "myapex_set",
8896 set: "myapex.apks",
8897 filename: "myapex_set.apex",
8898 overrides: ["myapex"],
8899 }
8900 `)
8901
Colin Crossf61d03d2023-11-02 16:56:39 -07008902 content := android.ContentFromFileRuleForTests(t, ctx,
8903 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008904 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 -07008905 content = android.ContentFromFileRuleForTests(t, ctx,
8906 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008907 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 +09008908}
8909
Jooyung Han938b5932020-06-20 12:47:47 +09008910func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008911 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008912 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008913 apex {
8914 name: "myapex",
8915 key: "myapex.key",
8916 apps: ["app"],
8917 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008918 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008919 }
8920
8921 apex_key {
8922 name: "myapex.key",
8923 public_key: "testkey.avbpubkey",
8924 private_key: "testkey.pem",
8925 }
8926
8927 android_app {
8928 name: "app",
8929 srcs: ["foo/bar/MyClass.java"],
8930 package_name: "foo",
8931 sdk_version: "none",
8932 system_modules: "none",
8933 apex_available: [ "myapex" ],
8934 }
8935 `, withFiles(map[string][]byte{
8936 "sub/Android.bp": []byte(`
8937 override_apex {
8938 name: "override_myapex",
8939 base: "myapex",
8940 apps: ["override_app"],
8941 allowed_files: ":allowed",
8942 }
8943 // Overridable "path" property should be referenced indirectly
8944 filegroup {
8945 name: "allowed",
8946 srcs: ["allowed.txt"],
8947 }
8948 override_android_app {
8949 name: "override_app",
8950 base: "app",
8951 package_name: "bar",
8952 }
8953 `),
8954 }))
8955
Jooyung Hana0503a52023-08-23 13:12:50 +09008956 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008957 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8958 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8959 }
8960
Spandan Das50801e22024-05-13 18:29:45 +00008961 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008962 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8963 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8964 }
8965}
8966
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008967func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008968 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008969 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008970 apex {
8971 name: "myapex",
8972 key: "myapex.key",
8973 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008974 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008975 }
8976
8977 apex_key {
8978 name: "myapex.key",
8979 public_key: "testkey.avbpubkey",
8980 private_key: "testkey.pem",
8981 }
8982
8983 cc_library {
8984 name: "mylib",
8985 srcs: ["mylib.cpp"],
8986 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008987 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008988 },
8989 apex_available: ["myapex"],
8990 }
8991
8992 cc_prebuilt_library_shared {
8993 name: "mylib",
8994 prefer: false,
8995 srcs: ["prebuilt.so"],
8996 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008997 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008998 },
8999 apex_available: ["myapex"],
9000 }
9001 `)
9002}
9003
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009004func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009005 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009006 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009007 apex {
9008 name: "myapex",
9009 key: "myapex.key",
9010 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009011 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009012 }
9013 apex_key {
9014 name: "myapex.key",
9015 public_key: "testkey.avbpubkey",
9016 private_key: "testkey.pem",
9017 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009018 `,
9019 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9020 variables.CompressedApex = proptools.BoolPtr(true)
9021 }),
9022 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009023
Jooyung Hana0503a52023-08-23 13:12:50 +09009024 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009025 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9026
Jooyung Hana0503a52023-08-23 13:12:50 +09009027 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009028 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9029
9030 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009031 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009032 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9033
9034 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009035 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009036 var builder strings.Builder
9037 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9038 androidMk := builder.String()
9039 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9040}
9041
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009042func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9043 t.Parallel()
9044 ctx := testApex(t, `
9045 apex {
9046 name: "myapex",
9047 key: "myapex.key",
9048 compressible: true,
9049 updatable: false,
9050 payload_fs_type: "erofs",
9051 }
9052 apex_key {
9053 name: "myapex.key",
9054 public_key: "testkey.avbpubkey",
9055 private_key: "testkey.pem",
9056 }
9057 `,
9058 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9059 variables.CompressedApex = proptools.BoolPtr(true)
9060 }),
9061 )
9062
9063 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9064 if compressRule.Rule != nil {
9065 t.Error("erofs apex should not be compressed")
9066 }
9067}
9068
Jooyung Han26ec8482024-07-31 15:04:05 +09009069func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009070 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009071 for _, compressionEnabled := range []bool{true, false} {
9072 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009073 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009074 ctx := testApex(t, `
9075 apex_set {
9076 name: "com.company.android.myapex",
9077 apex_name: "com.android.myapex",
9078 set: "company-myapex.apks",
9079 }
9080 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9081 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9082 }),
9083 )
9084
9085 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9086 if compressionEnabled {
9087 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9088 } else {
9089 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9090 }
9091 })
9092 }
9093}
9094
Martin Stjernholm2856c662020-12-02 15:03:42 +00009095func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009096 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009097 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009098 apex {
9099 name: "myapex",
9100 key: "myapex.key",
9101 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009102 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009103 }
9104
9105 apex_key {
9106 name: "myapex.key",
9107 public_key: "testkey.avbpubkey",
9108 private_key: "testkey.pem",
9109 }
9110
9111 cc_library {
9112 name: "mylib",
9113 srcs: ["mylib.cpp"],
9114 apex_available: ["myapex"],
9115 shared_libs: ["otherlib"],
9116 system_shared_libs: [],
9117 }
9118
9119 cc_library {
9120 name: "otherlib",
9121 srcs: ["mylib.cpp"],
9122 stubs: {
9123 versions: ["current"],
9124 },
9125 }
9126
9127 cc_prebuilt_library_shared {
9128 name: "otherlib",
9129 prefer: true,
9130 srcs: ["prebuilt.so"],
9131 stubs: {
9132 versions: ["current"],
9133 },
9134 }
9135 `)
9136
Jooyung Hana0503a52023-08-23 13:12:50 +09009137 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009138 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009139 var builder strings.Builder
9140 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9141 androidMk := builder.String()
9142
9143 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9144 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009145 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009146}
9147
Jiyong Parke3867542020-12-03 17:28:25 +09009148func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009149 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009150 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009151 apex {
9152 name: "myapex",
9153 key: "myapex.key",
9154 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009155 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009156 }
9157
9158 apex_key {
9159 name: "myapex.key",
9160 public_key: "testkey.avbpubkey",
9161 private_key: "testkey.pem",
9162 }
9163
9164 cc_library {
9165 name: "mylib",
9166 srcs: ["mylib.cpp"],
9167 system_shared_libs: [],
9168 stl: "none",
9169 apex_available: ["myapex"],
9170 shared_libs: ["mylib2"],
9171 target: {
9172 apex: {
9173 exclude_shared_libs: ["mylib2"],
9174 },
9175 },
9176 }
9177
9178 cc_library {
9179 name: "mylib2",
9180 srcs: ["mylib.cpp"],
9181 system_shared_libs: [],
9182 stl: "none",
9183 }
9184 `)
9185
9186 // Check if mylib is linked to mylib2 for the non-apex target
9187 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9188 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9189
9190 // Make sure that the link doesn't occur for the apex target
9191 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9192 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9193
9194 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009195 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009196 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9197}
9198
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009199func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009200 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009201 bpBase := `
9202 apex {
9203 name: "myapex",
9204 key: "myapex.key",
9205 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009206 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009207 }
9208 apex_key {
9209 name: "myapex.key",
9210 public_key: "testkey.avbpubkey",
9211 private_key: "testkey.pem",
9212 }
9213 cc_library {
9214 name: "mylib",
9215 srcs: ["mylib.cpp"],
9216 apex_available: ["myapex"],
9217 shared_libs: ["stublib"],
9218 system_shared_libs: [],
9219 }
9220 apex {
9221 name: "otherapex",
9222 enabled: %s,
9223 key: "myapex.key",
9224 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009225 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009226 }
9227 `
9228
9229 stublibSourceBp := `
9230 cc_library {
9231 name: "stublib",
9232 srcs: ["mylib.cpp"],
9233 apex_available: ["otherapex"],
9234 system_shared_libs: [],
9235 stl: "none",
9236 stubs: {
9237 versions: ["1"],
9238 },
9239 }
9240 `
9241
9242 stublibPrebuiltBp := `
9243 cc_prebuilt_library_shared {
9244 name: "stublib",
9245 srcs: ["prebuilt.so"],
9246 apex_available: ["otherapex"],
9247 stubs: {
9248 versions: ["1"],
9249 },
9250 %s
9251 }
9252 `
9253
9254 tests := []struct {
9255 name string
9256 stublibBp string
9257 usePrebuilt bool
9258 modNames []string // Modules to collect AndroidMkEntries for
9259 otherApexEnabled []string
9260 }{
9261 {
9262 name: "only_source",
9263 stublibBp: stublibSourceBp,
9264 usePrebuilt: false,
9265 modNames: []string{"stublib"},
9266 otherApexEnabled: []string{"true", "false"},
9267 },
9268 {
9269 name: "source_preferred",
9270 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9271 usePrebuilt: false,
9272 modNames: []string{"stublib", "prebuilt_stublib"},
9273 otherApexEnabled: []string{"true", "false"},
9274 },
9275 {
9276 name: "prebuilt_preferred",
9277 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9278 usePrebuilt: true,
9279 modNames: []string{"stublib", "prebuilt_stublib"},
9280 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9281 },
9282 {
9283 name: "only_prebuilt",
9284 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9285 usePrebuilt: true,
9286 modNames: []string{"stublib"},
9287 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9288 },
9289 }
9290
9291 for _, test := range tests {
9292 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009293 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009294 for _, otherApexEnabled := range test.otherApexEnabled {
9295 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009296 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009297 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009298
9299 type modAndMkEntries struct {
9300 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009301 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009302 }
9303 entries := []*modAndMkEntries{}
9304
9305 // Gather shared lib modules that are installable
9306 for _, modName := range test.modNames {
9307 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9308 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9309 continue
9310 }
9311 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009312 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009313 continue
9314 }
Yu Liue70976d2024-10-15 20:45:35 +00009315 info := android.AndroidMkInfoForTest(t, ctx, mod)
9316 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9317 ents = append(ents, info.ExtraInfo...)
9318 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009319 if ent.Disabled {
9320 continue
9321 }
9322 entries = append(entries, &modAndMkEntries{
9323 mod: mod,
9324 mkEntries: ent,
9325 })
9326 }
9327 }
9328 }
9329
9330 var entry *modAndMkEntries = nil
9331 for _, ent := range entries {
9332 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9333 if entry != nil {
9334 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9335 } else {
9336 entry = ent
9337 }
9338 }
9339 }
9340
9341 if entry == nil {
9342 t.Errorf("AndroidMk entry for \"stublib\" missing")
9343 } else {
9344 isPrebuilt := entry.mod.Prebuilt() != nil
9345 if isPrebuilt != test.usePrebuilt {
9346 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9347 }
9348 if !entry.mod.IsStubs() {
9349 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9350 }
9351 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9352 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9353 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009354 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009355 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009356 if !android.InList(expected, cflags) {
9357 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9358 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009359 }
9360 })
9361 }
9362 })
9363 }
9364}
9365
Colin Crossc33e5212021-05-25 18:16:02 -07009366func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009367 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009368 bp := `
9369 apex {
9370 name: "myapex",
9371 key: "myapex.key",
9372 java_libs: ["mylib"],
9373 bootclasspath_fragments: ["mybootclasspathfragment"],
9374 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9375 updatable: false,
9376 }
9377
9378 apex_key {
9379 name: "myapex.key",
9380 public_key: "testkey.avbpubkey",
9381 private_key: "testkey.pem",
9382 }
9383
9384 java_library {
9385 name: "mylib",
9386 srcs: ["mylib.java"],
9387 apex_available: ["myapex"],
9388 compile_dex: true,
9389 }
9390
9391 bootclasspath_fragment {
9392 name: "mybootclasspathfragment",
9393 contents: ["mybootclasspathlib"],
9394 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009395 hidden_api: {
9396 split_packages: ["*"],
9397 },
Colin Crossc33e5212021-05-25 18:16:02 -07009398 }
9399
9400 java_library {
9401 name: "mybootclasspathlib",
9402 srcs: ["mybootclasspathlib.java"],
9403 apex_available: ["myapex"],
9404 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009405 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009406 }
9407
9408 systemserverclasspath_fragment {
9409 name: "mysystemserverclasspathfragment",
9410 contents: ["mysystemserverclasspathlib"],
9411 apex_available: ["myapex"],
9412 }
9413
9414 java_library {
9415 name: "mysystemserverclasspathlib",
9416 srcs: ["mysystemserverclasspathlib.java"],
9417 apex_available: ["myapex"],
9418 compile_dex: true,
9419 }
9420 `
9421
9422 result := android.GroupFixturePreparers(
9423 PrepareForTestWithApexBuildComponents,
9424 prepareForTestWithMyapex,
9425 java.PrepareForTestWithJavaDefaultModules,
9426 android.PrepareForTestWithAndroidBuildComponents,
9427 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009428 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9429 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009430 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009431 ).RunTest(t)
9432
9433 // Make sure jacoco ran on both mylib and mybootclasspathlib
9434 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9435 t.Errorf("Failed to find jacoco rule for mylib")
9436 }
9437 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9438 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9439 }
9440 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9441 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9442 }
9443}
9444
Jiyong Park192600a2021-08-03 07:52:17 +00009445func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009446 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009447 testApexError(t, `executable mybin is static`, `
9448 apex {
9449 name: "myapex",
9450 key: "myapex.key",
9451 binaries: ["mybin"],
9452 min_sdk_version: "29",
9453 }
9454
9455 apex_key {
9456 name: "myapex.key",
9457 public_key: "testkey.avbpubkey",
9458 private_key: "testkey.pem",
9459 }
9460
9461 cc_binary {
9462 name: "mybin",
9463 srcs: ["mylib.cpp"],
9464 relative_install_path: "foo/bar",
9465 static_executable: true,
9466 system_shared_libs: [],
9467 stl: "none",
9468 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009469 min_sdk_version: "29",
9470 }
9471 `)
9472
9473 testApexError(t, `executable mybin.rust is static`, `
9474 apex {
9475 name: "myapex",
9476 key: "myapex.key",
9477 binaries: ["mybin.rust"],
9478 min_sdk_version: "29",
9479 }
9480
9481 apex_key {
9482 name: "myapex.key",
9483 public_key: "testkey.avbpubkey",
9484 private_key: "testkey.pem",
9485 }
9486
9487 rust_binary {
9488 name: "mybin.rust",
9489 srcs: ["foo.rs"],
9490 static_executable: true,
9491 apex_available: ["myapex"],
9492 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009493 }
9494 `)
9495}
9496
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009497func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009498 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009499 ctx := testApex(t, `
9500 apex {
9501 name: "myapex",
9502 key: "myapex.key",
9503 updatable: false,
9504 java_libs: ["foo"],
9505 }
9506
9507 apex_key {
9508 name: "myapex.key",
9509 public_key: "testkey.avbpubkey",
9510 private_key: "testkey.pem",
9511 }
9512
9513 java_library {
9514 name: "foo",
9515 srcs: ["foo.java"],
9516 apex_available: ["myapex"],
9517 installable: true,
9518 }
9519 `,
9520 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9521 )
9522
Jooyung Hana0503a52023-08-23 13:12:50 +09009523 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009524 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9525 var builder strings.Builder
9526 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9527 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009528 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 +00009529}
9530
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009531func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009532 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009533 ctx := testApex(t, `
9534 apex {
9535 name: "myapex",
9536 key: "myapex.key",
9537 updatable: false,
9538 java_libs: ["foo"],
9539 required: ["otherapex"],
9540 }
9541
9542 apex {
9543 name: "otherapex",
9544 key: "myapex.key",
9545 updatable: false,
9546 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009547 }
9548
9549 apex_key {
9550 name: "myapex.key",
9551 public_key: "testkey.avbpubkey",
9552 private_key: "testkey.pem",
9553 }
9554
9555 java_library {
9556 name: "foo",
9557 srcs: ["foo.java"],
9558 apex_available: ["myapex", "otherapex"],
9559 installable: true,
9560 }
9561 `)
9562
Jooyung Hana0503a52023-08-23 13:12:50 +09009563 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009564 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9565 var builder strings.Builder
9566 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9567 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009568 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009569}
9570
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009571func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009572 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009573 ctx := testApex(t, `
9574 apex {
9575 name: "myapex",
9576 key: "myapex.key",
9577 updatable: false,
9578 }
9579
9580 apex_key {
9581 name: "myapex.key",
9582 public_key: "testkey.avbpubkey",
9583 private_key: "testkey.pem",
9584 }
9585 `)
9586
Jooyung Hana0503a52023-08-23 13:12:50 +09009587 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009588 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009589 data := android.AndroidMkDataForTest(t, ctx, bundle)
9590 var builder strings.Builder
9591 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9592 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009593 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009594}
9595
Jooyung Hana6d36672022-02-24 13:58:07 +09009596func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009597 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009598 for _, tc := range []struct {
9599 name string
9600 ref string
9601 expected_data []string
9602 }{
9603 {
9604 name: "test_using_output",
9605 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009606 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009607 },
9608 {
9609 name: "test_using_apex",
9610 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009611 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009612 },
9613 } {
9614 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009615 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009616 ctx := testApex(t, `
9617 apex {
9618 name: "myapex",
9619 key: "myapex.key",
9620 compressible: true,
9621 updatable: false,
9622 }
9623
9624 apex_key {
9625 name: "myapex.key",
9626 public_key: "testkey.avbpubkey",
9627 private_key: "testkey.pem",
9628 }
9629
9630 java_test {
9631 name: "`+tc.name+`",
9632 srcs: ["a.java"],
9633 data: ["`+tc.ref+`"],
9634 }
9635 `,
9636 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9637 variables.CompressedApex = proptools.BoolPtr(true)
9638 }))
9639 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9640 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9641 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9642 })
9643 }
9644}
9645
satayev758968a2021-12-06 11:42:40 +00009646func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009647 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009648 preparer := android.GroupFixturePreparers(
9649 PrepareForTestWithApexBuildComponents,
9650 prepareForTestWithMyapex,
9651 java.PrepareForTestWithJavaSdkLibraryFiles,
9652 java.PrepareForTestWithJavaDefaultModules,
9653 android.PrepareForTestWithAndroidBuildComponents,
9654 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9655 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9656 )
9657
9658 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9659 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009660 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009661 preparer.RunTestWithBp(t, `
9662 apex {
9663 name: "myapex",
9664 key: "myapex.key",
9665 bootclasspath_fragments: ["mybootclasspathfragment"],
9666 min_sdk_version: "30",
9667 updatable: false,
9668 }
9669
9670 apex_key {
9671 name: "myapex.key",
9672 public_key: "testkey.avbpubkey",
9673 private_key: "testkey.pem",
9674 }
9675
9676 bootclasspath_fragment {
9677 name: "mybootclasspathfragment",
9678 contents: ["mybootclasspathlib"],
9679 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009680 hidden_api: {
9681 split_packages: ["*"],
9682 },
satayev758968a2021-12-06 11:42:40 +00009683 }
9684
9685 java_sdk_library {
9686 name: "mybootclasspathlib",
9687 srcs: ["mybootclasspathlib.java"],
9688 apex_available: ["myapex"],
9689 compile_dex: true,
9690 unsafe_ignore_missing_latest_api: true,
9691 min_sdk_version: "31",
9692 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009693 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009694 }
9695
9696 java_library {
9697 name: "util",
9698 srcs: ["a.java"],
9699 apex_available: ["myapex"],
9700 min_sdk_version: "31",
9701 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009702 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009703 }
9704
9705 java_library {
9706 name: "another_util",
9707 srcs: ["a.java"],
9708 min_sdk_version: "31",
9709 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009710 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009711 }
9712 `)
9713 })
9714
9715 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9716 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009717 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009718 preparer.RunTestWithBp(t, `
9719 apex {
9720 name: "myapex",
9721 key: "myapex.key",
9722 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9723 min_sdk_version: "30",
9724 updatable: false,
9725 }
9726
9727 apex_key {
9728 name: "myapex.key",
9729 public_key: "testkey.avbpubkey",
9730 private_key: "testkey.pem",
9731 }
9732
9733 systemserverclasspath_fragment {
9734 name: "mysystemserverclasspathfragment",
9735 contents: ["mysystemserverclasspathlib"],
9736 apex_available: ["myapex"],
9737 }
9738
9739 java_sdk_library {
9740 name: "mysystemserverclasspathlib",
9741 srcs: ["mysystemserverclasspathlib.java"],
9742 apex_available: ["myapex"],
9743 compile_dex: true,
9744 min_sdk_version: "32",
9745 unsafe_ignore_missing_latest_api: true,
9746 static_libs: ["util"],
9747 }
9748
9749 java_library {
9750 name: "util",
9751 srcs: ["a.java"],
9752 apex_available: ["myapex"],
9753 min_sdk_version: "31",
9754 static_libs: ["another_util"],
9755 }
9756
9757 java_library {
9758 name: "another_util",
9759 srcs: ["a.java"],
9760 min_sdk_version: "31",
9761 apex_available: ["myapex"],
9762 }
9763 `)
9764 })
9765
9766 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009767 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009768 preparer.
satayev758968a2021-12-06 11:42:40 +00009769 RunTestWithBp(t, `
9770 apex {
9771 name: "myapex",
9772 key: "myapex.key",
9773 bootclasspath_fragments: ["mybootclasspathfragment"],
9774 min_sdk_version: "30",
9775 updatable: false,
9776 }
9777
9778 apex_key {
9779 name: "myapex.key",
9780 public_key: "testkey.avbpubkey",
9781 private_key: "testkey.pem",
9782 }
9783
9784 bootclasspath_fragment {
9785 name: "mybootclasspathfragment",
9786 contents: ["mybootclasspathlib"],
9787 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009788 hidden_api: {
9789 split_packages: ["*"],
9790 },
satayev758968a2021-12-06 11:42:40 +00009791 }
9792
9793 java_sdk_library {
9794 name: "mybootclasspathlib",
9795 srcs: ["mybootclasspathlib.java"],
9796 apex_available: ["myapex"],
9797 compile_dex: true,
9798 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009799 sdk_version: "current",
9800 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009801 }
9802 `)
9803 })
9804
9805 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009806 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009807 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9808 RunTestWithBp(t, `
9809 apex {
9810 name: "myapex",
9811 key: "myapex.key",
9812 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9813 min_sdk_version: "30",
9814 updatable: false,
9815 }
9816
9817 apex_key {
9818 name: "myapex.key",
9819 public_key: "testkey.avbpubkey",
9820 private_key: "testkey.pem",
9821 }
9822
9823 systemserverclasspath_fragment {
9824 name: "mysystemserverclasspathfragment",
9825 contents: ["mysystemserverclasspathlib"],
9826 apex_available: ["myapex"],
9827 }
9828
9829 java_sdk_library {
9830 name: "mysystemserverclasspathlib",
9831 srcs: ["mysystemserverclasspathlib.java"],
9832 apex_available: ["myapex"],
9833 compile_dex: true,
9834 unsafe_ignore_missing_latest_api: true,
9835 }
9836 `)
9837 })
9838}
9839
Jiakai Zhang6decef92022-01-12 17:56:19 +00009840// Verifies that the APEX depends on all the Make modules in the list.
9841func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9842 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9843 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009844 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009845 }
9846}
9847
9848// Verifies that the APEX does not depend on any of the Make modules in the list.
9849func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9850 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9851 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009852 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009853 }
9854}
9855
Cole Faust24e25c02024-01-19 14:12:17 -08009856func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009857 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009858 bpTemplate := `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 java_libs: ["myjavalib"],
9863 updatable: %v,
9864 min_sdk_version: "29",
9865 }
9866 apex_key {
9867 name: "myapex.key",
9868 }
9869 java_library {
9870 name: "myjavalib",
9871 srcs: ["MyClass.java"],
9872 apex_available: [ "myapex" ],
9873 lint: {
9874 strict_updatability_linting: %v,
9875 %s
9876 },
9877 sdk_version: "current",
9878 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009879 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009880 }
9881 `
9882 fs := android.MockFS{
9883 "lint-baseline.xml": nil,
9884 }
9885
9886 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009887 testCaseName string
9888 apexUpdatable bool
9889 javaStrictUpdtabilityLint bool
9890 lintFileExists bool
9891 disallowedFlagExpectedOnApex bool
9892 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009893 }{
9894 {
Colin Cross87427352024-09-25 15:41:19 -07009895 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9896 apexUpdatable: true,
9897 javaStrictUpdtabilityLint: true,
9898 lintFileExists: false,
9899 disallowedFlagExpectedOnApex: false,
9900 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009901 },
9902 {
Colin Cross87427352024-09-25 15:41:19 -07009903 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9904 apexUpdatable: false,
9905 javaStrictUpdtabilityLint: false,
9906 lintFileExists: true,
9907 disallowedFlagExpectedOnApex: false,
9908 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009909 },
9910 {
Colin Cross87427352024-09-25 15:41:19 -07009911 testCaseName: "non-updatable apex respects strict updatability of javalib",
9912 apexUpdatable: false,
9913 javaStrictUpdtabilityLint: true,
9914 lintFileExists: true,
9915 disallowedFlagExpectedOnApex: false,
9916 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009917 },
9918 {
Colin Cross87427352024-09-25 15:41:19 -07009919 testCaseName: "updatable apex checks strict updatability of javalib",
9920 apexUpdatable: true,
9921 javaStrictUpdtabilityLint: false,
9922 lintFileExists: true,
9923 disallowedFlagExpectedOnApex: true,
9924 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009925 },
9926 }
9927
9928 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009929 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009930 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009931 fixtures := []android.FixturePreparer{}
9932 baselineProperty := ""
9933 if testCase.lintFileExists {
9934 fixtures = append(fixtures, fs.AddToFixture())
9935 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9936 }
9937 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009938
Colin Cross87427352024-09-25 15:41:19 -07009939 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009940
Colin Cross87427352024-09-25 15:41:19 -07009941 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9942 if expectStrictUpdatability {
9943 if m.Rule == nil {
9944 t.Errorf("expected strict updatability check rule on %s", name)
9945 } else {
9946 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9947 m.RuleParams.Command, "--disallowed_issues NewApi")
9948 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9949 m.Inputs.Strings(), "lint-baseline.xml")
9950 }
9951 } else {
9952 if m.Rule != nil {
9953 t.Errorf("expected no strict updatability check rule on %s", name)
9954 }
9955 }
9956 }
9957
9958 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9959 apex := result.ModuleForTests("myapex", "android_common_myapex")
9960 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9961 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9962
9963 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9964 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9965 })
Cole Faust24e25c02024-01-19 14:12:17 -08009966 }
9967}
9968
Cole Faust24e25c02024-01-19 14:12:17 -08009969// checks transtive deps of an apex coming from bootclasspath_fragment
9970func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009971 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009972 bp := `
9973 apex {
9974 name: "myapex",
9975 key: "myapex.key",
9976 bootclasspath_fragments: ["mybootclasspathfragment"],
9977 updatable: true,
9978 min_sdk_version: "29",
9979 }
9980 apex_key {
9981 name: "myapex.key",
9982 }
9983 bootclasspath_fragment {
9984 name: "mybootclasspathfragment",
9985 contents: ["myjavalib"],
9986 apex_available: ["myapex"],
9987 hidden_api: {
9988 split_packages: ["*"],
9989 },
9990 }
9991 java_library {
9992 name: "myjavalib",
9993 srcs: ["MyClass.java"],
9994 apex_available: [ "myapex" ],
9995 sdk_version: "current",
9996 min_sdk_version: "29",
9997 compile_dex: true,
9998 lint: {
9999 baseline_filename: "lint-baseline.xml",
10000 }
10001 }
10002 `
10003 fs := android.MockFS{
10004 "lint-baseline.xml": nil,
10005 }
10006
10007 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010008 apex := result.ModuleForTests("myapex", "android_common_myapex")
10009 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10010 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10011 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10012 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10013 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010014}
Spandan Das66773252022-01-15 00:23:18 +000010015
Jihoon Kang784c0052024-06-25 22:15:39 +000010016func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010017 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010018 bp := `
10019 apex {
10020 name: "myapex",
10021 key: "myapex.key",
10022 bootclasspath_fragments: ["mybootclasspathfragment"],
10023 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010024 java_libs: [
10025 "jacocoagent",
10026 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010027 }
10028 apex_key {
10029 name: "myapex.key",
10030 }
10031 bootclasspath_fragment {
10032 name: "mybootclasspathfragment",
10033 contents: ["foo"],
10034 apex_available: ["myapex"],
10035 hidden_api: {
10036 split_packages: ["*"],
10037 },
10038 }
10039 java_sdk_library {
10040 name: "foo",
10041 srcs: ["MyClass.java"],
10042 apex_available: [ "myapex" ],
10043 sdk_version: "current",
10044 min_sdk_version: "29",
10045 compile_dex: true,
10046 }
10047 `
10048 fs := android.MockFS{
10049 "lint-baseline.xml": nil,
10050 }
10051
10052 result := android.GroupFixturePreparers(
10053 prepareForApexTest,
10054 java.PrepareForTestWithJavaSdkLibraryFiles,
10055 java.PrepareForTestWithJacocoInstrumentation,
10056 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010057 android.FixtureMergeMockFs(fs),
10058 ).RunTestWithBp(t, bp)
10059
10060 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10061 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10062 android.AssertStringDoesContain(t,
10063 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10064 lintReportInputs, "foo.impl")
10065}
10066
Spandan Das42e89502022-05-06 22:12:55 +000010067// updatable apexes should propagate updatable=true to its apps
10068func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010069 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010070 bp := `
10071 apex {
10072 name: "myapex",
10073 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010074 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010075 apps: [
10076 "myapp",
10077 ],
10078 min_sdk_version: "30",
10079 }
10080 apex_key {
10081 name: "myapex.key",
10082 }
10083 android_app {
10084 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010085 apex_available: [
10086 "myapex",
10087 ],
10088 sdk_version: "current",
10089 min_sdk_version: "30",
10090 }
10091 `
Colin Cross99939e92024-10-01 16:02:46 -070010092 _ = android.GroupFixturePreparers(
10093 prepareForApexTest,
10094 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10095 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010096}
10097
Jingwen Chendea7a642023-03-28 11:30:50 +000010098func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010099 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010100 ctx := testApex(t, `
10101 apex {
10102 name: "myapex",
10103 key: "myapex.key",
10104 updatable: false,
10105 }
10106
10107 apex_key {
10108 name: "myapex.key",
10109 public_key: "testkey.avbpubkey",
10110 private_key: "testkey.pem",
10111 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010112 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010113 generateFsRule := mod.Rule("generateFsConfig")
10114 cmd := generateFsRule.RuleParams.Command
10115
10116 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10117}
10118
10119func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010120 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010121 ctx := testApex(t, `
10122 apex {
10123 name: "myapex",
10124 key: "myapex.key",
10125 canned_fs_config: "my_config",
10126 updatable: false,
10127 }
10128
10129 apex_key {
10130 name: "myapex.key",
10131 public_key: "testkey.avbpubkey",
10132 private_key: "testkey.pem",
10133 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010134 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010135 generateFsRule := mod.Rule("generateFsConfig")
10136 cmd := generateFsRule.RuleParams.Command
10137
10138 // Ensure that canned_fs_config has "cat my_config" at the end
10139 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10140}
Spandan Das20fce2d2023-04-12 17:21:39 +000010141
10142func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010143 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010144 testCases := []struct {
10145 desc string
10146 hasStubs bool
10147 apexAvailable string
10148 expectedError string
10149 }{
10150 {
10151 desc: "non-stub library can have multiple apex_available",
10152 hasStubs: false,
10153 apexAvailable: `["myapex", "otherapex"]`,
10154 },
10155 {
10156 desc: "stub library should not be available to anyapex",
10157 hasStubs: true,
10158 apexAvailable: `["//apex_available:anyapex"]`,
10159 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10160 },
10161 {
10162 desc: "stub library should not be available to multiple apexes",
10163 hasStubs: true,
10164 apexAvailable: `["myapex", "otherapex"]`,
10165 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10166 },
10167 {
10168 desc: "stub library can be available to a core apex and a test apex",
10169 hasStubs: true,
10170 apexAvailable: `["myapex", "test_myapex"]`,
10171 },
10172 }
10173 bpTemplate := `
10174 cc_library {
10175 name: "libfoo",
10176 %v
10177 apex_available: %v,
10178 }
10179 apex {
10180 name: "myapex",
10181 key: "apex.key",
10182 updatable: false,
10183 native_shared_libs: ["libfoo"],
10184 }
10185 apex {
10186 name: "otherapex",
10187 key: "apex.key",
10188 updatable: false,
10189 }
10190 apex_test {
10191 name: "test_myapex",
10192 key: "apex.key",
10193 updatable: false,
10194 native_shared_libs: ["libfoo"],
10195 }
10196 apex_key {
10197 name: "apex.key",
10198 }
10199 `
10200 for _, tc := range testCases {
10201 stubs := ""
10202 if tc.hasStubs {
10203 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10204 }
10205 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10206 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10207 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10208 })
10209 if tc.expectedError == "" {
10210 testApex(t, bp, mockFsFixturePreparer)
10211 } else {
10212 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10213 }
10214 }
10215}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010216
10217func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010218 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010219 context := android.GroupFixturePreparers(
10220 android.PrepareForIntegrationTestWithAndroid,
10221 cc.PrepareForIntegrationTestWithCc,
10222 PrepareForTestWithApexBuildComponents,
10223 prepareForTestWithMyapex,
10224 filesystem.PrepareForTestWithFilesystemBuildComponents,
10225 )
10226 result := context.RunTestWithBp(t, `
10227 android_system_image {
10228 name: "myfilesystem",
10229 deps: [
10230 "libfoo",
10231 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010232 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010233 gen_linker_config: true,
10234 linker_config_srcs: ["linker.config.json"],
10235 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010236 }
10237
10238 cc_library {
10239 name: "libfoo",
10240 shared_libs: [
10241 "libbar",
10242 ],
10243 stl: "none",
10244 }
10245
10246 cc_library {
10247 name: "libbar",
10248 stl: "none",
10249 apex_available: ["myapex"],
10250 }
10251
10252 apex {
10253 name: "myapex",
10254 native_shared_libs: ["libbar"],
10255 key: "myapex.key",
10256 updatable: false,
10257 }
10258
10259 apex_key {
10260 name: "myapex.key",
10261 public_key: "testkey.avbpubkey",
10262 private_key: "testkey.pem",
10263 }
10264 `)
10265
Cole Faust3b806d32024-03-11 15:15:03 -070010266 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010267 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10268 inputs.Strings(),
10269 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10270}
Yu Liueae7b362023-11-16 17:05:47 -080010271
10272var apex_default_bp = `
10273 apex_key {
10274 name: "myapex.key",
10275 public_key: "testkey.avbpubkey",
10276 private_key: "testkey.pem",
10277 }
10278
10279 filegroup {
10280 name: "myapex.manifest",
10281 srcs: ["apex_manifest.json"],
10282 }
10283
10284 filegroup {
10285 name: "myapex.androidmanifest",
10286 srcs: ["AndroidManifest.xml"],
10287 }
10288`
10289
10290func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010291 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010292 ctx := testApex(t, apex_default_bp+`
10293 apex {
10294 name: "myapex",
10295 manifest: ":myapex.manifest",
10296 androidManifest: ":myapex.androidmanifest",
10297 key: "myapex.key",
10298 java_libs: [
10299 "my_java_library_foo",
10300 "my_java_library_bar",
10301 ],
10302 updatable: false,
10303 }
10304
10305 java_library {
10306 name: "my_java_library_foo",
10307 srcs: ["foo/bar/MyClass.java"],
10308 sdk_version: "none",
10309 system_modules: "none",
10310 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010311 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010312 "myapex",
10313 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010314 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010315 }
10316
10317 java_library {
10318 name: "my_java_library_bar",
10319 srcs: ["foo/bar/MyClass.java"],
10320 sdk_version: "none",
10321 system_modules: "none",
10322 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010323 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010324 "myapex",
10325 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010326 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010327 }
10328
10329 aconfig_declarations {
10330 name: "my_aconfig_declarations_foo",
10331 package: "com.example.package",
10332 container: "myapex",
10333 srcs: ["foo.aconfig"],
10334 }
10335
10336 java_aconfig_library {
10337 name: "my_java_aconfig_library_foo",
10338 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010339 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010340 "myapex",
10341 ],
10342 }
10343
10344 aconfig_declarations {
10345 name: "my_aconfig_declarations_bar",
10346 package: "com.example.package",
10347 container: "myapex",
10348 srcs: ["bar.aconfig"],
10349 }
10350
10351 java_aconfig_library {
10352 name: "my_java_aconfig_library_bar",
10353 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010354 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010355 "myapex",
10356 ],
10357 }
10358 `)
10359
10360 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10361 s := mod.Rule("apexRule").Args["copy_commands"]
10362 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010363 if len(copyCmds) != 14 {
10364 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010365 }
10366
Jooyung Hana3fddf42024-09-03 13:22:21 +090010367 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10368 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10369 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10370 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010371 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010372
Yu Liubba555e2024-02-17 00:36:42 +000010373 inputs := []string{
10374 "my_aconfig_declarations_foo/intermediate.pb",
10375 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010376 }
Yu Liubba555e2024-02-17 00:36:42 +000010377 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10378 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10379 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10380 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010381 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010382}
10383
10384func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010385 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010386 ctx := testApex(t, apex_default_bp+`
10387 apex {
10388 name: "myapex",
10389 manifest: ":myapex.manifest",
10390 androidManifest: ":myapex.androidmanifest",
10391 key: "myapex.key",
10392 java_libs: [
10393 "my_java_library_foo",
10394 ],
10395 native_shared_libs: [
10396 "my_cc_library_bar",
10397 ],
10398 binaries: [
10399 "my_cc_binary_baz",
10400 ],
10401 updatable: false,
10402 }
10403
10404 java_library {
10405 name: "my_java_library_foo",
10406 srcs: ["foo/bar/MyClass.java"],
10407 sdk_version: "none",
10408 system_modules: "none",
10409 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010410 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010411 "myapex",
10412 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010413 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010414 }
10415
10416 cc_library {
10417 name: "my_cc_library_bar",
10418 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010419 static_libs: [
10420 "my_cc_aconfig_library_bar",
10421 "my_cc_aconfig_library_baz",
10422 ],
Yu Liueae7b362023-11-16 17:05:47 -080010423 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010424 "myapex",
10425 ],
10426 }
10427
10428 cc_binary {
10429 name: "my_cc_binary_baz",
10430 srcs: ["foo/bar/MyClass.cc"],
10431 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010432 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010433 "myapex",
10434 ],
10435 }
10436
10437 aconfig_declarations {
10438 name: "my_aconfig_declarations_foo",
10439 package: "com.example.package",
10440 container: "myapex",
10441 srcs: ["foo.aconfig"],
10442 }
10443
10444 java_aconfig_library {
10445 name: "my_java_aconfig_library_foo",
10446 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010447 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010448 "myapex",
10449 ],
10450 }
10451
10452 aconfig_declarations {
10453 name: "my_aconfig_declarations_bar",
10454 package: "com.example.package",
10455 container: "myapex",
10456 srcs: ["bar.aconfig"],
10457 }
10458
10459 cc_aconfig_library {
10460 name: "my_cc_aconfig_library_bar",
10461 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010462 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010463 "myapex",
10464 ],
10465 }
10466
10467 aconfig_declarations {
10468 name: "my_aconfig_declarations_baz",
10469 package: "com.example.package",
10470 container: "myapex",
10471 srcs: ["baz.aconfig"],
10472 }
10473
10474 cc_aconfig_library {
10475 name: "my_cc_aconfig_library_baz",
10476 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010477 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010478 "myapex",
10479 ],
10480 }
10481
10482 cc_library {
10483 name: "server_configurable_flags",
10484 srcs: ["server_configurable_flags.cc"],
10485 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010486 cc_library {
10487 name: "libbase",
10488 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010489 apex_available: [
10490 "myapex",
10491 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010492 }
10493 cc_library {
10494 name: "libaconfig_storage_read_api_cc",
10495 srcs: ["libaconfig_storage_read_api_cc.cc"],
10496 }
Yu Liueae7b362023-11-16 17:05:47 -080010497 `)
10498
10499 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10500 s := mod.Rule("apexRule").Args["copy_commands"]
10501 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010502 if len(copyCmds) != 18 {
10503 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010504 }
10505
Jooyung Hana3fddf42024-09-03 13:22:21 +090010506 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10507 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10508 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10509 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010510 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010511
Yu Liubba555e2024-02-17 00:36:42 +000010512 inputs := []string{
10513 "my_aconfig_declarations_foo/intermediate.pb",
10514 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10515 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010516 }
Yu Liubba555e2024-02-17 00:36:42 +000010517 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10518 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10519 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10520 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010521 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010522}
10523
Yu Liucec0e412023-11-30 16:45:50 -080010524func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010525 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010526 ctx := testApex(t, apex_default_bp+`
10527 apex {
10528 name: "myapex",
10529 manifest: ":myapex.manifest",
10530 androidManifest: ":myapex.androidmanifest",
10531 key: "myapex.key",
10532 native_shared_libs: [
10533 "libmy_rust_library",
10534 ],
10535 binaries: [
10536 "my_rust_binary",
10537 ],
10538 rust_dyn_libs: [
10539 "libmy_rust_dylib",
10540 ],
10541 updatable: false,
10542 }
10543
10544 rust_library {
10545 name: "libflags_rust", // test mock
10546 crate_name: "flags_rust",
10547 srcs: ["lib.rs"],
10548 apex_available: [
10549 "myapex",
10550 ],
10551 }
10552
10553 rust_library {
10554 name: "liblazy_static", // test mock
10555 crate_name: "lazy_static",
10556 srcs: ["src/lib.rs"],
10557 apex_available: [
10558 "myapex",
10559 ],
10560 }
10561
Ted Bauer02d475c2024-03-27 20:56:26 +000010562 rust_library {
10563 name: "libaconfig_storage_read_api", // test mock
10564 crate_name: "aconfig_storage_read_api",
10565 srcs: ["src/lib.rs"],
10566 apex_available: [
10567 "myapex",
10568 ],
10569 }
10570
Ted Bauer6ef40db2024-03-29 14:04:10 +000010571 rust_library {
10572 name: "liblogger", // test mock
10573 crate_name: "logger",
10574 srcs: ["src/lib.rs"],
10575 apex_available: [
10576 "myapex",
10577 ],
10578 }
10579
10580 rust_library {
10581 name: "liblog_rust", // test mock
10582 crate_name: "log_rust",
10583 srcs: ["src/lib.rs"],
10584 apex_available: [
10585 "myapex",
10586 ],
10587 }
10588
Yu Liucec0e412023-11-30 16:45:50 -080010589 rust_ffi_shared {
10590 name: "libmy_rust_library",
10591 srcs: ["src/lib.rs"],
10592 rustlibs: ["libmy_rust_aconfig_library_foo"],
10593 crate_name: "my_rust_library",
10594 apex_available: [
10595 "myapex",
10596 ],
10597 }
10598
10599 rust_library_dylib {
10600 name: "libmy_rust_dylib",
10601 srcs: ["foo/bar/MyClass.rs"],
10602 rustlibs: ["libmy_rust_aconfig_library_bar"],
10603 crate_name: "my_rust_dylib",
10604 apex_available: [
10605 "myapex",
10606 ],
10607 }
10608
10609 rust_binary {
10610 name: "my_rust_binary",
10611 srcs: ["foo/bar/MyClass.rs"],
10612 rustlibs: [
10613 "libmy_rust_aconfig_library_baz",
10614 "libmy_rust_dylib",
10615 ],
10616 apex_available: [
10617 "myapex",
10618 ],
10619 }
10620
10621 aconfig_declarations {
10622 name: "my_aconfig_declarations_foo",
10623 package: "com.example.package",
10624 container: "myapex",
10625 srcs: ["foo.aconfig"],
10626 }
10627
10628 aconfig_declarations {
10629 name: "my_aconfig_declarations_bar",
10630 package: "com.example.package",
10631 container: "myapex",
10632 srcs: ["bar.aconfig"],
10633 }
10634
10635 aconfig_declarations {
10636 name: "my_aconfig_declarations_baz",
10637 package: "com.example.package",
10638 container: "myapex",
10639 srcs: ["baz.aconfig"],
10640 }
10641
10642 rust_aconfig_library {
10643 name: "libmy_rust_aconfig_library_foo",
10644 aconfig_declarations: "my_aconfig_declarations_foo",
10645 crate_name: "my_rust_aconfig_library_foo",
10646 apex_available: [
10647 "myapex",
10648 ],
10649 }
10650
10651 rust_aconfig_library {
10652 name: "libmy_rust_aconfig_library_bar",
10653 aconfig_declarations: "my_aconfig_declarations_bar",
10654 crate_name: "my_rust_aconfig_library_bar",
10655 apex_available: [
10656 "myapex",
10657 ],
10658 }
10659
10660 rust_aconfig_library {
10661 name: "libmy_rust_aconfig_library_baz",
10662 aconfig_declarations: "my_aconfig_declarations_baz",
10663 crate_name: "my_rust_aconfig_library_baz",
10664 apex_available: [
10665 "myapex",
10666 ],
10667 }
10668 `)
10669
10670 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10671 s := mod.Rule("apexRule").Args["copy_commands"]
10672 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010673 if len(copyCmds) != 38 {
10674 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010675 }
10676
Jooyung Hana3fddf42024-09-03 13:22:21 +090010677 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10678 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10679 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10680 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010681 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010682
Yu Liubba555e2024-02-17 00:36:42 +000010683 inputs := []string{
10684 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010685 "my_aconfig_declarations_bar/intermediate.pb",
10686 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010687 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10688 }
10689 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10690 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10691 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10692 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010693 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010694}
10695
10696func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10697 aconfigRule := mod.Description(desc)
10698 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010699 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010700 if len(aconfigArgs) != len(inputs) {
10701 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010702 }
Yu Liucec0e412023-11-30 16:45:50 -080010703
Yu Liubba555e2024-02-17 00:36:42 +000010704 ensureEquals(t, container, aconfigRule.Args["container"])
10705 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10706
10707 buildParams := aconfigRule.BuildParams
10708 for _, input := range inputs {
10709 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10710 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010711 }
Yu Liubba555e2024-02-17 00:36:42 +000010712
10713 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010714}
10715
Yu Liueae7b362023-11-16 17:05:47 -080010716func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010717 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010718 ctx := testApex(t, apex_default_bp+`
10719 apex {
10720 name: "myapex",
10721 manifest: ":myapex.manifest",
10722 androidManifest: ":myapex.androidmanifest",
10723 key: "myapex.key",
10724 java_libs: [
10725 "my_java_library_foo",
10726 "other_java_library_bar",
10727 ],
10728 updatable: false,
10729 }
10730
10731 java_library {
10732 name: "my_java_library_foo",
10733 srcs: ["foo/bar/MyClass.java"],
10734 sdk_version: "none",
10735 system_modules: "none",
10736 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010737 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010738 "myapex",
10739 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010740 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010741 }
10742
10743 java_library {
10744 name: "other_java_library_bar",
10745 srcs: ["foo/bar/MyClass.java"],
10746 sdk_version: "none",
10747 system_modules: "none",
10748 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010749 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010750 "myapex",
10751 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010752 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010753 }
10754
10755 aconfig_declarations {
10756 name: "my_aconfig_declarations_foo",
10757 package: "com.example.package",
10758 container: "myapex",
10759 srcs: ["foo.aconfig"],
10760 }
10761
10762 java_aconfig_library {
10763 name: "my_java_aconfig_library_foo",
10764 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010765 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010766 "myapex",
10767 ],
10768 }
10769
10770 aconfig_declarations {
10771 name: "other_aconfig_declarations_bar",
10772 package: "com.example.package",
10773 container: "otherapex",
10774 srcs: ["bar.aconfig"],
10775 }
10776
10777 java_aconfig_library {
10778 name: "other_java_aconfig_library_bar",
10779 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010780 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010781 "myapex",
10782 ],
10783 }
10784 `)
10785
10786 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10787 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10788 s := " " + combineAconfigRule.Args["cache_files"]
10789 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10790 if len(aconfigArgs) != 1 {
10791 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10792 }
10793 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10794
10795 buildParams := combineAconfigRule.BuildParams
10796 if len(buildParams.Inputs) != 1 {
10797 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10798 }
10799 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10800 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10801}
10802
10803func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010804 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010805 ctx := testApex(t, apex_default_bp+`
10806 apex {
10807 name: "myapex",
10808 manifest: ":myapex.manifest",
10809 androidManifest: ":myapex.androidmanifest",
10810 key: "myapex.key",
10811 java_libs: [
10812 "my_java_library_foo",
10813 "my_java_library_bar",
10814 ],
10815 updatable: false,
10816 }
10817
10818 java_library {
10819 name: "my_java_library_foo",
10820 srcs: ["foo/bar/MyClass.java"],
10821 sdk_version: "none",
10822 system_modules: "none",
10823 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010824 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010825 "myapex",
10826 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010827 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010828 }
10829
10830 java_library {
10831 name: "my_java_library_bar",
10832 srcs: ["foo/bar/MyClass.java"],
10833 sdk_version: "none",
10834 system_modules: "none",
10835 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010836 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010837 "myapex",
10838 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010839 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010840 }
10841
10842 aconfig_declarations {
10843 name: "my_aconfig_declarations_foo",
10844 package: "com.example.package",
10845 container: "myapex",
10846 srcs: ["foo.aconfig"],
10847 }
10848
10849 java_aconfig_library {
10850 name: "my_java_aconfig_library_foo",
10851 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010852 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010853 "myapex",
10854 ],
10855 }
10856
10857 java_aconfig_library {
10858 name: "my_java_aconfig_library_bar",
10859 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010860 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010861 "myapex",
10862 ],
10863 }
10864 `)
10865
10866 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10867 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10868 s := " " + combineAconfigRule.Args["cache_files"]
10869 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10870 if len(aconfigArgs) != 1 {
10871 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10872 }
10873 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10874
10875 buildParams := combineAconfigRule.BuildParams
10876 if len(buildParams.Inputs) != 1 {
10877 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10878 }
10879 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10880 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10881}
Spandan Das5be63332023-12-13 00:06:32 +000010882
10883// Test that the boot jars come from the _selected_ apex prebuilt
10884// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10885func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010886 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010887 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10888 t.Helper()
10889 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10890 foundLibfooJar := false
10891 base := stem + ".jar"
10892 for _, output := range s.AllOutputs() {
10893 if filepath.Base(output) == base {
10894 foundLibfooJar = true
10895 buildRule := s.Output(output)
10896 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10897 }
10898 }
10899 if !foundLibfooJar {
10900 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10901 }
10902 }
10903
Spandan Das64c9e0c2023-12-20 20:13:34 +000010904 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10905 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10906 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10907 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10908 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10909 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)
10910 }
10911
10912 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10913 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10914 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10915 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10916 }
10917
Spandan Das5be63332023-12-13 00:06:32 +000010918 bp := `
10919 // Source APEX.
10920
10921 java_library {
10922 name: "framework-foo",
10923 srcs: ["foo.java"],
10924 installable: true,
10925 apex_available: [
10926 "com.android.foo",
10927 ],
10928 }
10929
10930 bootclasspath_fragment {
10931 name: "foo-bootclasspath-fragment",
10932 contents: ["framework-foo"],
10933 apex_available: [
10934 "com.android.foo",
10935 ],
10936 hidden_api: {
10937 split_packages: ["*"],
10938 },
10939 }
10940
10941 apex_key {
10942 name: "com.android.foo.key",
10943 public_key: "com.android.foo.avbpubkey",
10944 private_key: "com.android.foo.pem",
10945 }
10946
10947 apex {
10948 name: "com.android.foo",
10949 key: "com.android.foo.key",
10950 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10951 updatable: false,
10952 }
10953
10954 // Prebuilt APEX.
10955
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010956 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010957 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010958 public: {
10959 jars: ["foo.jar"],
10960 },
Spandan Das5be63332023-12-13 00:06:32 +000010961 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010962 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010963 }
10964
10965 prebuilt_bootclasspath_fragment {
10966 name: "foo-bootclasspath-fragment",
10967 contents: ["framework-foo"],
10968 hidden_api: {
10969 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10970 metadata: "my-bootclasspath-fragment/metadata.csv",
10971 index: "my-bootclasspath-fragment/index.csv",
10972 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10973 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10974 },
10975 apex_available: [
10976 "com.android.foo",
10977 ],
10978 }
10979
10980 prebuilt_apex {
10981 name: "com.android.foo",
10982 apex_name: "com.android.foo",
10983 src: "com.android.foo-arm.apex",
10984 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10985 }
10986
10987 // Another Prebuilt ART APEX
10988 prebuilt_apex {
10989 name: "com.android.foo.v2",
10990 apex_name: "com.android.foo", // Used to determine the API domain
10991 src: "com.android.foo-arm.apex",
10992 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10993 }
10994
10995 // APEX contribution modules
10996
10997 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010998 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010999 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011000 contents: ["com.android.foo"],
11001 }
11002
11003 apex_contributions {
11004 name: "foo.prebuilt.contributions",
11005 api_domain: "com.android.foo",
11006 contents: ["prebuilt_com.android.foo"],
11007 }
11008
11009 apex_contributions {
11010 name: "foo.prebuilt.v2.contributions",
11011 api_domain: "com.android.foo",
11012 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011013 }
11014 `
11015
11016 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011017 desc string
11018 selectedApexContributions string
11019 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011020 }{
11021 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011022 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11023 selectedApexContributions: "foo.source.contributions",
11024 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011025 },
11026 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011027 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11028 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011029 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 +000011030 },
11031 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011032 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11033 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011034 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 +000011035 },
11036 }
11037
11038 fragment := java.ApexVariantReference{
11039 Apex: proptools.StringPtr("com.android.foo"),
11040 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11041 }
11042
11043 for _, tc := range testCases {
11044 preparer := android.GroupFixturePreparers(
11045 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11046 android.FixtureMergeMockFs(map[string][]byte{
11047 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11048 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011049 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11050 // file creation.
11051 java.FixtureConfigureBootJars("platform:foo"),
11052 android.FixtureModifyMockFS(func(fs android.MockFS) {
11053 fs["platform/Android.bp"] = []byte(`
11054 java_library {
11055 name: "foo",
11056 srcs: ["Test.java"],
11057 compile_dex: true,
11058 }
11059 `)
11060 fs["platform/Test.java"] = nil
11061 }),
11062
Colin Crossa66b4632024-08-08 15:50:47 -070011063 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011064 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011065 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011066 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011067 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11068 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011069 }
11070}
Spandan Das3576e762024-01-03 18:57:03 +000011071
11072// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11073// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11074func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011075 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011076 // for a mainline module family, check that only the flagged soong module is visible to make
11077 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11078 variation := func(moduleName string) string {
11079 ret := "android_common_com.android.foo"
11080 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011081 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011082 }
11083 return ret
11084 }
11085
11086 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11087 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11088
11089 for _, hiddenModuleName := range hiddenModuleNames {
11090 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11091 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11092
11093 }
11094 }
11095
11096 bp := `
11097 apex_key {
11098 name: "com.android.foo.key",
11099 public_key: "com.android.foo.avbpubkey",
11100 private_key: "com.android.foo.pem",
11101 }
11102
11103 // AOSP source apex
11104 apex {
11105 name: "com.android.foo",
11106 key: "com.android.foo.key",
11107 updatable: false,
11108 }
11109
11110 // Google source apex
11111 override_apex {
11112 name: "com.google.android.foo",
11113 base: "com.android.foo",
11114 key: "com.android.foo.key",
11115 }
11116
11117 // Prebuilt Google APEX.
11118
11119 prebuilt_apex {
11120 name: "com.google.android.foo",
11121 apex_name: "com.android.foo",
11122 src: "com.android.foo-arm.apex",
11123 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11124 }
11125
11126 // Another Prebuilt Google APEX
11127 prebuilt_apex {
11128 name: "com.google.android.foo.v2",
11129 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011130 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011131 src: "com.android.foo-arm.apex",
11132 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11133 }
11134
11135 // APEX contribution modules
11136
11137 apex_contributions {
11138 name: "foo.source.contributions",
11139 api_domain: "com.android.foo",
11140 contents: ["com.google.android.foo"],
11141 }
11142
11143 apex_contributions {
11144 name: "foo.prebuilt.contributions",
11145 api_domain: "com.android.foo",
11146 contents: ["prebuilt_com.google.android.foo"],
11147 }
11148
11149 apex_contributions {
11150 name: "foo.prebuilt.v2.contributions",
11151 api_domain: "com.android.foo",
11152 contents: ["prebuilt_com.google.android.foo.v2"],
11153 }
11154
11155 // This is an incompatible module because it selects multiple versions of the same mainline module
11156 apex_contributions {
11157 name: "foo.prebuilt.duplicate.contributions",
11158 api_domain: "com.android.foo",
11159 contents: [
11160 "prebuilt_com.google.android.foo",
11161 "prebuilt_com.google.android.foo.v2",
11162 ],
11163 }
11164 `
11165
11166 testCases := []struct {
11167 desc string
11168 selectedApexContributions string
11169 expectedVisibleModuleName string
11170 expectedHiddenModuleNames []string
11171 expectedError string
11172 }{
11173 {
11174 desc: "Source apex is selected, prebuilts should be hidden from make",
11175 selectedApexContributions: "foo.source.contributions",
11176 expectedVisibleModuleName: "com.google.android.foo",
11177 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11178 },
11179 {
11180 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11181 selectedApexContributions: "foo.prebuilt.contributions",
11182 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11183 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11184 },
11185 {
11186 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11187 selectedApexContributions: "foo.prebuilt.v2.contributions",
11188 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11189 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11190 },
11191 {
11192 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11193 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11194 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11195 },
11196 }
11197
11198 for _, tc := range testCases {
11199 preparer := android.GroupFixturePreparers(
11200 android.FixtureMergeMockFs(map[string][]byte{
11201 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11202 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011203 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011204 )
11205 if tc.expectedError != "" {
11206 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11207 testApex(t, bp, preparer)
11208 return
11209 }
11210 ctx := testApex(t, bp, preparer)
11211
Spandan Das3576e762024-01-03 18:57:03 +000011212 // Check that
11213 // 1. The contents of the selected apex_contributions are visible to make
11214 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11215 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11216 }
11217}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011218
Spandan Das85bd4622024-08-01 00:51:20 +000011219// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11220func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011221 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011222 // for a mainline module family, check that only the flagged soong module is visible to make
11223 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11224 variation := func(moduleName string) string {
11225 ret := "android_common_com.android.adservices"
11226 if moduleName == "com.google.android.foo" {
11227 ret = "android_common_com.google.android.foo_com.google.android.foo"
11228 }
11229 return ret
11230 }
11231
11232 for _, visibleModuleName := range visibleModuleNames {
11233 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11234 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11235 }
11236
11237 for _, hiddenModuleName := range hiddenModuleNames {
11238 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11239 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11240
11241 }
11242 }
11243
11244 bp := `
11245 apex_key {
11246 name: "com.android.adservices.key",
11247 public_key: "com.android.adservices.avbpubkey",
11248 private_key: "com.android.adservices.pem",
11249 }
11250
11251 // AOSP source apex
11252 apex {
11253 name: "com.android.adservices",
11254 key: "com.android.adservices.key",
11255 updatable: false,
11256 }
11257
11258 // Prebuilt Google APEX.
11259
11260 prebuilt_apex {
11261 name: "com.google.android.adservices",
11262 apex_name: "com.android.adservices",
11263 src: "com.android.foo-arm.apex",
11264 }
11265
11266 // Another Prebuilt Google APEX
11267 prebuilt_apex {
11268 name: "com.google.android.adservices.v2",
11269 apex_name: "com.android.adservices",
11270 src: "com.android.foo-arm.apex",
11271 }
11272
11273 // APEX contribution modules
11274
11275
11276 apex_contributions {
11277 name: "adservices.prebuilt.contributions",
11278 api_domain: "com.android.adservices",
11279 contents: ["prebuilt_com.google.android.adservices"],
11280 }
11281
11282 apex_contributions {
11283 name: "adservices.prebuilt.v2.contributions",
11284 api_domain: "com.android.adservices",
11285 contents: ["prebuilt_com.google.android.adservices.v2"],
11286 }
11287 `
11288
11289 testCases := []struct {
11290 desc string
11291 selectedApexContributions string
11292 expectedVisibleModuleNames []string
11293 expectedHiddenModuleNames []string
11294 }{
11295 {
11296 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11297 selectedApexContributions: "",
11298 expectedVisibleModuleNames: []string{"com.android.adservices"},
11299 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11300 },
11301 {
11302 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11303 selectedApexContributions: "adservices.prebuilt.contributions",
11304 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11305 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11306 },
11307 {
11308 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11309 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11310 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11311 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11312 },
11313 }
11314
11315 for _, tc := range testCases {
11316 preparer := android.GroupFixturePreparers(
11317 android.FixtureMergeMockFs(map[string][]byte{
11318 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11319 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011320 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011321 )
11322 ctx := testApex(t, bp, preparer)
11323
11324 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11325 }
11326}
11327
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011328func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011329 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011330 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11331 for _, moduleName := range moduleNames {
11332 ret += fmt.Sprintf(`
11333 aconfig_declarations {
11334 name: "%[1]s",
11335 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011336 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011337 srcs: [
11338 "%[1]s.aconfig",
11339 ],
11340 }
11341 java_aconfig_library {
11342 name: "%[1]s-lib",
11343 aconfig_declarations: "%[1]s",
11344 }
11345 `, moduleName)
11346 }
11347 return ret
11348 }
11349
11350 result := android.GroupFixturePreparers(
11351 prepareForApexTest,
11352 java.PrepareForTestWithJavaSdkLibraryFiles,
11353 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011354 ).RunTestWithBp(t, `
11355 java_library {
11356 name: "baz-java-lib",
11357 static_libs: [
11358 "baz-lib",
11359 ],
11360 }
11361 filegroup {
11362 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011363 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011364 ":qux-lib{.generated_srcjars}",
11365 ],
11366 }
11367 filegroup {
11368 name: "qux-another-filegroup",
11369 srcs: [
11370 ":qux-filegroup",
11371 ],
11372 }
11373 java_library {
11374 name: "quux-java-lib",
11375 srcs: [
11376 "a.java",
11377 ],
11378 libs: [
11379 "quux-lib",
11380 ],
11381 }
11382 java_sdk_library {
11383 name: "foo",
11384 srcs: [
11385 ":qux-another-filegroup",
11386 ],
11387 api_packages: ["foo"],
11388 system: {
11389 enabled: true,
11390 },
11391 module_lib: {
11392 enabled: true,
11393 },
11394 test: {
11395 enabled: true,
11396 },
11397 static_libs: [
11398 "bar-lib",
11399 ],
11400 libs: [
11401 "baz-java-lib",
11402 "quux-java-lib",
11403 ],
11404 aconfig_declarations: [
11405 "bar",
11406 ],
11407 }
11408 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11409
11410 m := result.ModuleForTests("foo.stubs.source", "android_common")
11411 outDir := "out/soong/.intermediates"
11412
11413 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11414 // textproto files
11415 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11416
11417 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11418 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11419 // to aconfig.
11420 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11421 "passed as an input",
11422 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11423
11424 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11425 // to metalava as classpath. Thus the cache file provided by the associated
11426 // aconfig_declarations module "baz" should be passed to aconfig.
11427 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11428 "java_aconfig_library passed as an input",
11429 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11430
11431 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11432 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11433 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11434 "input",
11435 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11436
11437 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11438 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11439 // aconfig_declarations module "quux" should not be passed to aconfig.
11440 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11441 "depend on java_aconfig_library not passed as an input",
11442 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11443}
Cole Faust7c991b42024-05-15 11:17:55 -070011444
11445func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011446 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011447 ctx := testApex(t, `
11448 apex {
11449 name: "myapex",
11450 key: "myapex.key",
11451 prebuilts: ["myetc", "myetc2"],
11452 min_sdk_version: "29",
11453 }
11454 apex_key {
11455 name: "myapex.key",
11456 public_key: "testkey.avbpubkey",
11457 private_key: "testkey.pem",
11458 }
11459
11460 prebuilt_etc {
11461 name: "myetc",
11462 src: "myprebuilt",
11463 filename: "myfilename",
11464 }
11465 prebuilt_etc {
11466 name: "myetc2",
11467 sub_dir: "mysubdir",
11468 src: "myprebuilt",
11469 filename: "myfilename",
11470 }
11471 `, withFiles(android.MockFS{
11472 "packages/modules/common/build/allowed_deps.txt": nil,
11473 }))
11474
11475 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11476 data := android.AndroidMkDataForTest(t, ctx, ab)
11477 var builder strings.Builder
11478 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11479 androidMk := builder.String()
11480
11481 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11482 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11483}
Spandan Das50801e22024-05-13 18:29:45 +000011484
11485func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011486 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011487 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11488 args := module.Rule("apexRule").Args
11489 optFlags := args["opt_flags"]
11490 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11491 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11492 }
11493 }
11494
11495 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11496 t.Helper()
11497 found := false
11498 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11499 if dep == wantDep {
11500 found = true
11501 }
11502 })
11503 if !found {
11504 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11505 }
11506 }
11507
11508 ctx := testApex(t, `
11509 apex {
11510 name: "com.android.apex30",
11511 min_sdk_version: "30",
11512 key: "apex30.key",
11513 java_libs: ["javalib"],
11514 }
11515
11516 java_library {
11517 name: "javalib",
11518 srcs: ["A.java"],
11519 apex_available: ["com.android.apex30"],
11520 min_sdk_version: "30",
11521 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011522 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011523 }
11524
11525 override_apex {
11526 name: "com.mycompany.android.apex30",
11527 base: "com.android.apex30",
11528 }
11529
11530 override_apex {
11531 name: "com.mycompany.android.apex31",
11532 base: "com.android.apex30",
11533 min_sdk_version: "31",
11534 }
11535
11536 apex_key {
11537 name: "apex30.key",
11538 public_key: "testkey.avbpubkey",
11539 private_key: "testkey.pem",
11540 }
11541
11542 `, android.FixtureMergeMockFs(android.MockFS{
11543 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11544 }),
11545 )
11546
11547 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11548 checkMinSdkVersion(t, baseModule, "30")
11549
11550 // Override module, but uses same min_sdk_version
11551 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11552 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11553 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11554 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11555
11556 // Override module, uses different min_sdk_version
11557 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11558 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11559 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11560 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11561}
Spandan Das0b28fa02024-05-28 23:40:17 +000011562
11563func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011564 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011565 context := android.GroupFixturePreparers(
11566 android.PrepareForIntegrationTestWithAndroid,
11567 PrepareForTestWithApexBuildComponents,
11568 android.FixtureMergeMockFs(android.MockFS{
11569 "system/sepolicy/apex/foo-file_contexts": nil,
11570 }),
11571 )
11572 res := context.RunTestWithBp(t, `
11573 apex {
11574 name: "foo",
11575 key: "myapex.key",
11576 apex_available_name: "com.android.foo",
11577 variant_version: "0",
11578 updatable: false,
11579 }
11580 apex_key {
11581 name: "myapex.key",
11582 public_key: "testkey.avbpubkey",
11583 private_key: "testkey.pem",
11584 }
11585 prebuilt_apex {
11586 name: "foo",
11587 src: "foo.apex",
11588 prefer: true,
11589 }
11590 override_apex {
11591 name: "myoverrideapex",
11592 base: "foo",
11593 }
11594 `)
11595
11596 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11597}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011598
11599func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011600 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011601 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`, `
11602 apex {
11603 name: "myapex",
11604 key: "myapex.key",
11605 updatable: true,
11606 min_sdk_version: "current",
11607 }
11608
11609 apex_key {
11610 name: "myapex.key",
11611 public_key: "testkey.avbpubkey",
11612 private_key: "testkey.pem",
11613 }
11614 `)
11615}
Spandan Das2f68f192024-07-22 19:25:50 +000011616
11617func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011618 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011619 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11620 result := android.GroupFixturePreparers(
11621 prepareForApexTest,
11622 android.PrepareForTestWithAndroidMk,
11623 android.PrepareForTestWithMakevars,
11624 android.FixtureMergeMockFs(fs),
11625 ).RunTest(t)
11626
11627 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011628 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011629
11630 installRules := result.InstallMakeRulesForTesting(t)
11631
11632 var installedlibRule *android.InstallMakeRule
11633 for i, rule := range installRules {
11634 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11635 if installedlibRule != nil {
11636 t.Errorf("Duplicate install rules for %s", rule.Target)
11637 }
11638 installedlibRule = &installRules[i]
11639 }
11640 }
11641 if installedlibRule == nil {
11642 t.Errorf("No install rule found for installedlib")
11643 return
11644 }
11645
11646 if expectLibfooOnSystemLib {
11647 android.AssertStringListContains(t,
11648 "installedlib doesn't have install dependency on libfoo impl",
11649 installedlibRule.OrderOnlyDeps,
11650 "out/target/product/test_device/system/lib/libfoo.so")
11651 } else {
11652 android.AssertStringListDoesNotContain(t,
11653 "installedlib has install dependency on libfoo stub",
11654 installedlibRule.Deps,
11655 "out/target/product/test_device/system/lib/libfoo.so")
11656 android.AssertStringListDoesNotContain(t,
11657 "installedlib has order-only install dependency on libfoo stub",
11658 installedlibRule.OrderOnlyDeps,
11659 "out/target/product/test_device/system/lib/libfoo.so")
11660 }
11661 }
11662
11663 prebuiltLibfooBp := []byte(`
11664 cc_prebuilt_library {
11665 name: "libfoo",
11666 prefer: true,
11667 srcs: ["libfoo.so"],
11668 stubs: {
11669 versions: ["1"],
11670 },
11671 apex_available: ["apexfoo"],
11672 }
11673 `)
11674
11675 apexfooBp := []byte(`
11676 apex {
11677 name: "apexfoo",
11678 key: "apexfoo.key",
11679 native_shared_libs: ["libfoo"],
11680 updatable: false,
11681 compile_multilib: "both",
11682 }
11683 apex_key {
11684 name: "apexfoo.key",
11685 public_key: "testkey.avbpubkey",
11686 private_key: "testkey.pem",
11687 }
11688 `)
11689
11690 installedlibBp := []byte(`
11691 cc_library {
11692 name: "installedlib",
11693 shared_libs: ["libfoo"],
11694 }
11695 `)
11696
11697 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011698 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011699 testFunc(
11700 t,
11701 /*expectLibfooOnSystemLib=*/ false,
11702 android.MockFS{
11703 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11704 "apexfoo/Android.bp": apexfooBp,
11705 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11706 "Android.bp": installedlibBp,
11707 },
11708 )
11709 })
11710
11711 disabledSourceLibfooBp := []byte(`
11712 cc_library {
11713 name: "libfoo",
11714 enabled: false,
11715 stubs: {
11716 versions: ["1"],
11717 },
11718 apex_available: ["apexfoo"],
11719 }
11720 `)
11721
11722 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011723 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011724 testFunc(
11725 t,
11726 /*expectLibfooOnSystemLib=*/ false,
11727 android.MockFS{
11728 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11729 "impl/Android.bp": disabledSourceLibfooBp,
11730 "apexfoo/Android.bp": apexfooBp,
11731 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11732 "Android.bp": installedlibBp,
11733 },
11734 )
11735 })
11736}
Jihoon Kange246bb72024-09-18 22:26:22 +000011737
11738func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011739 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011740 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11741 // in libs of android_app and java_library does not lead to class loader context device/host
11742 // path mismatch errors.
11743 android.GroupFixturePreparers(
11744 prepareForApexTest,
11745 android.PrepareForIntegrationTestWithAndroid,
11746 PrepareForTestWithApexBuildComponents,
11747 android.FixtureModifyEnv(func(env map[string]string) {
11748 env["DISABLE_CONTAINER_CHECK"] = "true"
11749 }),
11750 withFiles(filesForSdkLibrary),
11751 android.FixtureMergeMockFs(android.MockFS{
11752 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11753 }),
11754 ).RunTestWithBp(t, `
11755 apex {
11756 name: "com.android.foo30",
11757 key: "myapex.key",
11758 updatable: true,
11759 bootclasspath_fragments: [
11760 "foo-bootclasspath-fragment",
11761 ],
11762 java_libs: [
11763 "bar",
11764 ],
11765 apps: [
11766 "bar-app",
11767 ],
11768 min_sdk_version: "30",
11769 }
11770 apex_key {
11771 name: "myapex.key",
11772 public_key: "testkey.avbpubkey",
11773 private_key: "testkey.pem",
11774 }
11775 bootclasspath_fragment {
11776 name: "foo-bootclasspath-fragment",
11777 contents: [
11778 "framework-foo",
11779 ],
11780 apex_available: [
11781 "com.android.foo30",
11782 ],
11783 hidden_api: {
11784 split_packages: ["*"]
11785 },
11786 }
11787
11788 java_sdk_library {
11789 name: "framework-foo",
11790 srcs: [
11791 "A.java"
11792 ],
11793 unsafe_ignore_missing_latest_api: true,
11794 apex_available: [
11795 "com.android.foo30",
11796 ],
11797 compile_dex: true,
11798 sdk_version: "core_current",
11799 shared_library: false,
11800 }
11801
11802 java_library {
11803 name: "bar",
11804 srcs: [
11805 "A.java"
11806 ],
11807 libs: [
11808 "framework-foo.impl",
11809 ],
11810 apex_available: [
11811 "com.android.foo30",
11812 ],
11813 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011814 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011815 }
11816
11817 java_library {
11818 name: "baz",
11819 srcs: [
11820 "A.java"
11821 ],
11822 libs: [
11823 "bar",
11824 ],
11825 sdk_version: "core_current",
11826 }
11827
11828 android_app {
11829 name: "bar-app",
11830 srcs: [
11831 "A.java"
11832 ],
11833 libs: [
11834 "baz",
11835 "framework-foo.impl",
11836 ],
11837 apex_available: [
11838 "com.android.foo30",
11839 ],
11840 sdk_version: "core_current",
11841 min_sdk_version: "30",
11842 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011843 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011844 }
11845 `)
11846}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011847
11848// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11849func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011850 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011851 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11852 apex {
11853 name: "myapex",
11854 key: "myapex.key",
11855 systemserverclasspath_fragments: [
11856 "mysystemserverclasspathfragment",
11857 ],
11858 min_sdk_version: "29",
11859 updatable: true,
11860 system_ext_specific: true,
11861 }
11862
11863 apex_key {
11864 name: "myapex.key",
11865 public_key: "testkey.avbpubkey",
11866 private_key: "testkey.pem",
11867 }
11868
11869 java_library {
11870 name: "foo",
11871 srcs: ["b.java"],
11872 min_sdk_version: "29",
11873 installable: true,
11874 apex_available: [
11875 "myapex",
11876 ],
11877 sdk_version: "current",
11878 }
11879
11880 systemserverclasspath_fragment {
11881 name: "mysystemserverclasspathfragment",
11882 contents: [
11883 "foo",
11884 ],
11885 apex_available: [
11886 "myapex",
11887 ],
11888 }
11889 `,
11890 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11891 )
11892}
Spandan Das72d86c62024-10-15 19:27:41 +000011893
11894// partitions should not package the artifacts that are included inside the apex.
11895func TestFilesystemWithApexDeps(t *testing.T) {
11896 t.Parallel()
11897 result := testApex(t, `
11898 android_filesystem {
11899 name: "myfilesystem",
11900 deps: ["myapex"],
11901 }
11902 apex {
11903 name: "myapex",
11904 key: "myapex.key",
11905 binaries: ["binfoo"],
11906 native_shared_libs: ["libfoo"],
11907 apps: ["appfoo"],
11908 updatable: false,
11909 }
11910 apex_key {
11911 name: "myapex.key",
11912 }
11913 cc_binary {
11914 name: "binfoo",
11915 apex_available: ["myapex"],
11916 }
11917 cc_library {
11918 name: "libfoo",
11919 apex_available: ["myapex"],
11920 }
11921 android_app {
11922 name: "appfoo",
11923 sdk_version: "current",
11924 apex_available: ["myapex"],
11925 }
11926 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11927
11928 partition := result.ModuleForTests("myfilesystem", "android_common")
11929 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11930 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11931}
Colin Crossb614cd42024-10-11 12:52:21 -070011932
11933func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11934 t.Parallel()
11935
11936 extractDepenencyPathFromErrors := func(errs []error) []string {
11937 i := slices.IndexFunc(errs, func(err error) bool {
11938 return strings.Contains(err.Error(), "dependency path:")
11939 })
11940 if i < 0 {
11941 return nil
11942 }
11943 var dependencyPath []string
11944 for _, err := range errs[i+1:] {
11945 s := err.Error()
11946 lastSpace := strings.LastIndexByte(s, ' ')
11947 if lastSpace >= 0 {
11948 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11949 }
11950 }
11951 return dependencyPath
11952 }
11953
11954 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11955 return func(t *testing.T, result *android.TestResult) {
11956 t.Helper()
11957 if len(result.Errs) == 0 {
11958 t.Fatalf("expected errors")
11959 }
11960 t.Log("found errors:")
11961 for _, err := range result.Errs {
11962 t.Log(err)
11963 }
11964 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11965 t.Fatalf("expected error %q, got %q", w, g)
11966 }
11967 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11968 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11969 t.Errorf("expected dependency path %q, got %q", w, g)
11970 }
11971 }
11972 }
11973
11974 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11975 return func(bp *bpmodify.Blueprint) {
11976 m := bp.ModulesByName(module)
11977 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11978 if err != nil {
11979 panic(err)
11980 }
11981 props.AddStringToList(lib)
11982 }
11983 }
11984
11985 bpTemplate := `
11986 apex {
11987 name: "myapex",
11988 key: "myapex.key",
11989 native_shared_libs: ["mylib"],
11990 rust_dyn_libs: ["libmyrust"],
11991 binaries: ["mybin", "myrustbin"],
11992 jni_libs: ["libjni"],
11993 apps: ["myapp"],
11994 updatable: false,
11995 }
11996
11997 apex {
11998 name: "otherapex",
11999 key: "myapex.key",
12000 native_shared_libs: ["libotherapex"],
12001 updatable: false,
12002 }
12003
12004 apex_key {
12005 name: "myapex.key",
12006 public_key: "testkey.avbpubkey",
12007 private_key: "testkey.pem",
12008 }
12009
12010 cc_library {
12011 name: "mylib",
12012 srcs: ["foo.cpp"],
12013 apex_available: ["myapex"],
12014 }
12015
12016 cc_binary {
12017 name: "mybin",
12018 srcs: ["foo.cpp"],
12019 apex_available: ["myapex"],
12020 }
12021
12022 rust_library {
12023 name: "libmyrust",
12024 crate_name: "myrust",
12025 srcs: ["src/lib.rs"],
12026 rustlibs: ["libmyrust_transitive_dylib"],
12027 rlibs: ["libmyrust_transitive_rlib"],
12028 apex_available: ["myapex"],
12029 }
12030
12031 rust_library{
12032 name: "libmyrust_transitive_dylib",
12033 crate_name: "myrust_transitive_dylib",
12034 srcs: ["src/lib.rs"],
12035 apex_available: ["myapex"],
12036 }
12037
12038 rust_library {
12039 name: "libmyrust_transitive_rlib",
12040 crate_name: "myrust_transitive_rlib",
12041 srcs: ["src/lib.rs"],
12042 apex_available: ["myapex"],
12043 }
12044
12045 rust_binary {
12046 name: "myrustbin",
12047 srcs: ["src/main.rs"],
12048 apex_available: ["myapex"],
12049 }
12050
12051 cc_library {
12052 name: "libbar",
12053 sdk_version: "current",
12054 srcs: ["bar.cpp"],
12055 apex_available: ["myapex"],
12056 stl: "none",
12057 }
12058
12059 android_app {
12060 name: "myapp",
12061 jni_libs: ["libembeddedjni"],
12062 use_embedded_native_libs: true,
12063 sdk_version: "current",
12064 apex_available: ["myapex"],
12065 }
12066
12067 cc_library {
12068 name: "libembeddedjni",
12069 sdk_version: "current",
12070 srcs: ["bar.cpp"],
12071 apex_available: ["myapex"],
12072 stl: "none",
12073 }
12074
12075 cc_library {
12076 name: "libjni",
12077 sdk_version: "current",
12078 srcs: ["bar.cpp"],
12079 apex_available: ["myapex"],
12080 stl: "none",
12081 }
12082
12083 cc_library {
12084 name: "libotherapex",
12085 sdk_version: "current",
12086 srcs: ["otherapex.cpp"],
12087 apex_available: ["otherapex"],
12088 stubs: {
12089 symbol_file: "libotherapex.map.txt",
12090 versions: ["1", "2", "3"],
12091 },
12092 stl: "none",
12093 }
12094
12095 cc_library {
12096 name: "libplatform",
12097 sdk_version: "current",
12098 srcs: ["libplatform.cpp"],
12099 stubs: {
12100 symbol_file: "libplatform.map.txt",
12101 versions: ["1", "2", "3"],
12102 },
12103 stl: "none",
12104 system_shared_libs: [],
12105 }
12106 `
12107
12108 testCases := []struct {
12109 name string
12110 bpModifier func(bp *bpmodify.Blueprint)
12111 dependencyPath []string
12112 }{
12113 {
12114 name: "library dependency in other apex",
12115 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12116 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12117 },
12118 {
12119 name: "transitive library dependency in other apex",
12120 bpModifier: func(bp *bpmodify.Blueprint) {
12121 addToSharedLibs("mylib", "libbar")(bp)
12122 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12123 },
12124 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12125 },
12126 {
12127 name: "library dependency in platform",
12128 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12129 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12130 },
12131 {
12132 name: "jni library dependency in other apex",
12133 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12134 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12135 },
12136 {
12137 name: "transitive jni library dependency in other apex",
12138 bpModifier: func(bp *bpmodify.Blueprint) {
12139 addToSharedLibs("libjni", "libbar")(bp)
12140 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12141 },
12142 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12143 },
12144 {
12145 name: "jni library dependency in platform",
12146 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12147 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12148 },
12149 {
12150 name: "transitive jni library dependency in platform",
12151 bpModifier: func(bp *bpmodify.Blueprint) {
12152 addToSharedLibs("libjni", "libbar")(bp)
12153 addToSharedLibs("libbar", "libplatform#impl")(bp)
12154 },
12155 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12156 },
Spandan Das10c41362024-12-03 01:33:09 +000012157 {
12158 name: "app jni library dependency in other apex",
12159 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12160 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12161 },
12162 {
12163 name: "transitive app jni library dependency in other apex",
12164 bpModifier: func(bp *bpmodify.Blueprint) {
12165 addToSharedLibs("libembeddedjni", "libbar")(bp)
12166 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12167 },
12168 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12169 },
12170 {
12171 name: "app jni library dependency in platform",
12172 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12173 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12174 },
12175 {
12176 name: "transitive app jni library dependency in platform",
12177 bpModifier: func(bp *bpmodify.Blueprint) {
12178 addToSharedLibs("libembeddedjni", "libbar")(bp)
12179 addToSharedLibs("libbar", "libplatform#impl")(bp)
12180 },
12181 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12182 },
Colin Crossb614cd42024-10-11 12:52:21 -070012183 {
12184 name: "binary dependency in other apex",
12185 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12186 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12187 },
12188 {
12189 name: "transitive binary dependency in other apex",
12190 bpModifier: func(bp *bpmodify.Blueprint) {
12191 addToSharedLibs("mybin", "libbar")(bp)
12192 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12193 },
12194 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12195 },
12196 {
12197 name: "binary dependency in platform",
12198 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12199 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12200 },
12201 {
12202 name: "transitive binary dependency in platform",
12203 bpModifier: func(bp *bpmodify.Blueprint) {
12204 addToSharedLibs("mybin", "libbar")(bp)
12205 addToSharedLibs("libbar", "libplatform#impl")(bp)
12206 },
12207 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12208 },
12209
12210 {
12211 name: "rust library dependency in other apex",
12212 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12213 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12214 },
12215 {
12216 name: "transitive rust library dependency in other apex",
12217 bpModifier: func(bp *bpmodify.Blueprint) {
12218 addToSharedLibs("libmyrust", "libbar")(bp)
12219 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12220 },
12221 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12222 },
12223 {
12224 name: "rust library dependency in platform",
12225 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12226 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12227 },
12228 {
12229 name: "transitive rust library dependency in platform",
12230 bpModifier: func(bp *bpmodify.Blueprint) {
12231 addToSharedLibs("libmyrust", "libbar")(bp)
12232 addToSharedLibs("libbar", "libplatform#impl")(bp)
12233 },
12234 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12235 },
12236 {
12237 name: "transitive rust library dylib dependency in other apex",
12238 bpModifier: func(bp *bpmodify.Blueprint) {
12239 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12240 },
12241 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12242 },
12243 {
12244 name: "transitive rust library dylib dependency in platform",
12245 bpModifier: func(bp *bpmodify.Blueprint) {
12246 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12247 },
12248 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12249 },
12250 {
12251 name: "transitive rust library rlib dependency in other apex",
12252 bpModifier: func(bp *bpmodify.Blueprint) {
12253 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12254 },
12255 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12256 },
12257 {
12258 name: "transitive rust library rlib dependency in platform",
12259 bpModifier: func(bp *bpmodify.Blueprint) {
12260 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12261 },
12262 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12263 },
12264 {
12265 name: "rust binary dependency in other apex",
12266 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12267 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12268 },
12269 {
12270 name: "transitive rust binary dependency in other apex",
12271 bpModifier: func(bp *bpmodify.Blueprint) {
12272 addToSharedLibs("myrustbin", "libbar")(bp)
12273 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12274 },
12275 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12276 },
12277 {
12278 name: "rust binary dependency in platform",
12279 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12280 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12281 },
12282 {
12283 name: "transitive rust binary dependency in platform",
12284 bpModifier: func(bp *bpmodify.Blueprint) {
12285 addToSharedLibs("myrustbin", "libbar")(bp)
12286 addToSharedLibs("libbar", "libplatform#impl")(bp)
12287 },
12288 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12289 },
12290 }
12291
12292 for _, testCase := range testCases {
12293 t.Run(testCase.name, func(t *testing.T) {
12294 t.Parallel()
12295 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12296 if err != nil {
12297 t.Fatal(err)
12298 }
12299 if testCase.bpModifier != nil {
12300 func() {
12301 defer func() {
12302 if r := recover(); r != nil {
12303 t.Fatalf("panic in bpModifier: %v", r)
12304 }
12305 }()
12306 testCase.bpModifier(bp)
12307 }()
12308 }
12309 android.GroupFixturePreparers(
12310 android.PrepareForTestWithAndroidBuildComponents,
12311 cc.PrepareForTestWithCcBuildComponents,
12312 java.PrepareForTestWithDexpreopt,
12313 rust.PrepareForTestWithRustDefaultModules,
12314 PrepareForTestWithApexBuildComponents,
12315 prepareForTestWithMyapex,
12316 prepareForTestWithOtherapex,
12317 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12318 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12319 }),
12320 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12321 RunTestWithBp(t, bp.String())
12322 })
12323 }
12324}