blob: f612f7e4f3a3cc9b57c056c0884316b2dcc7919f [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",
Spandan Das7701d5f2024-12-17 17:52:26 +00003588 }`,
3589 android.MockFS{
3590 "vendor/foo/devkeys/testkey.x509.pem": nil,
3591 }.AddToFixture(),
3592 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003593 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003594 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3595 if actual := rule.Args["certificates"]; actual != expected {
3596 t.Errorf("certificates should be %q, not %q", expected, actual)
3597 }
3598 })
3599 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003600 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003601 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003602 apex {
3603 name: "myapex_keytest",
3604 key: "myapex.key",
3605 file_contexts: ":myapex-file_contexts",
3606 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003607 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003608 }
3609 apex_key {
3610 name: "myapex.key",
3611 public_key: "testkey.avbpubkey",
3612 private_key: "testkey.pem",
3613 }
3614 android_app_certificate {
3615 name: "myapex.certificate.override",
3616 certificate: "testkey.override",
3617 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003618 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003619 expected := "testkey.override.x509.pem testkey.override.pk8"
3620 if actual := rule.Args["certificates"]; actual != expected {
3621 t.Errorf("certificates should be %q, not %q", expected, actual)
3622 }
3623 })
3624}
3625
Jiyong Park58e364a2019-01-19 19:24:06 +09003626func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003627 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003628 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003629 apex {
3630 name: "myapex",
3631 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003632 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003633 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003634 }
3635
3636 apex {
3637 name: "otherapex",
3638 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003639 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003640 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003641 }
3642
3643 apex_key {
3644 name: "myapex.key",
3645 public_key: "testkey.avbpubkey",
3646 private_key: "testkey.pem",
3647 }
3648
3649 cc_library {
3650 name: "mylib",
3651 srcs: ["mylib.cpp"],
3652 system_shared_libs: [],
3653 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003654 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003655 "myapex",
3656 "otherapex",
3657 ],
Jooyung Han24282772020-03-21 23:20:55 +09003658 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003659 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003660 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003661 cc_library {
3662 name: "mylib2",
3663 srcs: ["mylib.cpp"],
3664 system_shared_libs: [],
3665 stl: "none",
3666 apex_available: [
3667 "myapex",
3668 "otherapex",
3669 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003670 static_libs: ["mylib3"],
3671 recovery_available: true,
3672 min_sdk_version: "29",
3673 }
3674 cc_library {
3675 name: "mylib3",
3676 srcs: ["mylib.cpp"],
3677 system_shared_libs: [],
3678 stl: "none",
3679 apex_available: [
3680 "myapex",
3681 "otherapex",
3682 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003683 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003684 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003685 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003686 `)
3687
Jooyung Hanc87a0592020-03-02 17:44:33 +09003688 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003689 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003690 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003695
Vinh Tranf9754732023-01-19 22:41:46 -05003696 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003697 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003698 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003699
Colin Crossaede88c2020-08-11 12:17:01 -07003700 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3701 // each variant defines additional macros to distinguish which apex variant it is built for
3702
3703 // non-APEX variant does not have __ANDROID_APEX__ defined
3704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3706
Vinh Tranf9754732023-01-19 22:41:46 -05003707 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003708 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003710
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711 // non-APEX variant does not have __ANDROID_APEX__ defined
3712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3714
Vinh Tranf9754732023-01-19 22:41:46 -05003715 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003716 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003717 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003718}
Jiyong Park7e636d02019-01-28 16:16:54 +09003719
3720func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003721 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003722 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003723 apex {
3724 name: "myapex",
3725 key: "myapex.key",
3726 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003727 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
3736 cc_library_headers {
3737 name: "mylib_headers",
3738 export_include_dirs: ["my_include"],
3739 system_shared_libs: [],
3740 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003741 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003742 }
3743
3744 cc_library {
3745 name: "mylib",
3746 srcs: ["mylib.cpp"],
3747 system_shared_libs: [],
3748 stl: "none",
3749 header_libs: ["mylib_headers"],
3750 export_header_lib_headers: ["mylib_headers"],
3751 stubs: {
3752 versions: ["1", "2", "3"],
3753 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003754 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003755 }
3756
3757 cc_library {
3758 name: "otherlib",
3759 srcs: ["mylib.cpp"],
3760 system_shared_libs: [],
3761 stl: "none",
3762 shared_libs: ["mylib"],
3763 }
3764 `)
3765
Colin Cross7113d202019-11-20 16:39:12 -08003766 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003767
3768 // Ensure that the include path of the header lib is exported to 'otherlib'
3769 ensureContains(t, cFlags, "-Imy_include")
3770}
Alex Light9670d332019-01-29 18:07:33 -08003771
Jiyong Park7cd10e32020-01-14 09:22:18 +09003772type fileInApex struct {
3773 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003774 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003775 isLink bool
3776}
3777
Jooyung Han1724d582022-12-21 10:17:44 +09003778func (f fileInApex) String() string {
3779 return f.src + ":" + f.path
3780}
3781
3782func (f fileInApex) match(expectation string) bool {
3783 parts := strings.Split(expectation, ":")
3784 if len(parts) == 1 {
3785 match, _ := path.Match(parts[0], f.path)
3786 return match
3787 }
3788 if len(parts) == 2 {
3789 matchSrc, _ := path.Match(parts[0], f.src)
3790 matchDst, _ := path.Match(parts[1], f.path)
3791 return matchSrc && matchDst
3792 }
3793 panic("invalid expected file specification: " + expectation)
3794}
3795
Jooyung Hana57af4a2020-01-23 05:36:59 +00003796func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003798 module := ctx.ModuleForTests(moduleName, variant)
3799 apexRule := module.MaybeRule("apexRule")
3800 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003802 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 for _, cmd := range strings.Split(copyCmds, "&&") {
3804 cmd = strings.TrimSpace(cmd)
3805 if cmd == "" {
3806 continue
3807 }
3808 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 switch terms[0] {
3812 case "mkdir":
3813 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003814 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003815 t.Fatal("copyCmds contains invalid cp command", cmd)
3816 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003817 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003818 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003819 isLink = false
3820 case "ln":
3821 if len(terms) != 3 && len(terms) != 4 {
3822 // ln LINK TARGET or ln -s LINK TARGET
3823 t.Fatal("copyCmds contains invalid ln command", cmd)
3824 }
3825 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003826 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003827 isLink = true
3828 default:
3829 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3830 }
3831 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003832 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003833 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003834 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 }
Jooyung Han1724d582022-12-21 10:17:44 +09003836 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003837 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 }
3839 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003840 return ret
3841}
3842
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003843func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003844 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003845 var failed bool
3846 var surplus []string
3847 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003848 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003849 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003850 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003851 if file.match(expected) {
3852 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003853 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003854 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003855 }
3856 }
Jooyung Han1724d582022-12-21 10:17:44 +09003857 if !matchFound {
3858 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003859 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003860 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003861
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003864 t.Log("surplus files", surplus)
3865 failed = true
3866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003868 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003870 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003871 if !filesMatched[expected] {
3872 missing = append(missing, expected)
3873 }
3874 }
3875 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 t.Log("missing files", missing)
3877 failed = true
3878 }
3879 if failed {
3880 t.Fail()
3881 }
3882}
3883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3885 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3886}
3887
3888func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003889 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003890 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3891 if deapexer.Output != nil {
3892 outputs = append(outputs, deapexer.Output.String())
3893 }
3894 for _, output := range deapexer.ImplicitOutputs {
3895 outputs = append(outputs, output.String())
3896 }
3897 actualFiles := make([]fileInApex, 0, len(outputs))
3898 for _, output := range outputs {
3899 dir := "/deapexer/"
3900 pos := strings.LastIndex(output, dir)
3901 if pos == -1 {
3902 t.Fatal("Unknown deapexer output ", output)
3903 }
3904 path := output[pos+len(dir):]
3905 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3906 }
3907 assertFileListEquals(t, files, actualFiles)
3908}
3909
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910func vndkLibrariesTxtFiles(vers ...string) (result string) {
3911 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003912 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003913 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003914 prebuilt_etc {
3915 name: "` + txt + `.libraries.` + v + `.txt",
3916 src: "dummy.txt",
3917 }
3918 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 }
3920 }
3921 return
3922}
3923
Jooyung Han344d5432019-08-23 11:17:39 +09003924func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003925 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003926 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003927 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003928 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003929 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003931 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003932 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003933 }
3934
3935 apex_key {
3936 name: "myapex.key",
3937 public_key: "testkey.avbpubkey",
3938 private_key: "testkey.pem",
3939 }
3940
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 vndk_prebuilt_shared {
3942 name: "libvndk27",
3943 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003944 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003945 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003946 vndk: {
3947 enabled: true,
3948 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003949 target_arch: "arm64",
3950 arch: {
3951 arm: {
3952 srcs: ["libvndk27_arm.so"],
3953 },
3954 arm64: {
3955 srcs: ["libvndk27_arm64.so"],
3956 },
3957 },
Colin Cross2807f002021-03-02 10:15:29 -08003958 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 vndk_prebuilt_shared {
3962 name: "libvndk27",
3963 version: "27",
3964 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003965 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003966 vndk: {
3967 enabled: true,
3968 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003969 target_arch: "x86_64",
3970 arch: {
3971 x86: {
3972 srcs: ["libvndk27_x86.so"],
3973 },
3974 x86_64: {
3975 srcs: ["libvndk27_x86_64.so"],
3976 },
3977 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003978 }
3979 `+vndkLibrariesTxtFiles("27"),
3980 withFiles(map[string][]byte{
3981 "libvndk27_arm.so": nil,
3982 "libvndk27_arm64.so": nil,
3983 "libvndk27_x86.so": nil,
3984 "libvndk27_x86_64.so": nil,
3985 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003986
Jooyung Hana0503a52023-08-23 13:12:50 +09003987 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 "lib/libvndk27_arm.so",
3989 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003990 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003991 })
Jooyung Han344d5432019-08-23 11:17:39 +09003992}
3993
Jooyung Han90eee022019-10-01 20:02:42 +09003994func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003995 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003996 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003997 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003998 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003999 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004000 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004001 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004002 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004003 }
4004 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004005 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004006 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004008 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004009 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004010 }
4011 apex_key {
4012 name: "myapex.key",
4013 public_key: "testkey.avbpubkey",
4014 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004015 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004016
4017 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004018 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004019 apexManifestRule := module.Rule("apexManifestRule")
4020 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004021 }
4022
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004023 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004024 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004025}
4026
Jooyung Han344d5432019-08-23 11:17:39 +09004027func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004028 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004029 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004030 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004031 name: "com.android.vndk.v30",
4032 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004033 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004034 native_bridge_supported: true,
4035 }
4036
4037 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004038 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004039 public_key: "testkey.avbpubkey",
4040 private_key: "testkey.pem",
4041 }
4042
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004043 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004044 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 version: "30",
4046 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004047 srcs: ["mylib.cpp"],
4048 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004049 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004051 vndk: {
4052 enabled: true,
4053 },
Jooyung Han344d5432019-08-23 11:17:39 +09004054 }
4055 `)
4056}
4057
Jooyung Han31c470b2019-10-18 16:26:59 +09004058func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004059 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004060 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004062 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004064 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004066 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 vndk_prebuilt_shared {
4076 name: "libvndk27",
4077 version: "27",
4078 target_arch: "arm",
4079 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004080 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk: {
4082 enabled: true,
4083 },
4084 arch: {
4085 arm: {
4086 srcs: ["libvndk27.so"],
4087 }
4088 },
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 binder32bit: true,
4096 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004097 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 vndk: {
4099 enabled: true,
4100 },
4101 arch: {
4102 arm: {
4103 srcs: ["libvndk27binder32.so"],
4104 }
4105 },
Colin Cross2807f002021-03-02 10:15:29 -08004106 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004107 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004108 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 withFiles(map[string][]byte{
4110 "libvndk27.so": nil,
4111 "libvndk27binder32.so": nil,
4112 }),
4113 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004114 android.FixtureModifyConfig(func(config android.Config) {
4115 target := android.Target{
4116 Os: android.Android,
4117 Arch: android.Arch{
4118 ArchType: android.Arm,
4119 ArchVariant: "armv7-a-neon",
4120 Abi: []string{"armeabi-v7a"},
4121 },
4122 NativeBridge: android.NativeBridgeDisabled,
4123 NativeBridgeHostArchName: "",
4124 NativeBridgeRelativePath: "",
4125 }
4126 config.Targets[android.Android] = []android.Target{target}
4127 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }),
4129 )
4130
Jooyung Hana0503a52023-08-23 13:12:50 +09004131 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004133 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 })
4135}
4136
Jooyung Hane1633032019-08-01 17:41:43 +09004137func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004139 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004140 apex {
4141 name: "myapex_nodep",
4142 key: "myapex.key",
4143 native_shared_libs: ["lib_nodep"],
4144 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004145 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004146 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004147 }
4148
4149 apex {
4150 name: "myapex_dep",
4151 key: "myapex.key",
4152 native_shared_libs: ["lib_dep"],
4153 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004154 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004155 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004156 }
4157
4158 apex {
4159 name: "myapex_provider",
4160 key: "myapex.key",
4161 native_shared_libs: ["libfoo"],
4162 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004163 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004164 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004165 }
4166
4167 apex {
4168 name: "myapex_selfcontained",
4169 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004170 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004171 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004172 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004173 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004174 }
4175
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181
4182 cc_library {
4183 name: "lib_nodep",
4184 srcs: ["mylib.cpp"],
4185 system_shared_libs: [],
4186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004187 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004188 }
4189
4190 cc_library {
4191 name: "lib_dep",
4192 srcs: ["mylib.cpp"],
4193 shared_libs: ["libfoo"],
4194 system_shared_libs: [],
4195 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004196 apex_available: [
4197 "myapex_dep",
4198 "myapex_provider",
4199 "myapex_selfcontained",
4200 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004201 }
4202
4203 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004204 name: "lib_dep_on_bar",
4205 srcs: ["mylib.cpp"],
4206 shared_libs: ["libbar"],
4207 system_shared_libs: [],
4208 stl: "none",
4209 apex_available: [
4210 "myapex_selfcontained",
4211 ],
4212 }
4213
4214
4215 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004216 name: "libfoo",
4217 srcs: ["mytest.cpp"],
4218 stubs: {
4219 versions: ["1"],
4220 },
4221 system_shared_libs: [],
4222 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004223 apex_available: [
4224 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004225 ],
4226 }
4227
4228 cc_library {
4229 name: "libbar",
4230 srcs: ["mytest.cpp"],
4231 stubs: {
4232 versions: ["1"],
4233 },
4234 system_shared_libs: [],
4235 stl: "none",
4236 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004237 "myapex_selfcontained",
4238 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004239 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004240
Jooyung Hane1633032019-08-01 17:41:43 +09004241 `)
4242
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004244 var provideNativeLibs, requireNativeLibs []string
4245
Jooyung Hana0503a52023-08-23 13:12:50 +09004246 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004247 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4248 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004249 ensureListEmpty(t, provideNativeLibs)
4250 ensureListEmpty(t, requireNativeLibs)
4251
Jooyung Hana0503a52023-08-23 13:12:50 +09004252 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004253 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4254 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004255 ensureListEmpty(t, provideNativeLibs)
4256 ensureListContains(t, requireNativeLibs, "libfoo.so")
4257
Jooyung Hana0503a52023-08-23 13:12:50 +09004258 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4260 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004261 ensureListContains(t, provideNativeLibs, "libfoo.so")
4262 ensureListEmpty(t, requireNativeLibs)
4263
Jooyung Hana0503a52023-08-23 13:12:50 +09004264 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004265 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4266 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004267 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004268 ensureListEmpty(t, requireNativeLibs)
4269}
4270
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004271func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004272 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 ctx := testApex(t, `
4274 apex {
4275 name: "myapex",
4276 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004277 native_shared_libs: ["mylib"],
4278 updatable: false,
4279 }
4280
4281 apex_key {
4282 name: "myapex.key",
4283 public_key: "testkey.avbpubkey",
4284 private_key: "testkey.pem",
4285 }
4286
4287 cc_library {
4288 name: "mylib",
4289 srcs: ["mylib.cpp"],
4290 system_shared_libs: [],
4291 stl: "none",
4292 apex_available: [
4293 "//apex_available:platform",
4294 "myapex",
4295 ],
4296 }
4297 `, android.FixtureMergeEnv(map[string]string{
4298 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4299 }))
4300
Jooyung Hana0503a52023-08-23 13:12:50 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004302 apexManifestRule := module.Rule("apexManifestRule")
4303 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4304}
4305
Vinh Tran8f5310f2022-10-07 18:16:47 -04004306func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004307 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004308 testCases := []struct {
4309 compileMultiLibProp string
4310 containedLibs []string
4311 notContainedLibs []string
4312 }{
4313 {
4314 containedLibs: []string{
4315 "image.apex/lib64/mylib.so",
4316 "image.apex/lib/mylib.so",
4317 },
4318 compileMultiLibProp: `compile_multilib: "both",`,
4319 },
4320 {
4321 containedLibs: []string{"image.apex/lib64/mylib.so"},
4322 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4323 compileMultiLibProp: `compile_multilib: "first",`,
4324 },
4325 {
4326 containedLibs: []string{"image.apex/lib64/mylib.so"},
4327 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4328 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4329 },
4330 {
4331 containedLibs: []string{"image.apex/lib64/mylib.so"},
4332 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4333 compileMultiLibProp: `compile_multilib: "64",`,
4334 },
4335 {
4336 containedLibs: []string{"image.apex/lib/mylib.so"},
4337 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4338 compileMultiLibProp: `compile_multilib: "32",`,
4339 },
4340 }
4341 for _, testCase := range testCases {
4342 ctx := testApex(t, fmt.Sprintf(`
4343 apex {
4344 name: "myapex",
4345 key: "myapex.key",
4346 %s
4347 native_shared_libs: ["mylib"],
4348 updatable: false,
4349 }
4350 apex_key {
4351 name: "myapex.key",
4352 public_key: "testkey.avbpubkey",
4353 private_key: "testkey.pem",
4354 }
4355 cc_library {
4356 name: "mylib",
4357 srcs: ["mylib.cpp"],
4358 apex_available: [
4359 "//apex_available:platform",
4360 "myapex",
4361 ],
4362 }
4363 `, testCase.compileMultiLibProp),
4364 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004365 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004366 apexRule := module.Rule("apexRule")
4367 copyCmds := apexRule.Args["copy_commands"]
4368 for _, containedLib := range testCase.containedLibs {
4369 ensureContains(t, copyCmds, containedLib)
4370 }
4371 for _, notContainedLib := range testCase.notContainedLibs {
4372 ensureNotContains(t, copyCmds, notContainedLib)
4373 }
4374 }
4375}
4376
Alex Light0851b882019-02-07 13:20:53 -08004377func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004378 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004379 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004380 apex {
4381 name: "myapex",
4382 key: "myapex.key",
4383 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004385 }
4386
4387 apex_key {
4388 name: "myapex.key",
4389 public_key: "testkey.avbpubkey",
4390 private_key: "testkey.pem",
4391 }
4392
4393 cc_library {
4394 name: "mylib_common",
4395 srcs: ["mylib.cpp"],
4396 system_shared_libs: [],
4397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004398 apex_available: [
4399 "//apex_available:platform",
4400 "myapex",
4401 ],
Alex Light0851b882019-02-07 13:20:53 -08004402 }
4403 `)
4404
Jooyung Hana0503a52023-08-23 13:12:50 +09004405 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004406 apexRule := module.Rule("apexRule")
4407 copyCmds := apexRule.Args["copy_commands"]
4408
4409 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4410 t.Log("Apex was a test apex!")
4411 t.Fail()
4412 }
4413 // Ensure that main rule creates an output
4414 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4415
4416 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004417 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004418
4419 // Ensure that both direct and indirect deps are copied into apex
4420 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4421
Colin Cross7113d202019-11-20 16:39:12 -08004422 // Ensure that the platform variant ends with _shared
4423 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004424
Colin Cross56a83212020-09-15 18:30:11 -07004425 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004426 t.Log("Found mylib_common not in any apex!")
4427 t.Fail()
4428 }
4429}
4430
4431func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004432 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004433 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004434 apex_test {
4435 name: "myapex",
4436 key: "myapex.key",
4437 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004438 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004439 }
4440
4441 apex_key {
4442 name: "myapex.key",
4443 public_key: "testkey.avbpubkey",
4444 private_key: "testkey.pem",
4445 }
4446
4447 cc_library {
4448 name: "mylib_common_test",
4449 srcs: ["mylib.cpp"],
4450 system_shared_libs: [],
4451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004452 // TODO: remove //apex_available:platform
4453 apex_available: [
4454 "//apex_available:platform",
4455 "myapex",
4456 ],
Alex Light0851b882019-02-07 13:20:53 -08004457 }
4458 `)
4459
Jooyung Hana0503a52023-08-23 13:12:50 +09004460 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004461 apexRule := module.Rule("apexRule")
4462 copyCmds := apexRule.Args["copy_commands"]
4463
4464 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4465 t.Log("Apex was not a test apex!")
4466 t.Fail()
4467 }
4468 // Ensure that main rule creates an output
4469 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4470
4471 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004473
4474 // Ensure that both direct and indirect deps are copied into apex
4475 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4476
Colin Cross7113d202019-11-20 16:39:12 -08004477 // Ensure that the platform variant ends with _shared
4478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004479}
4480
Jooyung Han85707de2023-12-01 14:21:13 +09004481func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004482 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004483 ctx := testApex(t, `
4484 apex {
4485 name: "myapex",
4486 key: "myapex.key",
4487 updatable: false,
4488 binaries: ["mybin"],
4489 }
4490 apex {
4491 name: "myvendorapex",
4492 key: "myapex.key",
4493 file_contexts: "myvendorapex_file_contexts",
4494 vendor: true,
4495 updatable: false,
4496 binaries: ["mybin"],
4497 }
4498 apex_key {
4499 name: "myapex.key",
4500 public_key: "testkey.avbpubkey",
4501 private_key: "testkey.pem",
4502 }
4503 cc_binary {
4504 name: "mybin",
4505 vendor_available: true,
4506 system_shared_libs: [],
4507 stl: "none",
4508 shared_libs: ["libz"],
4509 apex_available: ["//apex_available:anyapex"],
4510 }
4511 cc_library {
4512 name: "libz",
4513 vendor_available: true,
4514 system_shared_libs: [],
4515 stl: "none",
4516 stubs: {
4517 versions: ["28", "30"],
4518 },
4519 target: {
4520 vendor: {
4521 no_stubs: true,
4522 },
4523 },
4524 }
4525 `, withFiles(map[string][]byte{
4526 "myvendorapex_file_contexts": nil,
4527 }))
4528
4529 // libz provides stubs for core variant.
4530 {
4531 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4532 "bin/mybin",
4533 })
4534 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4535 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4536 }
4537 // libz doesn't provide stubs for vendor variant.
4538 {
4539 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4540 "bin/mybin",
4541 "lib64/libz.so",
4542 })
4543 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4544 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4545 }
4546}
4547
Alex Light9670d332019-01-29 18:07:33 -08004548func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004549 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004550 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004551 apex {
4552 name: "myapex",
4553 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004554 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004555 multilib: {
4556 first: {
4557 native_shared_libs: ["mylib_common"],
4558 }
4559 },
4560 target: {
4561 android: {
4562 multilib: {
4563 first: {
4564 native_shared_libs: ["mylib"],
4565 }
4566 }
4567 },
4568 host: {
4569 multilib: {
4570 first: {
4571 native_shared_libs: ["mylib2"],
4572 }
4573 }
4574 }
4575 }
4576 }
4577
4578 apex_key {
4579 name: "myapex.key",
4580 public_key: "testkey.avbpubkey",
4581 private_key: "testkey.pem",
4582 }
4583
4584 cc_library {
4585 name: "mylib",
4586 srcs: ["mylib.cpp"],
4587 system_shared_libs: [],
4588 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004589 // TODO: remove //apex_available:platform
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
Alex Light9670d332019-01-29 18:07:33 -08004594 }
4595
4596 cc_library {
4597 name: "mylib_common",
4598 srcs: ["mylib.cpp"],
4599 system_shared_libs: [],
4600 stl: "none",
4601 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004602 // TODO: remove //apex_available:platform
4603 apex_available: [
4604 "//apex_available:platform",
4605 "myapex",
4606 ],
Alex Light9670d332019-01-29 18:07:33 -08004607 }
4608
4609 cc_library {
4610 name: "mylib2",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 compile_multilib: "first",
4615 }
4616 `)
4617
Jooyung Hana0503a52023-08-23 13:12:50 +09004618 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004619 copyCmds := apexRule.Args["copy_commands"]
4620
4621 // Ensure that main rule creates an output
4622 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4623
4624 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004625 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4626 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4627 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004628
4629 // Ensure that both direct and indirect deps are copied into apex
4630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4631 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4632 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4633
Colin Cross7113d202019-11-20 16:39:12 -08004634 // Ensure that the platform variant ends with _shared
4635 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4636 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4637 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004638}
Jiyong Park04480cf2019-02-06 00:16:29 +09004639
Jiyong Park59140302020-12-14 18:44:04 +09004640func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004641 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004647 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 arch: {
4649 arm64: {
4650 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 x86_64: {
4654 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004655 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004656 },
4657 }
4658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004667 name: "mylib.generic",
4668 srcs: ["mylib.cpp"],
4669 system_shared_libs: [],
4670 stl: "none",
4671 // TODO: remove //apex_available:platform
4672 apex_available: [
4673 "//apex_available:platform",
4674 "myapex",
4675 ],
4676 }
4677
4678 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004679 name: "mylib.arm64",
4680 srcs: ["mylib.cpp"],
4681 system_shared_libs: [],
4682 stl: "none",
4683 // TODO: remove //apex_available:platform
4684 apex_available: [
4685 "//apex_available:platform",
4686 "myapex",
4687 ],
4688 }
4689
4690 cc_library {
4691 name: "mylib.x64",
4692 srcs: ["mylib.cpp"],
4693 system_shared_libs: [],
4694 stl: "none",
4695 // TODO: remove //apex_available:platform
4696 apex_available: [
4697 "//apex_available:platform",
4698 "myapex",
4699 ],
4700 }
4701 `)
4702
Jooyung Hana0503a52023-08-23 13:12:50 +09004703 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004704 copyCmds := apexRule.Args["copy_commands"]
4705
4706 // Ensure that apex variant is created for the direct dep
4707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004708 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004709 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4710
4711 // Ensure that both direct and indirect deps are copied into apex
4712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4713 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4714}
4715
Jiyong Park04480cf2019-02-06 00:16:29 +09004716func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004718 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004719 apex {
4720 name: "myapex",
4721 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004722 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004723 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004724 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004725 }
4726
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732
4733 sh_binary {
4734 name: "myscript",
4735 src: "mylib.cpp",
4736 filename: "myscript.sh",
4737 sub_dir: "script",
4738 }
4739 `)
4740
Jooyung Hana0503a52023-08-23 13:12:50 +09004741 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004742 copyCmds := apexRule.Args["copy_commands"]
4743
4744 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4745}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004746
Jooyung Han91df2082019-11-20 01:49:42 +09004747func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004748 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004749 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004750 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004751 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004752 {"", "system"},
4753 {"product_specific: true", "product"},
4754 {"soc_specific: true", "vendor"},
4755 {"proprietary: true", "vendor"},
4756 {"vendor: true", "vendor"},
4757 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004758 }
4759 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004760 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004761 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004762 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004763 apex {
4764 name: "myapex",
4765 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004766 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004767 `+tc.propName+`
4768 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004769
Jooyung Han91df2082019-11-20 01:49:42 +09004770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004776
Jooyung Hana0503a52023-08-23 13:12:50 +09004777 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004778 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004779 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004780 if actual != expected {
4781 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4782 }
Jooyung Han91df2082019-11-20 01:49:42 +09004783 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785}
Jiyong Park67882562019-03-21 01:11:21 +09004786
Jooyung Han580eb4f2020-06-24 19:33:06 +09004787func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004788 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004789 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 apex {
4791 name: "myapex",
4792 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004793 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004795
Jooyung Han580eb4f2020-06-24 19:33:06 +09004796 apex_key {
4797 name: "myapex.key",
4798 public_key: "testkey.avbpubkey",
4799 private_key: "testkey.pem",
4800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004802 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803 rule := module.Output("file_contexts")
4804 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4805}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806
Jooyung Han580eb4f2020-06-24 19:33:06 +09004807func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004808 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004809 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 apex {
4811 name: "myapex",
4812 key: "myapex.key",
4813 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004814 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004816
Jooyung Han580eb4f2020-06-24 19:33:06 +09004817 apex_key {
4818 name: "myapex.key",
4819 public_key: "testkey.avbpubkey",
4820 private_key: "testkey.pem",
4821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822 `, withFiles(map[string][]byte{
4823 "my_own_file_contexts": nil,
4824 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004825}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004826
Jooyung Han580eb4f2020-06-24 19:33:06 +09004827func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004828 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004829 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 product_specific: true,
4834 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004835 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004836 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004837
Jooyung Han580eb4f2020-06-24 19:33:06 +09004838 apex_key {
4839 name: "myapex.key",
4840 public_key: "testkey.avbpubkey",
4841 private_key: "testkey.pem",
4842 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004843 `)
4844
Colin Cross1c460562021-02-16 17:55:47 -08004845 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `, withFiles(map[string][]byte{
4860 "product_specific_file_contexts": nil,
4861 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004862 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863 rule := module.Output("file_contexts")
4864 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4865}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004866
Jooyung Han580eb4f2020-06-24 19:33:06 +09004867func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004868 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004869 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex {
4871 name: "myapex",
4872 key: "myapex.key",
4873 product_specific: true,
4874 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004875 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004876 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004877
Jooyung Han580eb4f2020-06-24 19:33:06 +09004878 apex_key {
4879 name: "myapex.key",
4880 public_key: "testkey.avbpubkey",
4881 private_key: "testkey.pem",
4882 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004883
Jooyung Han580eb4f2020-06-24 19:33:06 +09004884 filegroup {
4885 name: "my-file-contexts",
4886 srcs: ["product_specific_file_contexts"],
4887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004888 `, withFiles(map[string][]byte{
4889 "product_specific_file_contexts": nil,
4890 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004891 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 rule := module.Output("file_contexts")
4893 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004894}
4895
Jiyong Park67882562019-03-21 01:11:21 +09004896func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004898 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004899 apex_key {
4900 name: "myapex.key",
4901 public_key: ":my.avbpubkey",
4902 private_key: ":my.pem",
4903 product_specific: true,
4904 }
4905
4906 filegroup {
4907 name: "my.avbpubkey",
4908 srcs: ["testkey2.avbpubkey"],
4909 }
4910
4911 filegroup {
4912 name: "my.pem",
4913 srcs: ["testkey2.pem"],
4914 }
4915 `)
4916
4917 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4918 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004919 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004920 if actual_pubkey != expected_pubkey {
4921 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4922 }
4923 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004924 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004925 if actual_privkey != expected_privkey {
4926 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4927 }
4928}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929
4930func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004931 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004932 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004933 prebuilt_apex {
4934 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004935 arch: {
4936 arm64: {
4937 src: "myapex-arm64.apex",
4938 },
4939 arm: {
4940 src: "myapex-arm.apex",
4941 },
4942 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004943 }
4944 `)
4945
Wei Li340ee8e2022-03-18 17:33:24 -07004946 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4947 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004948
Jiyong Parkc95714e2019-03-29 14:23:10 +09004949 expectedInput := "myapex-arm64.apex"
4950 if prebuilt.inputApex.String() != expectedInput {
4951 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4952 }
Wei Li340ee8e2022-03-18 17:33:24 -07004953 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4954 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4955 rule := testingModule.Rule("genProvenanceMetaData")
4956 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4957 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4958 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4959 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004960
4961 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4962 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004963}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004964
Paul Duffinc0609c62021-03-01 17:27:16 +00004965func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004967 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004968 prebuilt_apex {
4969 name: "myapex",
4970 }
4971 `)
4972}
4973
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004974func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004975 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004976 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004977 prebuilt_apex {
4978 name: "myapex",
4979 src: "myapex-arm.apex",
4980 filename: "notmyapex.apex",
4981 }
4982 `)
4983
Wei Li340ee8e2022-03-18 17:33:24 -07004984 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4985 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004986
4987 expected := "notmyapex.apex"
4988 if p.installFilename != expected {
4989 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4990 }
Wei Li340ee8e2022-03-18 17:33:24 -07004991 rule := testingModule.Rule("genProvenanceMetaData")
4992 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4993 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4994 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4995 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004996}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004997
Samiul Islam7c02e262021-09-08 17:48:28 +01004998func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004999 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005000 testApex(t, `
5001 apex_set {
5002 name: "com.company.android.myapex",
5003 apex_name: "com.android.myapex",
5004 set: "company-myapex.apks",
5005 filename: "com.company.android.myapex.apex"
5006 }
5007 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5008
5009 testApex(t, `
5010 apex_set {
5011 name: "com.company.android.myapex",
5012 apex_name: "com.android.myapex",
5013 set: "company-myapex.apks",
5014 filename: "com.company.android.myapex.capex"
5015 }
5016 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5017
5018 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5019 apex_set {
5020 name: "com.company.android.myapex",
5021 apex_name: "com.android.myapex",
5022 set: "company-myapex.apks",
5023 filename: "some-random-suffix"
5024 }
5025 `)
5026}
5027
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005028func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005029 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005030 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005031 prebuilt_apex {
5032 name: "myapex.prebuilt",
5033 src: "myapex-arm.apex",
5034 overrides: [
5035 "myapex",
5036 ],
5037 }
5038 `)
5039
Wei Li340ee8e2022-03-18 17:33:24 -07005040 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5041 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005042
5043 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005044 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005045 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005046 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 }
Wei Li340ee8e2022-03-18 17:33:24 -07005048 rule := testingModule.Rule("genProvenanceMetaData")
5049 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5050 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5051 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5052 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005053}
5054
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005055func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005056 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005057 testApex(t, `
5058 prebuilt_apex {
5059 name: "com.company.android.myapex",
5060 apex_name: "com.android.myapex",
5061 src: "company-myapex-arm.apex",
5062 }
5063 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5064
5065 testApex(t, `
5066 apex_set {
5067 name: "com.company.android.myapex",
5068 apex_name: "com.android.myapex",
5069 set: "company-myapex.apks",
5070 }
5071 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5072}
5073
5074func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005075 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005076 _ = android.GroupFixturePreparers(
5077 java.PrepareForTestWithJavaDefaultModules,
5078 PrepareForTestWithApexBuildComponents,
5079 android.FixtureWithRootAndroidBp(`
5080 platform_bootclasspath {
5081 name: "platform-bootclasspath",
5082 fragments: [
5083 {
5084 apex: "com.android.art",
5085 module: "art-bootclasspath-fragment",
5086 },
5087 ],
5088 }
5089
5090 prebuilt_apex {
5091 name: "com.company.android.art",
5092 apex_name: "com.android.art",
5093 src: "com.company.android.art-arm.apex",
5094 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5095 }
5096
5097 prebuilt_bootclasspath_fragment {
5098 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005099 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005100 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005101 hidden_api: {
5102 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5103 metadata: "my-bootclasspath-fragment/metadata.csv",
5104 index: "my-bootclasspath-fragment/index.csv",
5105 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5106 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5107 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005108 }
5109
5110 java_import {
5111 name: "core-oj",
5112 jars: ["prebuilt.jar"],
5113 }
5114 `),
5115 ).RunTest(t)
5116}
5117
Spandan Das59a4a2b2024-01-09 21:35:56 +00005118// A minimal context object for use with DexJarBuildPath
5119type moduleErrorfTestCtx struct {
5120}
5121
5122func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5123}
5124
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005126 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005127 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005128 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005129 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5130 // is disabled.
5131 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005132
5133 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5134 // file creation.
5135 java.FixtureConfigureBootJars("platform:foo"),
5136 android.FixtureModifyMockFS(func(fs android.MockFS) {
5137 fs["platform/Android.bp"] = []byte(`
5138 java_library {
5139 name: "foo",
5140 srcs: ["Test.java"],
5141 compile_dex: true,
5142 }
5143 `)
5144 fs["platform/Test.java"] = nil
5145 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005146 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005147
Paul Duffin40a3f652021-07-19 13:11:24 +01005148 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005149 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005150 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005151 var rule android.TestingBuildParams
5152
5153 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5154 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005155 }
5156
Paul Duffin40a3f652021-07-19 13:11:24 +01005157 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5158 t.Helper()
5159 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5160 var rule android.TestingBuildParams
5161
5162 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5163 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5164 }
5165
Paul Duffin89f570a2021-06-16 01:42:33 +01005166 fragment := java.ApexVariantReference{
5167 Apex: proptools.StringPtr("myapex"),
5168 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5169 }
5170
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005172 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005173 bp := `
5174 prebuilt_apex {
5175 name: "myapex",
5176 arch: {
5177 arm64: {
5178 src: "myapex-arm64.apex",
5179 },
5180 arm: {
5181 src: "myapex-arm.apex",
5182 },
5183 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005184 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5185 }
5186
5187 prebuilt_bootclasspath_fragment {
5188 name: "my-bootclasspath-fragment",
5189 contents: ["libfoo", "libbar"],
5190 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005191 hidden_api: {
5192 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5193 metadata: "my-bootclasspath-fragment/metadata.csv",
5194 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005195 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5196 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5197 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005198 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005199 }
5200
Spandan Das52c01a12024-09-20 01:09:48 +00005201 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005203 public: {
5204 jars: ["libfoo.jar"],
5205 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005206 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005207 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005209 }
Paul Duffin37856732021-02-26 14:24:15 +00005210
5211 java_sdk_library_import {
5212 name: "libbar",
5213 public: {
5214 jars: ["libbar.jar"],
5215 },
5216 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005217 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005218 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005219 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005220 `
5221
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005223
Paul Duffin537ea3d2021-05-14 10:38:00 +01005224 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005225 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005226 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005227 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005228 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005229 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005230 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005231 })
5232
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005233 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005234 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005235 bp := `
5236 apex_set {
5237 name: "myapex",
5238 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005240 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5241 }
5242
Paul Duffin89f570a2021-06-16 01:42:33 +01005243 prebuilt_bootclasspath_fragment {
5244 name: "my-bootclasspath-fragment",
5245 contents: ["libfoo", "libbar"],
5246 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005247 hidden_api: {
5248 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5249 metadata: "my-bootclasspath-fragment/metadata.csv",
5250 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005251 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5252 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5253 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005254 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005255 }
5256
Liz Kammer2dc72442023-04-20 10:10:48 -04005257 prebuilt_systemserverclasspath_fragment {
5258 name: "my-systemserverclasspath-fragment",
5259 contents: ["libbaz"],
5260 apex_available: ["myapex"],
5261 }
5262
Spandan Das52c01a12024-09-20 01:09:48 +00005263 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005265 public: {
5266 jars: ["libfoo.jar"],
5267 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005268 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005269 shared_library: false,
5270 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Spandan Das52c01a12024-09-20 01:09:48 +00005273
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 java_sdk_library_import {
5275 name: "libbar",
5276 public: {
5277 jars: ["libbar.jar"],
5278 },
5279 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005280 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005281 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005282 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005283
5284 java_sdk_library_import {
5285 name: "libbaz",
5286 public: {
5287 jars: ["libbaz.jar"],
5288 },
5289 apex_available: ["myapex"],
5290 shared_library: false,
5291 permitted_packages: ["baz"],
5292 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005293 `
5294
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005296
Paul Duffin537ea3d2021-05-14 10:38:00 +01005297 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005298 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005300 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005301 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005302 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005303 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005304
5305 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5306
5307 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005308 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005309 "myjavalib.myapex",
5310 "libfoo.myapex",
5311 "libbar.myapex",
5312 "libbaz.myapex",
5313 }
5314 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5315 for i, e := range mkEntries {
5316 g := e.OverrideName
5317 if w := overrideNames[i]; w != g {
5318 t.Errorf("Expected override name %q, got %q", w, g)
5319 }
5320 }
5321
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005322 })
5323
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005325 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 bp := `
5327 prebuilt_apex {
5328 name: "myapex",
5329 arch: {
5330 arm64: {
5331 src: "myapex-arm64.apex",
5332 },
5333 arm: {
5334 src: "myapex-arm.apex",
5335 },
5336 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005337 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5338 }
5339
5340 prebuilt_bootclasspath_fragment {
5341 name: "my-bootclasspath-fragment",
5342 contents: ["libfoo", "libbar"],
5343 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005344 hidden_api: {
5345 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5346 metadata: "my-bootclasspath-fragment/metadata.csv",
5347 index: "my-bootclasspath-fragment/index.csv",
5348 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5349 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5350 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005351 }
5352
5353 java_import {
5354 name: "libfoo",
5355 jars: ["libfoo.jar"],
5356 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005357 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005358 }
5359
5360 java_library {
5361 name: "libfoo",
5362 srcs: ["foo/bar/MyClass.java"],
5363 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005364 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005365 }
Paul Duffin37856732021-02-26 14:24:15 +00005366
5367 java_sdk_library_import {
5368 name: "libbar",
5369 public: {
5370 jars: ["libbar.jar"],
5371 },
5372 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005373 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005374 }
5375
5376 java_sdk_library {
5377 name: "libbar",
5378 srcs: ["foo/bar/MyClass.java"],
5379 unsafe_ignore_missing_latest_api: true,
5380 apex_available: ["myapex"],
5381 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 `
5383
5384 // In this test the source (java_library) libfoo is active since the
5385 // prebuilt (java_import) defaults to prefer:false. However the
5386 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5387 // find the dex boot jar in it. We either need to disable the source libfoo
5388 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005390 // dexbootjar check is skipped if AllowMissingDependencies is true
5391 preparerAllowMissingDeps := android.GroupFixturePreparers(
5392 preparer,
5393 android.PrepareForTestWithAllowMissingDependencies,
5394 )
5395 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 })
5397
5398 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005399 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005401 apex {
5402 name: "myapex",
5403 key: "myapex.key",
5404 updatable: false,
5405 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5406 }
5407
5408 apex_key {
5409 name: "myapex.key",
5410 public_key: "testkey.avbpubkey",
5411 private_key: "testkey.pem",
5412 }
5413
5414 bootclasspath_fragment {
5415 name: "my-bootclasspath-fragment",
5416 contents: ["libfoo", "libbar"],
5417 apex_available: ["myapex"],
5418 hidden_api: {
5419 split_packages: ["*"],
5420 },
5421 }
5422
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005423 prebuilt_apex {
5424 name: "myapex",
5425 arch: {
5426 arm64: {
5427 src: "myapex-arm64.apex",
5428 },
5429 arm: {
5430 src: "myapex-arm.apex",
5431 },
5432 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005433 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5434 }
5435
5436 prebuilt_bootclasspath_fragment {
5437 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005438 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 contents: ["libfoo", "libbar"],
5440 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005441 hidden_api: {
5442 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5443 metadata: "my-bootclasspath-fragment/metadata.csv",
5444 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005445 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5446 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5447 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005448 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005449 }
5450
Spandan Das52c01a12024-09-20 01:09:48 +00005451 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 name: "libfoo",
5453 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005454 public: {
5455 jars: ["libfoo.jar"],
5456 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005458 shared_library: false,
5459 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 }
5461
5462 java_library {
5463 name: "libfoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005466 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005467 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
Paul Duffin37856732021-02-26 14:24:15 +00005469
5470 java_sdk_library_import {
5471 name: "libbar",
5472 prefer: true,
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005477 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005478 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005479 }
5480
5481 java_sdk_library {
5482 name: "libbar",
5483 srcs: ["foo/bar/MyClass.java"],
5484 unsafe_ignore_missing_latest_api: true,
5485 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005486 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005487 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005488 `
5489
Paul Duffin89f570a2021-06-16 01:42:33 +01005490 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005491
Paul Duffin537ea3d2021-05-14 10:38:00 +01005492 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005493 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005494 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005495 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005496 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005497 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005498 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 })
5500
5501 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005502 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503 bp := `
5504 apex {
5505 name: "myapex",
5506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005507 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005508 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 }
5510
5511 apex_key {
5512 name: "myapex.key",
5513 public_key: "testkey.avbpubkey",
5514 private_key: "testkey.pem",
5515 }
5516
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005517 bootclasspath_fragment {
5518 name: "my-bootclasspath-fragment",
5519 contents: ["libfoo", "libbar"],
5520 apex_available: ["myapex"],
5521 hidden_api: {
5522 split_packages: ["*"],
5523 },
5524 }
5525
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 prebuilt_apex {
5527 name: "myapex",
5528 arch: {
5529 arm64: {
5530 src: "myapex-arm64.apex",
5531 },
5532 arm: {
5533 src: "myapex-arm.apex",
5534 },
5535 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005536 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5537 }
5538
5539 prebuilt_bootclasspath_fragment {
5540 name: "my-bootclasspath-fragment",
5541 contents: ["libfoo", "libbar"],
5542 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005543 hidden_api: {
5544 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5545 metadata: "my-bootclasspath-fragment/metadata.csv",
5546 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005547 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5548 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5549 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005550 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005551 }
5552
5553 java_import {
5554 name: "libfoo",
5555 jars: ["libfoo.jar"],
5556 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005557 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 }
5559
5560 java_library {
5561 name: "libfoo",
5562 srcs: ["foo/bar/MyClass.java"],
5563 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005564 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005565 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005566 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
Paul Duffin37856732021-02-26 14:24:15 +00005568
5569 java_sdk_library_import {
5570 name: "libbar",
5571 public: {
5572 jars: ["libbar.jar"],
5573 },
5574 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005575 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005576 }
5577
5578 java_sdk_library {
5579 name: "libbar",
5580 srcs: ["foo/bar/MyClass.java"],
5581 unsafe_ignore_missing_latest_api: true,
5582 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005583 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005584 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005585 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005586 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005587 `
5588
Paul Duffin89f570a2021-06-16 01:42:33 +01005589 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005590
Paul Duffin537ea3d2021-05-14 10:38:00 +01005591 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005592 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5594 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005595 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5596 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 })
5599
5600 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005601 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005602 bp := `
5603 apex {
5604 name: "myapex",
5605 enabled: false,
5606 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005607 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 }
5609
5610 apex_key {
5611 name: "myapex.key",
5612 public_key: "testkey.avbpubkey",
5613 private_key: "testkey.pem",
5614 }
5615
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005616 bootclasspath_fragment {
5617 name: "my-bootclasspath-fragment",
5618 enabled: false,
5619 contents: ["libfoo", "libbar"],
5620 apex_available: ["myapex"],
5621 hidden_api: {
5622 split_packages: ["*"],
5623 },
5624 }
5625
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005626 prebuilt_apex {
5627 name: "myapex",
5628 arch: {
5629 arm64: {
5630 src: "myapex-arm64.apex",
5631 },
5632 arm: {
5633 src: "myapex-arm.apex",
5634 },
5635 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005636 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5637 }
5638
5639 prebuilt_bootclasspath_fragment {
5640 name: "my-bootclasspath-fragment",
5641 contents: ["libfoo", "libbar"],
5642 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005643 hidden_api: {
5644 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5645 metadata: "my-bootclasspath-fragment/metadata.csv",
5646 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005647 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5648 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5649 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005650 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 }
5652
5653 java_import {
5654 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005655 jars: ["libfoo.jar"],
5656 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005657 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005658 }
5659
5660 java_library {
5661 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005662 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005663 srcs: ["foo/bar/MyClass.java"],
5664 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005665 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005666 }
Paul Duffin37856732021-02-26 14:24:15 +00005667
5668 java_sdk_library_import {
5669 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005670 public: {
5671 jars: ["libbar.jar"],
5672 },
5673 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005674 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005675 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005676 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005677 }
5678
5679 java_sdk_library {
5680 name: "libbar",
5681 srcs: ["foo/bar/MyClass.java"],
5682 unsafe_ignore_missing_latest_api: true,
5683 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005684 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005685 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005686 `
Cole Fausta963b942024-04-11 17:43:00 -07005687 // This test disables libbar, which causes the ComponentDepsMutator to add
5688 // deps on libbar.stubs and other sub-modules that don't exist. We can
5689 // enable AllowMissingDependencies to work around that, but enabling that
5690 // causes extra checks for missing source files to dex_bootjars, so add those
5691 // to the mock fs as well.
5692 preparer2 := android.GroupFixturePreparers(
5693 preparer,
5694 android.PrepareForTestWithAllowMissingDependencies,
5695 android.FixtureMergeMockFs(map[string][]byte{
5696 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005697 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005698 }),
5699 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005700
Cole Fausta963b942024-04-11 17:43:00 -07005701 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005702
Paul Duffin537ea3d2021-05-14 10:38:00 +01005703 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005704 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005705 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005706 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005707 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005708 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005709 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005710 })
Spandan Das3a392012024-01-17 18:26:27 +00005711
Spandan Dasf2c10572024-02-27 04:49:52 +00005712 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005713 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005714 bp := `
5715 // Source
5716 apex {
5717 name: "myapex",
5718 enabled: false,
5719 key: "myapex.key",
5720 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 // Prebuilt
5730 prebuilt_apex {
5731 name: "myapex.v1",
5732 source_apex_name: "myapex",
5733 arch: {
5734 arm64: {
5735 src: "myapex-arm64.apex",
5736 },
5737 arm: {
5738 src: "myapex-arm.apex",
5739 },
5740 },
5741 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5742 prefer: true,
5743 }
5744 prebuilt_apex {
5745 name: "myapex.v2",
5746 source_apex_name: "myapex",
5747 arch: {
5748 arm64: {
5749 src: "myapex-arm64.apex",
5750 },
5751 arm: {
5752 src: "myapex-arm.apex",
5753 },
5754 },
5755 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5756 prefer: true,
5757 }
5758
5759 prebuilt_bootclasspath_fragment {
5760 name: "my-bootclasspath-fragment",
5761 contents: ["libfoo", "libbar"],
5762 apex_available: ["myapex"],
5763 hidden_api: {
5764 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5765 metadata: "my-bootclasspath-fragment/metadata.csv",
5766 index: "my-bootclasspath-fragment/index.csv",
5767 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5768 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5769 },
5770 prefer: true,
5771 }
5772
5773 java_import {
5774 name: "libfoo",
5775 jars: ["libfoo.jar"],
5776 apex_available: ["myapex"],
5777 prefer: true,
5778 }
5779 java_import {
5780 name: "libbar",
5781 jars: ["libbar.jar"],
5782 apex_available: ["myapex"],
5783 prefer: true,
5784 }
5785 `
5786
Spandan Dasf2c10572024-02-27 04:49:52 +00005787 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005788 })
5789
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005790}
5791
Roland Levillain630846d2019-06-26 12:48:34 +01005792func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005793 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005794 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005795 apex_test {
5796 name: "myapex",
5797 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005798 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005799 tests: [
5800 "mytest",
5801 ],
5802 }
5803
5804 apex_key {
5805 name: "myapex.key",
5806 public_key: "testkey.avbpubkey",
5807 private_key: "testkey.pem",
5808 }
5809
Liz Kammer1c14a212020-05-12 15:26:55 -07005810 filegroup {
5811 name: "fg",
5812 srcs: [
5813 "baz",
5814 "bar/baz"
5815 ],
5816 }
5817
Roland Levillain630846d2019-06-26 12:48:34 +01005818 cc_test {
5819 name: "mytest",
5820 gtest: false,
5821 srcs: ["mytest.cpp"],
5822 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005823 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005824 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005825 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005826 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005827 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005828
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005829 cc_library {
5830 name: "mylib",
5831 srcs: ["mylib.cpp"],
5832 system_shared_libs: [],
5833 stl: "none",
5834 }
5835
Liz Kammer5bd365f2020-05-27 15:15:11 -07005836 filegroup {
5837 name: "fg2",
5838 srcs: [
5839 "testdata/baz"
5840 ],
5841 }
Roland Levillain630846d2019-06-26 12:48:34 +01005842 `)
5843
Jooyung Hana0503a52023-08-23 13:12:50 +09005844 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005845 copyCmds := apexRule.Args["copy_commands"]
5846
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005847 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005848 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005849 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005850
Liz Kammer1c14a212020-05-12 15:26:55 -07005851 //Ensure that test data are copied into apex.
5852 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5853 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5854
Roland Levillainf89cd092019-07-29 16:22:59 +01005855 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005856 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005857 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005858 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005859 prefix := "TARGET_"
5860 var builder strings.Builder
5861 data.Custom(&builder, name, prefix, "", data)
5862 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005863 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005864 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005865}
5866
Jooyung Hand48f3c32019-08-23 11:18:57 +09005867func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005868 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005869 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5870 apex {
5871 name: "myapex",
5872 key: "myapex.key",
5873 native_shared_libs: ["libfoo"],
5874 }
5875
5876 apex_key {
5877 name: "myapex.key",
5878 public_key: "testkey.avbpubkey",
5879 private_key: "testkey.pem",
5880 }
5881
5882 cc_library {
5883 name: "libfoo",
5884 stl: "none",
5885 system_shared_libs: [],
5886 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005887 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005888 }
5889 `)
5890 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5891 apex {
5892 name: "myapex",
5893 key: "myapex.key",
5894 java_libs: ["myjar"],
5895 }
5896
5897 apex_key {
5898 name: "myapex.key",
5899 public_key: "testkey.avbpubkey",
5900 private_key: "testkey.pem",
5901 }
5902
5903 java_library {
5904 name: "myjar",
5905 srcs: ["foo/bar/MyClass.java"],
5906 sdk_version: "none",
5907 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005908 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005909 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005910 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005911 }
5912 `)
5913}
5914
Bill Peckhama41a6962021-01-11 10:58:54 -08005915func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005916 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005917 apex {
5918 name: "myapex",
5919 key: "myapex.key",
5920 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005921 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005922 }
5923
5924 apex_key {
5925 name: "myapex.key",
5926 public_key: "testkey.avbpubkey",
5927 private_key: "testkey.pem",
5928 }
5929
5930 java_import {
5931 name: "myjavaimport",
5932 apex_available: ["myapex"],
5933 jars: ["my.jar"],
5934 compile_dex: true,
5935 }
5936 `)
5937
Jooyung Hana0503a52023-08-23 13:12:50 +09005938 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 apexRule := module.Rule("apexRule")
5940 copyCmds := apexRule.Args["copy_commands"]
5941 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5942}
5943
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005945 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 apps: [
5951 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005952 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005954 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005955 }
5956
5957 apex_key {
5958 name: "myapex.key",
5959 public_key: "testkey.avbpubkey",
5960 private_key: "testkey.pem",
5961 }
5962
5963 android_app {
5964 name: "AppFoo",
5965 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005967 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005968 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005969 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005971 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005973
5974 android_app {
5975 name: "AppFooPriv",
5976 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005977 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005978 system_modules: "none",
5979 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005980 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005981 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005982 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005983 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005984
5985 cc_library_shared {
5986 name: "libjni",
5987 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005988 shared_libs: ["libfoo"],
5989 stl: "none",
5990 system_shared_libs: [],
5991 apex_available: [ "myapex" ],
5992 sdk_version: "current",
5993 }
5994
5995 cc_library_shared {
5996 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 stl: "none",
5998 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005999 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006000 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006001 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 `)
6003
Jooyung Hana0503a52023-08-23 13:12:50 +09006004 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005 apexRule := module.Rule("apexRule")
6006 copyCmds := apexRule.Args["copy_commands"]
6007
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006008 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6009 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006010 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011
Colin Crossaede88c2020-08-11 12:17:01 -07006012 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006014 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006015 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006016 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // JNI libraries including transitive deps are
6018 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006019 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006020 // ... embedded inside APK (jnilibs.zip)
6021 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6022 // ... and not directly inside the APEX
6023 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6024 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006025
6026 apexBundle := module.Module().(*apexBundle)
6027 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6028 var builder strings.Builder
6029 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6030 androidMk := builder.String()
6031 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6032 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6033 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6034 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6035 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6036 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006037}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006038
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006039func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006040 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006041 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6042 for _, id := range invalidBuildIds {
6043 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6044 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6045 variables.BuildId = proptools.StringPtr(id)
6046 })
6047 testApexError(t, message, `apex {
6048 name: "myapex",
6049 key: "myapex.key",
6050 apps: ["AppFooPrebuilt"],
6051 updatable: false,
6052 }
6053
6054 apex_key {
6055 name: "myapex.key",
6056 public_key: "testkey.avbpubkey",
6057 private_key: "testkey.pem",
6058 }
6059
6060 android_app_import {
6061 name: "AppFooPrebuilt",
6062 apk: "PrebuiltAppFoo.apk",
6063 presigned: true,
6064 apex_available: ["myapex"],
6065 }
6066 `, fixture)
6067 }
6068}
6069
Dario Frenicde2a032019-10-27 00:29:22 +01006070func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006071 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006072 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006073 apex {
6074 name: "myapex",
6075 key: "myapex.key",
6076 apps: [
6077 "AppFooPrebuilt",
6078 "AppFooPrivPrebuilt",
6079 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006080 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006081 }
6082
6083 apex_key {
6084 name: "myapex.key",
6085 public_key: "testkey.avbpubkey",
6086 private_key: "testkey.pem",
6087 }
6088
6089 android_app_import {
6090 name: "AppFooPrebuilt",
6091 apk: "PrebuiltAppFoo.apk",
6092 presigned: true,
6093 dex_preopt: {
6094 enabled: false,
6095 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006096 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006097 }
6098
6099 android_app_import {
6100 name: "AppFooPrivPrebuilt",
6101 apk: "PrebuiltAppFooPriv.apk",
6102 privileged: true,
6103 presigned: true,
6104 dex_preopt: {
6105 enabled: false,
6106 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006107 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006108 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006109 }
6110 `)
6111
Jooyung Hana0503a52023-08-23 13:12:50 +09006112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006113 apexRule := module.Rule("apexRule")
6114 copyCmds := apexRule.Args["copy_commands"]
6115
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006116 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6117 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006118}
6119
6120func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006121 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 apps: [
6127 "AppFoo",
6128 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006129 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006130 }
6131
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }
6137
6138 android_app {
6139 name: "AppFoo",
6140 srcs: ["foo/bar/MyClass.java"],
6141 sdk_version: "none",
6142 system_modules: "none",
6143 apex_available: [ "myapex" ],
6144 }
6145
6146 android_app_import {
6147 name: "AppFoo",
6148 apk: "AppFooPrebuilt.apk",
6149 filename: "AppFooPrebuilt.apk",
6150 presigned: true,
6151 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006152 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006153 }
6154 `, withFiles(map[string][]byte{
6155 "AppFooPrebuilt.apk": nil,
6156 }))
6157
Jooyung Hana0503a52023-08-23 13:12:50 +09006158 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006159 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006160 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006161}
6162
Dario Freni6f3937c2019-12-20 22:58:03 +00006163func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006164 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006165 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 apps: [
6170 "TesterHelpAppFoo",
6171 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006172 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 android_test_helper_app {
6182 name: "TesterHelpAppFoo",
6183 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006184 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006185 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006186 }
6187
6188 `)
6189
Jooyung Hana0503a52023-08-23 13:12:50 +09006190 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191 apexRule := module.Rule("apexRule")
6192 copyCmds := apexRule.Args["copy_commands"]
6193
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006194 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006195}
6196
Jooyung Han18020ea2019-11-13 10:50:48 +09006197func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006198 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006199 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006200 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006201 apex {
6202 name: "myapex",
6203 key: "myapex.key",
6204 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006205 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006206 }
6207
6208 apex_key {
6209 name: "myapex.key",
6210 public_key: "testkey.avbpubkey",
6211 private_key: "testkey.pem",
6212 }
6213
6214 apex {
6215 name: "otherapex",
6216 key: "myapex.key",
6217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006218 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006219 }
6220
6221 cc_defaults {
6222 name: "libfoo-defaults",
6223 apex_available: ["otherapex"],
6224 }
6225
6226 cc_library {
6227 name: "libfoo",
6228 defaults: ["libfoo-defaults"],
6229 stl: "none",
6230 system_shared_libs: [],
6231 }`)
6232}
6233
Paul Duffine52e66f2020-03-30 17:54:29 +01006234func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006235 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006237 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006238 apex {
6239 name: "myapex",
6240 key: "myapex.key",
6241 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006242 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006243 }
6244
6245 apex_key {
6246 name: "myapex.key",
6247 public_key: "testkey.avbpubkey",
6248 private_key: "testkey.pem",
6249 }
6250
6251 apex {
6252 name: "otherapex",
6253 key: "otherapex.key",
6254 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006255 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 }
6257
6258 apex_key {
6259 name: "otherapex.key",
6260 public_key: "testkey.avbpubkey",
6261 private_key: "testkey.pem",
6262 }
6263
6264 cc_library {
6265 name: "libfoo",
6266 stl: "none",
6267 system_shared_libs: [],
6268 apex_available: ["otherapex"],
6269 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006270
6271 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6272 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6273 testApex(t, `
6274 apex {
6275 name: "com.sdv.myapex",
6276 key: "myapex.key",
6277 native_shared_libs: ["libfoo"],
6278 updatable: false,
6279 product_specific: true,
6280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 apex {
6289 name: "com.any.otherapex",
6290 key: "otherapex.key",
6291 native_shared_libs: ["libfoo"],
6292 updatable: false,
6293 }
6294
6295 apex_key {
6296 name: "otherapex.key",
6297 public_key: "testkey.avbpubkey",
6298 private_key: "testkey.pem",
6299 }
6300
6301 cc_library {
6302 name: "libfoo",
6303 stl: "none",
6304 system_shared_libs: [],
6305 apex_available: ["com.any.otherapex"],
6306 product_specific: true,
6307 }`,
6308 android.FixtureMergeMockFs(android.MockFS{
6309 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6310 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6311 }))
6312
6313 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6314 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6315 apex {
6316 name: "com.sdv.myapex",
6317 key: "myapex.key",
6318 native_shared_libs: ["libfoo"],
6319 updatable: false,
6320 }
6321
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327
6328 apex {
6329 name: "com.any.otherapex",
6330 key: "otherapex.key",
6331 native_shared_libs: ["libfoo"],
6332 updatable: false,
6333 }
6334
6335 apex_key {
6336 name: "otherapex.key",
6337 public_key: "testkey.avbpubkey",
6338 private_key: "testkey.pem",
6339 }
6340
6341 cc_library {
6342 name: "libfoo",
6343 stl: "none",
6344 system_shared_libs: [],
6345 apex_available: ["com.any.otherapex"],
6346 }`,
6347 android.FixtureMergeMockFs(android.MockFS{
6348 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6349 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6350 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006351}
Jiyong Park127b40b2019-09-30 16:04:35 +09006352
Paul Duffine52e66f2020-03-30 17:54:29 +01006353func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006354 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006355 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006356 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006357.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006358.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006359.*via tag cc\.dependencyTag.*
6360.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006361.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006362.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006363.*via tag cc\.dependencyTag.*
6364.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006365.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006366.*-> libbaz.*link:shared.*
6367.*via tag cc\.dependencyTag.*
6368.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
Jiyong Park127b40b2019-09-30 16:04:35 +09006382 cc_library {
6383 name: "libfoo",
6384 stl: "none",
6385 shared_libs: ["libbar"],
6386 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006387 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006388 }
6389
6390 cc_library {
6391 name: "libbar",
6392 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006393 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006394 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006395 apex_available: ["myapex"],
6396 }
6397
6398 cc_library {
6399 name: "libbaz",
6400 stl: "none",
6401 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006402 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006403
6404 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6405 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6406 testApex(t, `
6407 apex {
6408 name: "com.sdv.myapex",
6409 key: "myapex.key",
6410 native_shared_libs: ["libfoo"],
6411 updatable: false,
6412 product_specific: true,
6413 }
6414
6415 apex_key {
6416 name: "myapex.key",
6417 public_key: "testkey.avbpubkey",
6418 private_key: "testkey.pem",
6419 }
6420
6421 cc_library {
6422 name: "libfoo",
6423 stl: "none",
6424 shared_libs: ["libbar"],
6425 system_shared_libs: [],
6426 apex_available: ["com.sdv.myapex"],
6427 product_specific: true,
6428 }
6429
6430 cc_library {
6431 name: "libbar",
6432 stl: "none",
6433 shared_libs: ["libbaz"],
6434 system_shared_libs: [],
6435 apex_available: ["com.sdv.myapex"],
6436 product_specific: true,
6437 }
6438
6439 cc_library {
6440 name: "libbaz",
6441 stl: "none",
6442 system_shared_libs: [],
6443 product_specific: true,
6444 }`,
6445 android.FixtureMergeMockFs(android.MockFS{
6446 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6447 }))
6448
6449 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6450 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6451 apex {
6452 name: "com.sdv.myapex",
6453 key: "myapex.key",
6454 native_shared_libs: ["libfoo"],
6455 updatable: false,
6456 }
6457
6458 apex_key {
6459 name: "myapex.key",
6460 public_key: "testkey.avbpubkey",
6461 private_key: "testkey.pem",
6462 }
6463
6464 cc_library {
6465 name: "libfoo",
6466 stl: "none",
6467 shared_libs: ["libbar"],
6468 system_shared_libs: [],
6469 apex_available: ["com.sdv.myapex"],
6470 }
6471
6472 cc_library {
6473 name: "libbar",
6474 stl: "none",
6475 shared_libs: ["libbaz"],
6476 system_shared_libs: [],
6477 apex_available: ["com.sdv.myapex"],
6478 }
6479
6480 cc_library {
6481 name: "libbaz",
6482 stl: "none",
6483 system_shared_libs: [],
6484 }`,
6485 android.FixtureMergeMockFs(android.MockFS{
6486 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6487 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006488}
Jiyong Park127b40b2019-09-30 16:04:35 +09006489
Liz Kammer5f108fa2023-05-11 14:33:17 -04006490func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006491 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006492 testApex(t, `
6493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["libfoo"],
6497 updatable: false,
6498 }
6499
6500 apex_key {
6501 name: "myapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 static_libs: ["libbar"],
6510 system_shared_libs: [],
6511 apex_available: ["myapex"],
6512 }
6513
6514 cc_library {
6515 name: "libbar",
6516 stl: "none",
6517 shared_libs: ["libbaz"],
6518 system_shared_libs: [],
6519 apex_available: ["myapex"],
6520 }
6521
6522 cc_library {
6523 name: "libbaz",
6524 stl: "none",
6525 system_shared_libs: [],
6526 }`)
6527
6528 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6529 apex {
6530 name: "myapex",
6531 key: "myapex.key",
6532 native_shared_libs: ["libfoo"],
6533 updatable: false,
6534 }
6535
6536 apex_key {
6537 name: "myapex.key",
6538 public_key: "testkey.avbpubkey",
6539 private_key: "testkey.pem",
6540 }
6541
6542 cc_library {
6543 name: "libfoo",
6544 stl: "none",
6545 static_libs: ["libbar"],
6546 system_shared_libs: [],
6547 apex_available: ["myapex"],
6548 }
6549
6550 cc_library {
6551 name: "libbar",
6552 stl: "none",
6553 system_shared_libs: [],
6554 }`)
6555}
6556
Paul Duffine52e66f2020-03-30 17:54:29 +01006557func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006558 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 testApexError(t, "\"otherapex\" is not a valid module name", `
6560 apex {
6561 name: "myapex",
6562 key: "myapex.key",
6563 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006564 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006565 }
6566
6567 apex_key {
6568 name: "myapex.key",
6569 public_key: "testkey.avbpubkey",
6570 private_key: "testkey.pem",
6571 }
6572
6573 cc_library {
6574 name: "libfoo",
6575 stl: "none",
6576 system_shared_libs: [],
6577 apex_available: ["otherapex"],
6578 }`)
6579
Paul Duffine52e66f2020-03-30 17:54:29 +01006580 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006581 apex {
6582 name: "myapex",
6583 key: "myapex.key",
6584 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006585 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006586 }
6587
6588 apex_key {
6589 name: "myapex.key",
6590 public_key: "testkey.avbpubkey",
6591 private_key: "testkey.pem",
6592 }
6593
6594 cc_library {
6595 name: "libfoo",
6596 stl: "none",
6597 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006598 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006599 apex_available: ["myapex"],
6600 }
6601
6602 cc_library {
6603 name: "libbar",
6604 stl: "none",
6605 system_shared_libs: [],
6606 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006607 }
6608
6609 cc_library {
6610 name: "libbaz",
6611 stl: "none",
6612 system_shared_libs: [],
6613 stubs: {
6614 versions: ["10", "20", "30"],
6615 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006616 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006617}
Jiyong Park127b40b2019-09-30 16:04:35 +09006618
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006619func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006620 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006621 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006622 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006623 testApexError(t, "expected an integer between 0-9; got -1", `
6624 apex {
6625 name: "myapex",
6626 key: "myapex.key",
6627 apex_available_name: "com.android.foo",
6628 variant_version: "-1",
6629 updatable: false,
6630 }
6631 apex_key {
6632 name: "myapex.key",
6633 public_key: "testkey.avbpubkey",
6634 private_key: "testkey.pem",
6635 }
6636 `)
6637 })
6638
6639 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006640 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006641 testApexError(t, "expected an integer between 0-9; got 10", `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 apex_available_name: "com.android.foo",
6646 variant_version: "10",
6647 updatable: false,
6648 }
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654 `)
6655 })
6656}
6657
6658func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006659 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006660 context := android.GroupFixturePreparers(
6661 android.PrepareForIntegrationTestWithAndroid,
6662 PrepareForTestWithApexBuildComponents,
6663 android.FixtureMergeMockFs(android.MockFS{
6664 "system/sepolicy/apex/foo-file_contexts": nil,
6665 "system/sepolicy/apex/bar-file_contexts": nil,
6666 }),
6667 )
6668 result := context.RunTestWithBp(t, `
6669 apex {
6670 name: "foo",
6671 key: "myapex.key",
6672 apex_available_name: "com.android.foo",
6673 variant_version: "0",
6674 updatable: false,
6675 }
6676 apex {
6677 name: "bar",
6678 key: "myapex.key",
6679 apex_available_name: "com.android.foo",
6680 variant_version: "3",
6681 updatable: false,
6682 }
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006688 override_apex {
6689 name: "myoverrideapex",
6690 base: "bar",
6691 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006692 `)
6693
Jooyung Hana0503a52023-08-23 13:12:50 +09006694 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006695 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006696 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6697 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6698 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6699 }
6700
Jooyung Hana0503a52023-08-23 13:12:50 +09006701 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006702 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006703 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6704 barActualDefaultVersion := barManifestRule.Args["default_version"]
6705 if barActualDefaultVersion != barExpectedDefaultVersion {
6706 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6707 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006708
Spandan Das50801e22024-05-13 18:29:45 +00006709 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006710 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6711 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6712 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6713 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006714}
6715
Sam Delmericoca816532023-06-02 14:09:50 -04006716func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006717 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006718 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006719 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006720 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6721 apex {
6722 name: "myapex_sminus",
6723 key: "myapex.key",
6724 apps: ["AppFoo"],
6725 apex_available_name: "myapex",
6726 updatable: false,
6727 }
6728 apex {
6729 name: "myapex",
6730 key: "myapex.key",
6731 apps: ["AppFoo"],
6732 updatable: false,
6733 }
6734 apex_key {
6735 name: "myapex.key",
6736 public_key: "testkey.avbpubkey",
6737 private_key: "testkey.pem",
6738 }
6739 android_app {
6740 name: "AppFoo",
6741 srcs: ["foo/bar/MyClass.java"],
6742 sdk_version: "none",
6743 system_modules: "none",
6744 apex_available: [ "myapex_sminus" ],
6745 }`,
6746 android.FixtureMergeMockFs(android.MockFS{
6747 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6748 }),
6749 )
6750 })
6751
6752 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006753 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006754 testApex(t, `
6755 apex {
6756 name: "myapex_sminus",
6757 key: "myapex.key",
6758 apps: ["AppFoo"],
6759 apex_available_name: "myapex",
6760 updatable: false,
6761 }
6762 apex {
6763 name: "myapex",
6764 key: "myapex.key",
6765 apps: ["AppFoo"],
6766 updatable: false,
6767 }
6768 apex_key {
6769 name: "myapex.key",
6770 public_key: "testkey.avbpubkey",
6771 private_key: "testkey.pem",
6772 }
6773 android_app {
6774 name: "AppFoo",
6775 srcs: ["foo/bar/MyClass.java"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 apex_available: [ "myapex" ],
6779 }`,
6780 android.FixtureMergeMockFs(android.MockFS{
6781 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6782 }),
6783 )
6784 })
6785
6786 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006787 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006788 testApex(t, `
6789 override_apex {
6790 name: "myoverrideapex_sminus",
6791 base: "myapex_sminus",
6792 key: "myapex.key",
6793 apps: ["AppFooOverride"],
6794 }
6795 override_apex {
6796 name: "myoverrideapex",
6797 base: "myapex",
6798 key: "myapex.key",
6799 apps: ["AppFooOverride"],
6800 }
6801 apex {
6802 name: "myapex_sminus",
6803 key: "myapex.key",
6804 apps: ["AppFoo"],
6805 apex_available_name: "myapex",
6806 updatable: false,
6807 }
6808 apex {
6809 name: "myapex",
6810 key: "myapex.key",
6811 apps: ["AppFoo"],
6812 updatable: false,
6813 }
6814 apex_key {
6815 name: "myapex.key",
6816 public_key: "testkey.avbpubkey",
6817 private_key: "testkey.pem",
6818 }
6819 android_app {
6820 name: "AppFooOverride",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 system_modules: "none",
6824 apex_available: [ "myapex" ],
6825 }
6826 android_app {
6827 name: "AppFoo",
6828 srcs: ["foo/bar/MyClass.java"],
6829 sdk_version: "none",
6830 system_modules: "none",
6831 apex_available: [ "myapex" ],
6832 }`,
6833 android.FixtureMergeMockFs(android.MockFS{
6834 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6835 }),
6836 )
6837 })
6838}
6839
6840func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006841 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006842 context := android.GroupFixturePreparers(
6843 android.PrepareForIntegrationTestWithAndroid,
6844 PrepareForTestWithApexBuildComponents,
6845 java.PrepareForTestWithDexpreopt,
6846 android.FixtureMergeMockFs(android.MockFS{
6847 "system/sepolicy/apex/myapex-file_contexts": nil,
6848 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6849 }),
6850 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6851 variables.BuildId = proptools.StringPtr("buildid")
6852 }),
6853 )
6854 context.RunTestWithBp(t, `
6855 override_apex {
6856 name: "myoverrideapex_sminus",
6857 base: "myapex_sminus",
6858 }
6859 override_apex {
6860 name: "myoverrideapex",
6861 base: "myapex",
6862 }
6863 apex {
6864 name: "myapex",
6865 key: "myapex.key",
6866 apps: ["AppFoo"],
6867 updatable: false,
6868 }
6869 apex {
6870 name: "myapex_sminus",
6871 apex_available_name: "myapex",
6872 key: "myapex.key",
6873 apps: ["AppFoo_sminus"],
6874 updatable: false,
6875 }
6876 apex_key {
6877 name: "myapex.key",
6878 public_key: "testkey.avbpubkey",
6879 private_key: "testkey.pem",
6880 }
6881 android_app {
6882 name: "AppFoo",
6883 srcs: ["foo/bar/MyClass.java"],
6884 sdk_version: "none",
6885 system_modules: "none",
6886 apex_available: [ "myapex" ],
6887 }
6888 android_app {
6889 name: "AppFoo_sminus",
6890 srcs: ["foo/bar/MyClass.java"],
6891 sdk_version: "none",
6892 min_sdk_version: "29",
6893 system_modules: "none",
6894 apex_available: [ "myapex" ],
6895 }`)
6896}
6897
Jiyong Park89e850a2020-04-07 16:37:39 +09006898func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006899 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006900 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006901 apex {
6902 name: "myapex",
6903 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006904 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006905 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006906 }
6907
6908 apex_key {
6909 name: "myapex.key",
6910 public_key: "testkey.avbpubkey",
6911 private_key: "testkey.pem",
6912 }
6913
6914 cc_library {
6915 name: "libfoo",
6916 stl: "none",
6917 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006918 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006919 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006920 }
6921
6922 cc_library {
6923 name: "libfoo2",
6924 stl: "none",
6925 system_shared_libs: [],
6926 shared_libs: ["libbaz"],
6927 apex_available: ["//apex_available:platform"],
6928 }
6929
6930 cc_library {
6931 name: "libbar",
6932 stl: "none",
6933 system_shared_libs: [],
6934 apex_available: ["myapex"],
6935 }
6936
6937 cc_library {
6938 name: "libbaz",
6939 stl: "none",
6940 system_shared_libs: [],
6941 apex_available: ["myapex"],
6942 stubs: {
6943 versions: ["1"],
6944 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006945 }`)
6946
Jiyong Park89e850a2020-04-07 16:37:39 +09006947 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6948 // because it depends on libbar which isn't available to platform
6949 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6950 if libfoo.NotAvailableForPlatform() != true {
6951 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6952 }
6953
6954 // libfoo2 however can be available to platform because it depends on libbaz which provides
6955 // stubs
6956 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6957 if libfoo2.NotAvailableForPlatform() == true {
6958 t.Errorf("%q should be available to platform", libfoo2.String())
6959 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006960}
Jiyong Parka90ca002019-10-07 15:47:24 +09006961
Paul Duffine52e66f2020-03-30 17:54:29 +01006962func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006963 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006964 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006965 apex {
6966 name: "myapex",
6967 key: "myapex.key",
6968 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006969 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006970 }
6971
6972 apex_key {
6973 name: "myapex.key",
6974 public_key: "testkey.avbpubkey",
6975 private_key: "testkey.pem",
6976 }
6977
6978 cc_library {
6979 name: "libfoo",
6980 stl: "none",
6981 system_shared_libs: [],
6982 apex_available: ["myapex"],
6983 static: {
6984 apex_available: ["//apex_available:platform"],
6985 },
6986 }`)
6987
Jiyong Park89e850a2020-04-07 16:37:39 +09006988 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6989 if libfooShared.NotAvailableForPlatform() != true {
6990 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6991 }
6992 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6993 if libfooStatic.NotAvailableForPlatform() != false {
6994 t.Errorf("%q should be available to platform", libfooStatic.String())
6995 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006996}
6997
Jooyung Han9a419e22024-08-16 17:14:21 +09006998func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006999 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007000
7001 for _, tc := range []struct {
7002 name string
7003 apexAvailable string
7004 expectedError string
7005 }{
7006 {
7007 name: "prefix matches correctly",
7008 apexAvailable: "com.foo.*",
7009 },
7010 {
7011 name: "prefix doesn't match",
7012 apexAvailable: "com.bar.*",
7013 expectedError: `Consider .* "com.foo\.\*"`,
7014 },
7015 {
7016 name: "short prefix",
7017 apexAvailable: "com.*",
7018 expectedError: "requires two or more components",
7019 },
7020 {
7021 name: "wildcard not in the end",
7022 apexAvailable: "com.*.foo",
7023 expectedError: "should end with .*",
7024 },
7025 {
7026 name: "wildcard in the middle",
7027 apexAvailable: "com.foo*.*",
7028 expectedError: "not allowed in the middle",
7029 },
7030 {
7031 name: "hint with prefix pattern",
7032 apexAvailable: "//apex_available:platform",
7033 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7034 },
7035 } {
7036 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007037 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007038 errorHandler := android.FixtureExpectsNoErrors
7039 if tc.expectedError != "" {
7040 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7041 }
7042 context := android.GroupFixturePreparers(
7043 prepareForApexTest,
7044 android.FixtureMergeMockFs(android.MockFS{
7045 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7046 }),
7047 ).ExtendWithErrorHandler(errorHandler)
7048
7049 context.RunTestWithBp(t, `
7050 apex {
7051 name: "com.foo.bar",
7052 key: "myapex.key",
7053 native_shared_libs: ["libfoo"],
7054 updatable: false,
7055 }
7056
7057 apex_key {
7058 name: "myapex.key",
7059 public_key: "testkey.avbpubkey",
7060 private_key: "testkey.pem",
7061 }
7062
7063 cc_library {
7064 name: "libfoo",
7065 stl: "none",
7066 system_shared_libs: [],
7067 apex_available: ["`+tc.apexAvailable+`"],
7068 }`)
7069 })
7070 }
7071 testApexError(t, `Consider adding "com.foo" to`, `
7072 apex {
7073 name: "com.foo", // too short for a partner apex
7074 key: "myapex.key",
7075 native_shared_libs: ["libfoo"],
7076 updatable: false,
7077 }
7078
7079 apex_key {
7080 name: "myapex.key",
7081 public_key: "testkey.avbpubkey",
7082 private_key: "testkey.pem",
7083 }
7084
7085 cc_library {
7086 name: "libfoo",
7087 stl: "none",
7088 system_shared_libs: [],
7089 }
7090 `)
7091}
7092
Jooyung Hanb9518072024-11-22 14:05:20 +09007093func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7094 t.Parallel()
7095 ctx := testApex(t, `
7096 apex_test {
7097 name: "myapex",
7098 key: "myapex.key",
7099 skip_validations: {
7100 host_apex_verifier: true,
7101 },
7102 updatable: false,
7103 }
7104 apex_key {
7105 name: "myapex.key",
7106 public_key: "testkey.avbpubkey",
7107 private_key: "testkey.pem",
7108 }
7109 `)
7110
7111 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7112 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7113 t.Error("should not run host_apex_verifier")
7114 }
7115}
7116
7117func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7118 t.Parallel()
7119 ctx := testApex(t, `
7120 apex_test {
7121 name: "myapex",
7122 key: "myapex.key",
7123 updatable: false,
7124 }
7125 apex_key {
7126 name: "myapex.key",
7127 public_key: "testkey.avbpubkey",
7128 private_key: "testkey.pem",
7129 }
7130 `)
7131
7132 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7133 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7134 t.Error("should run host_apex_verifier")
7135 }
7136}
7137
Jiyong Park5d790c32019-11-15 18:40:32 +09007138func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007139 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007140 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007141 apex {
7142 name: "myapex",
7143 key: "myapex.key",
7144 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007145 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007146 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007147 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007148 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007149 }
7150
7151 override_apex {
7152 name: "override_myapex",
7153 base: "myapex",
7154 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007155 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007156 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007157 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007158 compile_multilib: "first",
7159 multilib: {
7160 lib32: {
7161 native_shared_libs: ["mylib32"],
7162 },
7163 lib64: {
7164 native_shared_libs: ["mylib64"],
7165 },
7166 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007167 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007168 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007169 key: "mynewapex.key",
7170 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007171 }
7172
7173 apex_key {
7174 name: "myapex.key",
7175 public_key: "testkey.avbpubkey",
7176 private_key: "testkey.pem",
7177 }
7178
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007179 apex_key {
7180 name: "mynewapex.key",
7181 public_key: "testkey2.avbpubkey",
7182 private_key: "testkey2.pem",
7183 }
7184
7185 android_app_certificate {
7186 name: "myapex.certificate",
7187 certificate: "testkey",
7188 }
7189
Jiyong Park5d790c32019-11-15 18:40:32 +09007190 android_app {
7191 name: "app",
7192 srcs: ["foo/bar/MyClass.java"],
7193 package_name: "foo",
7194 sdk_version: "none",
7195 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007196 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007197 }
7198
7199 override_android_app {
7200 name: "override_app",
7201 base: "app",
7202 package_name: "bar",
7203 }
markchien7c803b82021-08-26 22:10:06 +08007204
7205 bpf {
7206 name: "bpf",
7207 srcs: ["bpf.c"],
7208 }
7209
7210 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007211 name: "overrideBpf",
7212 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007213 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007214
7215 prebuilt_etc {
7216 name: "myetc",
7217 src: "myprebuilt",
7218 }
7219
7220 prebuilt_etc {
7221 name: "override_myetc",
7222 src: "override_myprebuilt",
7223 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007224
7225 cc_library {
7226 name: "mylib32",
7227 apex_available: [ "myapex" ],
7228 }
7229
7230 cc_library {
7231 name: "mylib64",
7232 apex_available: [ "myapex" ],
7233 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007234 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007235
Jooyung Hana0503a52023-08-23 13:12:50 +09007236 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007237 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007238 if originalVariant.GetOverriddenBy() != "" {
7239 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7240 }
7241 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7242 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7243 }
7244
Spandan Das50801e22024-05-13 18:29:45 +00007245 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007246 apexRule := module.Rule("apexRule")
7247 copyCmds := apexRule.Args["copy_commands"]
7248
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007249 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7250 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007251
markchien7c803b82021-08-26 22:10:06 +08007252 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007253 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007254
Daniel Norman5a3ce132021-08-26 15:44:43 -07007255 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7256 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7257
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007258 apexBundle := module.Module().(*apexBundle)
7259 name := apexBundle.Name()
7260 if name != "override_myapex" {
7261 t.Errorf("name should be \"override_myapex\", but was %q", name)
7262 }
7263
Baligh Uddin004d7172020-02-19 21:29:28 -08007264 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7265 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7266 }
7267
Jiyong Park20bacab2020-03-03 11:45:41 +09007268 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007269 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007270 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7271
7272 signApkRule := module.Rule("signapk")
7273 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007274
Colin Crossaa255532020-07-03 13:18:24 -07007275 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007276 var builder strings.Builder
7277 data.Custom(&builder, name, "TARGET_", "", data)
7278 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007279 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7280 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007281 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007282 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007283 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007284 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007285 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007286 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007287}
7288
Albert Martineefabcf2022-03-21 20:11:16 +00007289func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007290 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007291 // Override from 29 to 31
7292 minSdkOverride31 := "31"
7293 ctx := testApex(t, `
7294 apex {
7295 name: "myapex",
7296 key: "myapex.key",
7297 native_shared_libs: ["mylib"],
7298 updatable: true,
7299 min_sdk_version: "29"
7300 }
7301
7302 override_apex {
7303 name: "override_myapex",
7304 base: "myapex",
7305 logging_parent: "com.foo.bar",
7306 package_name: "test.overridden.package"
7307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
7314
7315 cc_library {
7316 name: "mylib",
7317 srcs: ["mylib.cpp"],
7318 runtime_libs: ["libbar"],
7319 system_shared_libs: [],
7320 stl: "none",
7321 apex_available: [ "myapex" ],
7322 min_sdk_version: "apex_inherit"
7323 }
7324
7325 cc_library {
7326 name: "libbar",
7327 srcs: ["mylib.cpp"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 min_sdk_version: "apex_inherit"
7332 }
7333
7334 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7335
Jooyung Hana0503a52023-08-23 13:12:50 +09007336 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007337 copyCmds := apexRule.Args["copy_commands"]
7338
7339 // Ensure that direct non-stubs dep is always included
7340 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7341
7342 // Ensure that runtime_libs dep in included
7343 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7344
7345 // Ensure libraries target overridden min_sdk_version value
7346 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7347}
7348
7349func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007350 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007351 // Attempt to override from 31 to 29, should be a NOOP
7352 minSdkOverride29 := "29"
7353 ctx := testApex(t, `
7354 apex {
7355 name: "myapex",
7356 key: "myapex.key",
7357 native_shared_libs: ["mylib"],
7358 updatable: true,
7359 min_sdk_version: "31"
7360 }
7361
7362 override_apex {
7363 name: "override_myapex",
7364 base: "myapex",
7365 logging_parent: "com.foo.bar",
7366 package_name: "test.overridden.package"
7367 }
7368
7369 apex_key {
7370 name: "myapex.key",
7371 public_key: "testkey.avbpubkey",
7372 private_key: "testkey.pem",
7373 }
7374
7375 cc_library {
7376 name: "mylib",
7377 srcs: ["mylib.cpp"],
7378 runtime_libs: ["libbar"],
7379 system_shared_libs: [],
7380 stl: "none",
7381 apex_available: [ "myapex" ],
7382 min_sdk_version: "apex_inherit"
7383 }
7384
7385 cc_library {
7386 name: "libbar",
7387 srcs: ["mylib.cpp"],
7388 system_shared_libs: [],
7389 stl: "none",
7390 apex_available: [ "myapex" ],
7391 min_sdk_version: "apex_inherit"
7392 }
7393
7394 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7395
Jooyung Hana0503a52023-08-23 13:12:50 +09007396 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007397 copyCmds := apexRule.Args["copy_commands"]
7398
7399 // Ensure that direct non-stubs dep is always included
7400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7401
7402 // Ensure that runtime_libs dep in included
7403 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7404
7405 // Ensure libraries target the original min_sdk_version value rather than the overridden
7406 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7407}
7408
Jooyung Han214bf372019-11-12 13:03:50 +09007409func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007410 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007411 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007412 apex {
7413 name: "myapex",
7414 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007415 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007416 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007417 }
7418
7419 apex_key {
7420 name: "myapex.key",
7421 public_key: "testkey.avbpubkey",
7422 private_key: "testkey.pem",
7423 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007424
7425 cc_library {
7426 name: "mylib",
7427 srcs: ["mylib.cpp"],
7428 stl: "libc++",
7429 system_shared_libs: [],
7430 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007431 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007432 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007433 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007434
Jooyung Hana0503a52023-08-23 13:12:50 +09007435 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007436 args := module.Rule("apexRule").Args
7437 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007438
7439 // The copies of the libraries in the apex should have one more dependency than
7440 // the ones outside the apex, namely the unwinder. Ideally we should check
7441 // the dependency names directly here but for some reason the names are blank in
7442 // this test.
7443 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007444 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007445 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7446 if len(apexImplicits) != len(nonApexImplicits)+1 {
7447 t.Errorf("%q missing unwinder dep", lib)
7448 }
7449 }
Jooyung Han214bf372019-11-12 13:03:50 +09007450}
7451
Paul Duffine05480a2021-03-08 15:07:14 +00007452var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007453 "api/current.txt": nil,
7454 "api/removed.txt": nil,
7455 "api/system-current.txt": nil,
7456 "api/system-removed.txt": nil,
7457 "api/test-current.txt": nil,
7458 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007459
Anton Hanssondff2c782020-12-21 17:10:01 +00007460 "100/public/api/foo.txt": nil,
7461 "100/public/api/foo-removed.txt": nil,
7462 "100/system/api/foo.txt": nil,
7463 "100/system/api/foo-removed.txt": nil,
7464
Paul Duffineedc5d52020-06-12 17:46:39 +01007465 // For java_sdk_library_import
7466 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007467}
7468
Jooyung Han58f26ab2019-12-18 15:34:32 +09007469func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007470 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007471 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007472 apex {
7473 name: "myapex",
7474 key: "myapex.key",
7475 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007476 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007477 }
7478
7479 apex_key {
7480 name: "myapex.key",
7481 public_key: "testkey.avbpubkey",
7482 private_key: "testkey.pem",
7483 }
7484
7485 java_sdk_library {
7486 name: "foo",
7487 srcs: ["a.java"],
7488 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007489 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007490 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007491
7492 prebuilt_apis {
7493 name: "sdk",
7494 api_dirs: ["100"],
7495 }
Paul Duffin9b879592020-05-26 13:21:35 +01007496 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007497
7498 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007499 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007500 "javalib/foo.jar",
7501 "etc/permissions/foo.xml",
7502 })
7503 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007504 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7505 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7506 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007507}
7508
Spandan Das3ee19692024-06-19 04:47:40 +00007509func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007510 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007511 ctx := testApex(t, `
7512 override_apex {
7513 name: "mycompanyapex",
7514 base: "myapex",
7515 }
7516 apex {
7517 name: "myapex",
7518 key: "myapex.key",
7519 java_libs: ["foo"],
7520 updatable: false,
7521 }
7522
7523 apex_key {
7524 name: "myapex.key",
7525 public_key: "testkey.avbpubkey",
7526 private_key: "testkey.pem",
7527 }
7528
7529 java_sdk_library {
7530 name: "foo",
7531 srcs: ["a.java"],
7532 api_packages: ["foo"],
7533 apex_available: [ "myapex" ],
7534 }
7535
7536 prebuilt_apis {
7537 name: "sdk",
7538 api_dirs: ["100"],
7539 }
7540 `, withFiles(filesForSdkLibrary))
7541
7542 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7543 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7544 // (com.android.foo), the filepath should not contain override apex name.
7545 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7546 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7547 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7548}
7549
Paul Duffin9b879592020-05-26 13:21:35 +01007550func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007551 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007552 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007553 apex {
7554 name: "myapex",
7555 key: "myapex.key",
7556 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007557 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007558 }
7559
7560 apex_key {
7561 name: "myapex.key",
7562 public_key: "testkey.avbpubkey",
7563 private_key: "testkey.pem",
7564 }
7565
7566 java_sdk_library {
7567 name: "foo",
7568 srcs: ["a.java"],
7569 api_packages: ["foo"],
7570 apex_available: ["myapex"],
7571 sdk_version: "none",
7572 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007573 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007574 }
7575
7576 java_library {
7577 name: "bar",
7578 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007579 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007580 apex_available: ["myapex"],
7581 sdk_version: "none",
7582 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007583 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007584 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007585
7586 prebuilt_apis {
7587 name: "sdk",
7588 api_dirs: ["100"],
7589 }
Paul Duffin9b879592020-05-26 13:21:35 +01007590 `, withFiles(filesForSdkLibrary))
7591
7592 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007593 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007594 "javalib/bar.jar",
7595 "javalib/foo.jar",
7596 "etc/permissions/foo.xml",
7597 })
7598
7599 // The bar library should depend on the implementation jar.
7600 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007601 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007602 t.Errorf("expected %q, found %#q", expected, actual)
7603 }
7604}
7605
7606func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007607 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007608 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007609 apex {
7610 name: "myapex",
7611 key: "myapex.key",
7612 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007613 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007614 }
7615
7616 apex_key {
7617 name: "myapex.key",
7618 public_key: "testkey.avbpubkey",
7619 private_key: "testkey.pem",
7620 }
7621
7622 java_sdk_library {
7623 name: "foo",
7624 srcs: ["a.java"],
7625 api_packages: ["foo"],
7626 apex_available: ["myapex"],
7627 sdk_version: "none",
7628 system_modules: "none",
7629 }
7630
7631 java_library {
7632 name: "bar",
7633 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007634 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007635 sdk_version: "none",
7636 system_modules: "none",
7637 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007638
7639 prebuilt_apis {
7640 name: "sdk",
7641 api_dirs: ["100"],
7642 }
Paul Duffin9b879592020-05-26 13:21:35 +01007643 `, withFiles(filesForSdkLibrary))
7644
7645 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007646 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007647 "javalib/foo.jar",
7648 "etc/permissions/foo.xml",
7649 })
7650
7651 // The bar library should depend on the stubs jar.
7652 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007653 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007654 t.Errorf("expected %q, found %#q", expected, actual)
7655 }
7656}
7657
Paul Duffineedc5d52020-06-12 17:46:39 +01007658func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007659 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007660 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007661 prebuilt_apis {
7662 name: "sdk",
7663 api_dirs: ["100"],
7664 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007665 withFiles(map[string][]byte{
7666 "apex/a.java": nil,
7667 "apex/apex_manifest.json": nil,
7668 "apex/Android.bp": []byte(`
7669 package {
7670 default_visibility: ["//visibility:private"],
7671 }
7672
7673 apex {
7674 name: "myapex",
7675 key: "myapex.key",
7676 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007677 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007678 }
7679
7680 apex_key {
7681 name: "myapex.key",
7682 public_key: "testkey.avbpubkey",
7683 private_key: "testkey.pem",
7684 }
7685
7686 java_library {
7687 name: "bar",
7688 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007689 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 apex_available: ["myapex"],
7691 sdk_version: "none",
7692 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007693 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007694 }
7695`),
7696 "source/a.java": nil,
7697 "source/api/current.txt": nil,
7698 "source/api/removed.txt": nil,
7699 "source/Android.bp": []byte(`
7700 package {
7701 default_visibility: ["//visibility:private"],
7702 }
7703
7704 java_sdk_library {
7705 name: "foo",
7706 visibility: ["//apex"],
7707 srcs: ["a.java"],
7708 api_packages: ["foo"],
7709 apex_available: ["myapex"],
7710 sdk_version: "none",
7711 system_modules: "none",
7712 public: {
7713 enabled: true,
7714 },
Colin Crosse4f34882024-11-14 12:26:00 -08007715 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007716 }
7717`),
7718 "prebuilt/a.jar": nil,
7719 "prebuilt/Android.bp": []byte(`
7720 package {
7721 default_visibility: ["//visibility:private"],
7722 }
7723
7724 java_sdk_library_import {
7725 name: "foo",
7726 visibility: ["//apex", "//source"],
7727 apex_available: ["myapex"],
7728 prefer: true,
7729 public: {
7730 jars: ["a.jar"],
7731 },
Colin Crosse4f34882024-11-14 12:26:00 -08007732 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007733 }
7734`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007735 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007736 )
7737
7738 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007739 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007740 "javalib/bar.jar",
7741 "javalib/foo.jar",
7742 "etc/permissions/foo.xml",
7743 })
7744
7745 // The bar library should depend on the implementation jar.
7746 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007747 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007748 t.Errorf("expected %q, found %#q", expected, actual)
7749 }
7750}
7751
7752func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007753 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007754 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7755 apex {
7756 name: "myapex",
7757 key: "myapex.key",
7758 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007759 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007760 }
7761
7762 apex_key {
7763 name: "myapex.key",
7764 public_key: "testkey.avbpubkey",
7765 private_key: "testkey.pem",
7766 }
7767
7768 java_sdk_library_import {
7769 name: "foo",
7770 apex_available: ["myapex"],
7771 prefer: true,
7772 public: {
7773 jars: ["a.jar"],
7774 },
7775 }
7776
7777 `, withFiles(filesForSdkLibrary))
7778}
7779
atrost6e126252020-01-27 17:01:16 +00007780func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007781 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007782 result := android.GroupFixturePreparers(
7783 prepareForApexTest,
7784 java.PrepareForTestWithPlatformCompatConfig,
7785 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007786 apex {
7787 name: "myapex",
7788 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007789 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007790 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007791 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 platform_compat_config {
7801 name: "myjar-platform-compat-config",
7802 src: ":myjar",
7803 }
7804
7805 java_library {
7806 name: "myjar",
7807 srcs: ["foo/bar/MyClass.java"],
7808 sdk_version: "none",
7809 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007810 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007811 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007812 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007813
7814 // Make sure that a preferred prebuilt does not affect the apex contents.
7815 prebuilt_platform_compat_config {
7816 name: "myjar-platform-compat-config",
7817 metadata: "compat-config/metadata.xml",
7818 prefer: true,
7819 }
atrost6e126252020-01-27 17:01:16 +00007820 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007821 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007822 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007823 "etc/compatconfig/myjar-platform-compat-config.xml",
7824 "javalib/myjar.jar",
7825 })
7826}
7827
Jooyung Han862c0d62022-12-21 10:15:37 +09007828func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007829 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007830 android.GroupFixturePreparers(
7831 android.PrepareForTestWithAndroidBuildComponents,
7832 PrepareForTestWithApexBuildComponents,
7833 prepareForTestWithMyapex,
7834 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7835 ).
7836 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7837 RunTestWithBp(t, `
7838 apex {
7839 name: "myapex",
7840 key: "myapex.key",
7841 prebuilts: ["foo", "bar"],
7842 updatable: false,
7843 }
7844
7845 apex_key {
7846 name: "myapex.key",
7847 public_key: "testkey.avbpubkey",
7848 private_key: "testkey.pem",
7849 }
7850
7851 prebuilt_etc {
7852 name: "foo",
7853 src: "myprebuilt",
7854 filename_from_src: true,
7855 }
7856
7857 prebuilt_etc {
7858 name: "bar",
7859 src: "myprebuilt",
7860 filename_from_src: true,
7861 }
7862 `)
7863}
7864
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007865func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007866 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007867 bp := `
7868 apex {
7869 name: "myapex",
7870 key: "myapex.key",
7871 native_shared_libs: ["libfoo"],
7872 updatable: false,
7873 unwanted_transitive_deps: ["libbar"],
7874 }
7875
7876 apex_key {
7877 name: "myapex.key",
7878 public_key: "testkey.avbpubkey",
7879 private_key: "testkey.pem",
7880 }
7881
7882 cc_library {
7883 name: "libfoo",
7884 srcs: ["foo.cpp"],
7885 shared_libs: ["libbar"],
7886 apex_available: ["myapex"],
7887 }
7888
7889 cc_library {
7890 name: "libbar",
7891 srcs: ["bar.cpp"],
7892 apex_available: ["myapex"],
7893 }`
7894 ctx := testApex(t, bp)
7895 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7896 "*/libc++.so",
7897 "*/libfoo.so",
7898 // not libbar.so
7899 })
7900}
7901
Jiyong Park479321d2019-12-16 11:47:12 +09007902func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007903 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007904 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7905 apex {
7906 name: "myapex",
7907 key: "myapex.key",
7908 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007909 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007910 }
7911
7912 apex_key {
7913 name: "myapex.key",
7914 public_key: "testkey.avbpubkey",
7915 private_key: "testkey.pem",
7916 }
7917
7918 java_library {
7919 name: "myjar",
7920 srcs: ["foo/bar/MyClass.java"],
7921 sdk_version: "none",
7922 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007923 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007924 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007925 }
7926 `)
7927}
7928
Jiyong Park7cd10e32020-01-14 09:22:18 +09007929func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007930 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007931 bp := `
7932 apex {
7933 name: "myapex",
7934 key: "myapex.key",
7935 native_shared_libs: ["mylib"],
7936 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007937 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007938 }
7939
Jiyong Park9d677202020-02-19 16:29:35 +09007940 apex {
7941 name: "myapex.updatable",
7942 key: "myapex.key",
7943 native_shared_libs: ["mylib"],
7944 java_libs: ["myjar"],
7945 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007946 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007947 }
7948
Jiyong Park7cd10e32020-01-14 09:22:18 +09007949 apex_key {
7950 name: "myapex.key",
7951 public_key: "testkey.avbpubkey",
7952 private_key: "testkey.pem",
7953 }
7954
7955 cc_library {
7956 name: "mylib",
7957 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007958 shared_libs: [
7959 "myotherlib",
7960 "myotherlib_ext",
7961 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007962 system_shared_libs: [],
7963 stl: "none",
7964 apex_available: [
7965 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007966 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967 "//apex_available:platform",
7968 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007969 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007970 }
7971
7972 cc_library {
7973 name: "myotherlib",
7974 srcs: ["mylib.cpp"],
7975 system_shared_libs: [],
7976 stl: "none",
7977 apex_available: [
7978 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007979 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007980 "//apex_available:platform",
7981 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007982 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007983 }
7984
Jiyong Parkce243632023-02-17 18:22:25 +09007985 cc_library {
7986 name: "myotherlib_ext",
7987 srcs: ["mylib.cpp"],
7988 system_shared_libs: [],
7989 system_ext_specific: true,
7990 stl: "none",
7991 apex_available: [
7992 "myapex",
7993 "myapex.updatable",
7994 "//apex_available:platform",
7995 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007996 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007997 }
7998
Jiyong Park7cd10e32020-01-14 09:22:18 +09007999 java_library {
8000 name: "myjar",
8001 srcs: ["foo/bar/MyClass.java"],
8002 sdk_version: "none",
8003 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008004 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008005 apex_available: [
8006 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008007 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008008 "//apex_available:platform",
8009 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008010 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008011 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008012 }
8013
8014 java_library {
8015 name: "myotherjar",
8016 srcs: ["foo/bar/MyClass.java"],
8017 sdk_version: "none",
8018 system_modules: "none",
8019 apex_available: [
8020 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008021 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008022 "//apex_available:platform",
8023 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008024 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008025 }
8026 `
8027
8028 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8029 for _, f := range files {
8030 if f.path == file {
8031 if f.isLink {
8032 t.Errorf("%q is not a real file", file)
8033 }
8034 return
8035 }
8036 }
8037 t.Errorf("%q is not found", file)
8038 }
8039
Jiyong Parkce243632023-02-17 18:22:25 +09008040 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008041 for _, f := range files {
8042 if f.path == file {
8043 if !f.isLink {
8044 t.Errorf("%q is not a symlink", file)
8045 }
Jiyong Parkce243632023-02-17 18:22:25 +09008046 if f.src != target {
8047 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8048 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008049 return
8050 }
8051 }
8052 t.Errorf("%q is not found", file)
8053 }
8054
Jiyong Park9d677202020-02-19 16:29:35 +09008055 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8056 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008057 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008058 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008059 ensureRealfileExists(t, files, "javalib/myjar.jar")
8060 ensureRealfileExists(t, files, "lib64/mylib.so")
8061 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008062 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008063
Jooyung Hana0503a52023-08-23 13:12:50 +09008064 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008065 ensureRealfileExists(t, files, "javalib/myjar.jar")
8066 ensureRealfileExists(t, files, "lib64/mylib.so")
8067 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008068 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008069
8070 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008071 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008072 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008073 ensureRealfileExists(t, files, "javalib/myjar.jar")
8074 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008075 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8076 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008077
Jooyung Hana0503a52023-08-23 13:12:50 +09008078 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008079 ensureRealfileExists(t, files, "javalib/myjar.jar")
8080 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008081 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8082 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008083}
8084
Yo Chiange8128052020-07-23 20:09:18 +08008085func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008087 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008088 apex {
8089 name: "myapex",
8090 key: "myapex.key",
8091 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008092 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008093 }
8094
8095 apex_key {
8096 name: "myapex.key",
8097 public_key: "testkey.avbpubkey",
8098 private_key: "testkey.pem",
8099 }
8100
8101 cc_library_shared {
8102 name: "mylib",
8103 srcs: ["mylib.cpp"],
8104 shared_libs: ["myotherlib"],
8105 system_shared_libs: [],
8106 stl: "none",
8107 apex_available: [
8108 "myapex",
8109 "//apex_available:platform",
8110 ],
8111 }
8112
8113 cc_prebuilt_library_shared {
8114 name: "myotherlib",
8115 srcs: ["prebuilt.so"],
8116 system_shared_libs: [],
8117 stl: "none",
8118 apex_available: [
8119 "myapex",
8120 "//apex_available:platform",
8121 ],
8122 }
8123 `)
8124
Jooyung Hana0503a52023-08-23 13:12:50 +09008125 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008126 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008127 var builder strings.Builder
8128 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8129 androidMk := builder.String()
8130 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008131 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008132 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8133 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8134 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008135 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008136}
8137
Jooyung Han643adc42020-02-27 13:50:06 +09008138func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008139 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008140 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008141 apex {
8142 name: "myapex",
8143 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008144 binaries: ["mybin"],
8145 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008146 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008147 }
8148
8149 apex_key {
8150 name: "myapex.key",
8151 public_key: "testkey.avbpubkey",
8152 private_key: "testkey.pem",
8153 }
8154
8155 cc_library {
8156 name: "mylib",
8157 srcs: ["mylib.cpp"],
8158 shared_libs: ["mylib2"],
8159 system_shared_libs: [],
8160 stl: "none",
8161 apex_available: [ "myapex" ],
8162 }
8163
8164 cc_library {
8165 name: "mylib2",
8166 srcs: ["mylib.cpp"],
8167 system_shared_libs: [],
8168 stl: "none",
8169 apex_available: [ "myapex" ],
8170 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008171
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008172 // Used as both a JNI library and a regular shared library.
8173 cc_library {
8174 name: "mylib3",
8175 srcs: ["mylib.cpp"],
8176 system_shared_libs: [],
8177 stl: "none",
8178 apex_available: [ "myapex" ],
8179 }
8180
8181 cc_binary {
8182 name: "mybin",
8183 srcs: ["mybin.cpp"],
8184 shared_libs: ["mylib3"],
8185 system_shared_libs: [],
8186 stl: "none",
8187 apex_available: [ "myapex" ],
8188 }
8189
Jiyong Park34d5c332022-02-24 18:02:44 +09008190 rust_ffi_shared {
8191 name: "libfoo.rust",
8192 crate_name: "foo",
8193 srcs: ["foo.rs"],
8194 shared_libs: ["libfoo.shared_from_rust"],
8195 prefer_rlib: true,
8196 apex_available: ["myapex"],
8197 }
8198
8199 cc_library_shared {
8200 name: "libfoo.shared_from_rust",
8201 srcs: ["mylib.cpp"],
8202 system_shared_libs: [],
8203 stl: "none",
8204 stubs: {
8205 versions: ["10", "11", "12"],
8206 },
8207 }
8208
Jooyung Han643adc42020-02-27 13:50:06 +09008209 `)
8210
Jooyung Hana0503a52023-08-23 13:12:50 +09008211 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008212 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008213 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008214 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008215 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008216 "lib64/mylib.so",
8217 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008218 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008219 "lib64/libfoo.rust.so",
8220 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8221 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008222 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008223
8224 // b/220397949
8225 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008226}
8227
Jooyung Han49f67012020-04-17 13:43:10 +09008228func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008229 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008230 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008231 apex {
8232 name: "myapex",
8233 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008234 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008235 }
8236 apex_key {
8237 name: "myapex.key",
8238 public_key: "testkey.avbpubkey",
8239 private_key: "testkey.pem",
8240 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008241 `,
8242 android.FixtureModifyConfig(func(config android.Config) {
8243 delete(config.Targets, android.Android)
8244 config.AndroidCommonTarget = android.Target{}
8245 }),
8246 )
Jooyung Han49f67012020-04-17 13:43:10 +09008247
8248 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8249 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8250 }
8251}
8252
Jiyong Parkbd159612020-02-28 15:22:21 +09008253func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008254 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008255 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008256 apex {
8257 name: "myapex",
8258 key: "myapex.key",
8259 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008260 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008261 }
8262
8263 apex_key {
8264 name: "myapex.key",
8265 public_key: "testkey.avbpubkey",
8266 private_key: "testkey.pem",
8267 }
8268
8269 android_app {
8270 name: "AppFoo",
8271 srcs: ["foo/bar/MyClass.java"],
8272 sdk_version: "none",
8273 system_modules: "none",
8274 apex_available: [ "myapex" ],
8275 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008276 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008277
Jooyung Hana0503a52023-08-23 13:12:50 +09008278 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008279 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008280
8281 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008282 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 +09008283}
8284
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008285func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008286 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008287 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008288 apex {
8289 name: "myapex",
8290 key: "myapex.key",
8291 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008292 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008293 }
8294
8295 apex_key {
8296 name: "myapex.key",
8297 public_key: "testkey.avbpubkey",
8298 private_key: "testkey.pem",
8299 }
8300
8301 android_app_set {
8302 name: "AppSet",
8303 set: "AppSet.apks",
8304 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008305 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008306 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008307 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008308 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8309 s := mod.Rule("apexRule").Args["copy_commands"]
8310 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008311 if len(copyCmds) != 4 {
8312 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008313 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008314 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8315 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008316 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8317 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008318
8319 // Ensure that canned_fs_config has an entry for the app set zip file
8320 generateFsRule := mod.Rule("generateFsConfig")
8321 cmd := generateFsRule.RuleParams.Command
8322 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008323}
8324
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008325func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008326 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008327 apex_set {
8328 name: "myapex",
8329 filename: "foo_v2.apex",
8330 sanitized: {
8331 none: { set: "myapex.apks", },
8332 hwaddress: { set: "myapex.hwasan.apks", },
8333 },
Paul Duffin24704672021-04-06 16:09:30 +01008334 }
8335 `
8336 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008337
Paul Duffin24704672021-04-06 16:09:30 +01008338 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008339 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008340
Spandan Das9d6e2092024-09-21 02:50:00 +00008341 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008342 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008343
Paul Duffin24704672021-04-06 16:09:30 +01008344 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8345
8346 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008347 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8348 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008349
8350 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008351}
8352
Pranav Guptaeba03b02022-09-27 00:27:08 +00008353func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008354 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008355 ctx := testApex(t, `
8356 apex_set {
8357 name: "myapex",
8358 set: ":myapex_apks_file",
8359 }
8360
8361 filegroup {
8362 name: "myapex_apks_file",
8363 srcs: ["myapex.apks"],
8364 }
8365 `)
8366
Spandan Das9d6e2092024-09-21 02:50:00 +00008367 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008368
8369 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008370 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008371 extractedApex := m.Output(extractorOutput)
8372
8373 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8374}
8375
Paul Duffin89f570a2021-06-16 01:42:33 +01008376func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008377 t.Helper()
8378
Paul Duffin55607122021-03-30 23:32:51 +01008379 fs := android.MockFS{
8380 "a.java": nil,
8381 "a.jar": nil,
8382 "apex_manifest.json": nil,
8383 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008384 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008385 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8386 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8387 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008388 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008389 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008390
Paul Duffin55607122021-03-30 23:32:51 +01008391 errorHandler := android.FixtureExpectsNoErrors
8392 if errmsg != "" {
8393 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008394 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008395
Paul Duffin55607122021-03-30 23:32:51 +01008396 result := android.GroupFixturePreparers(
8397 cc.PrepareForTestWithCcDefaultModules,
8398 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008399 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008400 java.PrepareForTestWithJavaSdkLibraryFiles,
8401 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008402 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008403 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008404 android.FixtureModifyMockFS(func(fs android.MockFS) {
8405 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8406 insert := ""
8407 for _, fragment := range fragments {
8408 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8409 }
8410 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8411 platform_bootclasspath {
8412 name: "platform-bootclasspath",
8413 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008414 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008415 %s
8416 ],
8417 }
8418 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008419 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008420 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008421 // Dexpreopt for boot jars requires the ART boot image profile.
8422 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8423 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008424 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008425 ).
8426 ExtendWithErrorHandler(errorHandler).
8427 RunTestWithBp(t, bp)
8428
8429 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008430}
8431
Jooyung Han548640b2020-04-27 12:10:30 +09008432func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008433 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008434 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8435 apex {
8436 name: "myapex",
8437 key: "myapex.key",
8438 updatable: true,
8439 }
8440
8441 apex_key {
8442 name: "myapex.key",
8443 public_key: "testkey.avbpubkey",
8444 private_key: "testkey.pem",
8445 }
8446 `)
8447}
8448
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008449func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008450 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008451 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8452 apex {
8453 name: "myapex",
8454 key: "myapex.key",
8455 }
8456
8457 apex_key {
8458 name: "myapex.key",
8459 public_key: "testkey.avbpubkey",
8460 private_key: "testkey.pem",
8461 }
8462 `)
8463}
8464
satayevb98371c2021-06-15 16:49:50 +01008465func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008466 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008467 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8468 apex {
8469 name: "myapex",
8470 key: "myapex.key",
8471 systemserverclasspath_fragments: [
8472 "mysystemserverclasspathfragment",
8473 ],
8474 min_sdk_version: "29",
8475 updatable: true,
8476 }
8477
8478 apex_key {
8479 name: "myapex.key",
8480 public_key: "testkey.avbpubkey",
8481 private_key: "testkey.pem",
8482 }
8483
8484 java_library {
8485 name: "foo",
8486 srcs: ["b.java"],
8487 min_sdk_version: "29",
8488 installable: true,
8489 apex_available: [
8490 "myapex",
8491 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008492 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008493 }
8494
8495 systemserverclasspath_fragment {
8496 name: "mysystemserverclasspathfragment",
8497 generate_classpaths_proto: false,
8498 contents: [
8499 "foo",
8500 ],
8501 apex_available: [
8502 "myapex",
8503 ],
8504 }
satayevabcd5972021-08-06 17:49:46 +01008505 `,
8506 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8507 )
satayevb98371c2021-06-15 16:49:50 +01008508}
8509
Paul Duffin064b70c2020-11-02 17:32:38 +00008510func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008511 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008512 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008513 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008514 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008515 fragment := java.ApexVariantReference{
8516 Apex: proptools.StringPtr("myapex"),
8517 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8518 }
8519
Paul Duffin064b70c2020-11-02 17:32:38 +00008520 testDexpreoptWithApexes(t, `
8521 prebuilt_apex {
8522 name: "myapex" ,
8523 arch: {
8524 arm64: {
8525 src: "myapex-arm64.apex",
8526 },
8527 arm: {
8528 src: "myapex-arm.apex",
8529 },
8530 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008531 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8532 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008533
Paul Duffin89f570a2021-06-16 01:42:33 +01008534 prebuilt_bootclasspath_fragment {
8535 name: "my-bootclasspath-fragment",
8536 contents: ["libfoo"],
8537 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008538 hidden_api: {
8539 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8540 metadata: "my-bootclasspath-fragment/metadata.csv",
8541 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008542 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8543 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8544 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008545 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008547
Spandan Das52c01a12024-09-20 01:09:48 +00008548 java_sdk_library_import {
8549 name: "libfoo",
8550 prefer: true,
8551 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008552 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008553 },
8554 apex_available: ["myapex"],
8555 shared_library: false,
8556 permitted_packages: ["libfoo"],
8557 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008558 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008559 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008560}
8561
Spandan Dasf14e2542021-11-12 00:01:37 +00008562func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008563 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008564 bp += `
8565 apex_key {
8566 name: "myapex.key",
8567 public_key: "testkey.avbpubkey",
8568 private_key: "testkey.pem",
8569 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008570 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008571 "lib1/src/A.java": nil,
8572 "lib2/src/B.java": nil,
8573 "system/sepolicy/apex/myapex-file_contexts": nil,
8574 }
8575
Paul Duffin45338f02021-03-30 23:07:52 +01008576 errorHandler := android.FixtureExpectsNoErrors
8577 if errmsg != "" {
8578 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008579 }
Colin Crossae8600b2020-10-29 17:09:13 -07008580
Paul Duffin45338f02021-03-30 23:07:52 +01008581 android.GroupFixturePreparers(
8582 android.PrepareForTestWithAndroidBuildComponents,
8583 java.PrepareForTestWithJavaBuildComponents,
8584 PrepareForTestWithApexBuildComponents,
8585 android.PrepareForTestWithNeverallowRules(rules),
8586 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008587 apexBootJars := make([]string, 0, len(bootJars))
8588 for _, apexBootJar := range bootJars {
8589 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008590 }
satayevd604b212021-07-21 14:23:52 +01008591 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008592 }),
8593 fs.AddToFixture(),
8594 ).
8595 ExtendWithErrorHandler(errorHandler).
8596 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008597}
8598
8599func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008600 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008601 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008602 name string
8603 expectedError string
8604 bp string
8605 bootJars []string
8606 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008607 }{
8608
8609 {
8610 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8611 expectedError: "",
8612 bp: `
8613 java_library {
8614 name: "bcp_lib1",
8615 srcs: ["lib1/src/*.java"],
8616 permitted_packages: ["foo.bar"],
8617 apex_available: ["myapex"],
8618 sdk_version: "none",
8619 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008620 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008621 }
8622 java_library {
8623 name: "nonbcp_lib2",
8624 srcs: ["lib2/src/*.java"],
8625 apex_available: ["myapex"],
8626 permitted_packages: ["a.b"],
8627 sdk_version: "none",
8628 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008629 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008630 }
8631 apex {
8632 name: "myapex",
8633 key: "myapex.key",
8634 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008635 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008636 }`,
8637 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008638 bcpPermittedPackages: map[string][]string{
8639 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008640 "foo.bar",
8641 },
8642 },
8643 },
8644 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008645 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008646 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 +01008647 bp: `
8648 java_library {
8649 name: "bcp_lib1",
8650 srcs: ["lib1/src/*.java"],
8651 apex_available: ["myapex"],
8652 permitted_packages: ["foo.bar"],
8653 sdk_version: "none",
8654 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008655 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008656 }
8657 java_library {
8658 name: "bcp_lib2",
8659 srcs: ["lib2/src/*.java"],
8660 apex_available: ["myapex"],
8661 permitted_packages: ["foo.bar", "bar.baz"],
8662 sdk_version: "none",
8663 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008664 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008665 }
8666 apex {
8667 name: "myapex",
8668 key: "myapex.key",
8669 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008670 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008671 }
8672 `,
8673 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008674 bcpPermittedPackages: map[string][]string{
8675 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008676 "foo.bar",
8677 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008678 "bcp_lib2": []string{
8679 "foo.bar",
8680 },
8681 },
8682 },
8683 {
8684 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8685 expectedError: "",
8686 bp: `
8687 java_library {
8688 name: "bcp_lib_restricted",
8689 srcs: ["lib1/src/*.java"],
8690 apex_available: ["myapex"],
8691 permitted_packages: ["foo.bar"],
8692 sdk_version: "none",
8693 min_sdk_version: "29",
8694 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008695 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008696 }
8697 java_library {
8698 name: "bcp_lib_unrestricted",
8699 srcs: ["lib2/src/*.java"],
8700 apex_available: ["myapex"],
8701 permitted_packages: ["foo.bar", "bar.baz"],
8702 sdk_version: "none",
8703 min_sdk_version: "29",
8704 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008705 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008706 }
8707 apex {
8708 name: "myapex",
8709 key: "myapex.key",
8710 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8711 updatable: true,
8712 min_sdk_version: "29",
8713 }
8714 `,
8715 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8716 bcpPermittedPackages: map[string][]string{
8717 "bcp_lib1_non_updateable": []string{
8718 "foo.bar",
8719 },
8720 // 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 +01008721 },
8722 },
8723 }
8724 for _, tc := range testcases {
8725 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008726 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008727 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8728 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008729 })
8730 }
8731}
8732
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008733// TODO(jungjw): Move this to proptools
8734func intPtr(i int) *int {
8735 return &i
8736}
8737
8738func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008739 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008740 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008741 apex_set {
8742 name: "myapex",
8743 set: "myapex.apks",
8744 filename: "foo_v2.apex",
8745 overrides: ["foo"],
8746 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008747 `,
8748 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8749 variables.Platform_sdk_version = intPtr(30)
8750 }),
8751 android.FixtureModifyConfig(func(config android.Config) {
8752 config.Targets[android.Android] = []android.Target{
8753 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8754 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8755 }
8756 }),
8757 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008758
Spandan Das9d6e2092024-09-21 02:50:00 +00008759 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008760
8761 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008762 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008763 actual := extractedApex.Args["abis"]
8764 expected := "ARMEABI_V7A,ARM64_V8A"
8765 if actual != expected {
8766 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8767 }
8768 actual = extractedApex.Args["sdk-version"]
8769 expected = "30"
8770 if actual != expected {
8771 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8772 }
8773
Paul Duffin6717d882021-06-15 19:09:41 +01008774 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008775 a := m.Module().(*ApexSet)
8776 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008777 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008778 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8779 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8780 }
8781}
8782
Anton Hansson805e0a52022-11-25 14:06:46 +00008783func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008784 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008785 ctx := testApex(t, `
8786 apex_set {
8787 name: "myapex",
8788 set: "myapex.apks",
8789 filename: "foo_v2.apex",
8790 overrides: ["foo"],
8791 }
8792 `,
8793 android.FixtureModifyConfig(func(config android.Config) {
8794 config.Targets[android.Android] = []android.Target{
8795 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8796 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8797 }
8798 }),
8799 )
8800
Spandan Das9d6e2092024-09-21 02:50:00 +00008801 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008802
8803 // Check extract_apks tool parameters. No native bridge arch expected
8804 extractedApex := m.Output("extracted/myapex.apks")
8805 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8806}
8807
Jiyong Park7d95a512020-05-10 15:16:24 +09008808func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008809 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008810 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8811 apex {
8812 name: "myapex",
8813 key: "myapex.key",
8814 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008815 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008816 }
8817
8818 apex_key {
8819 name: "myapex.key",
8820 public_key: "testkey.avbpubkey",
8821 private_key: "testkey.pem",
8822 }
8823
8824 cc_library {
8825 name: "mylib",
8826 srcs: ["mylib.cpp"],
8827 static_libs: ["otherlib"],
8828 system_shared_libs: [],
8829 stl: "none",
8830 apex_available: [ "myapex" ],
8831 }
8832
8833 cc_library {
8834 name: "otherlib",
8835 srcs: ["mylib.cpp"],
8836 system_shared_libs: [],
8837 stl: "none",
8838 stubs: {
8839 versions: ["1", "2", "3"],
8840 },
8841 apex_available: [ "myapex" ],
8842 }
8843 `)
8844}
8845
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008846func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008847 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008848 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008849 apex {
8850 name: "myapex",
8851 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008852 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008853 custom_sign_tool: "sign_myapex",
8854 }
8855
8856 apex_key {
8857 name: "myapex.key",
8858 public_key: "testkey.avbpubkey",
8859 private_key: "testkey.pem",
8860 }
8861 `)
8862
Jooyung Han286957d2023-10-30 16:17:56 +09008863 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008864 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008865 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 +09008866}
8867
8868func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008869 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008870 ctx := testApex(t, `
8871 apex {
8872 name: "myapex",
8873 key: "myapex.key",
8874 updatable: false,
8875 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008876 }
8877
8878 apex_key {
8879 name: "myapex.key",
8880 public_key: "testkey.avbpubkey",
8881 private_key: "testkey.pem",
8882 }
8883
8884 prebuilt_apex {
8885 name: "myapex",
8886 prefer: true,
8887 arch: {
8888 arm64: {
8889 src: "myapex-arm64.apex",
8890 },
8891 arm: {
8892 src: "myapex-arm.apex",
8893 },
8894 },
8895 }
8896
8897 apex_set {
8898 name: "myapex_set",
8899 set: "myapex.apks",
8900 filename: "myapex_set.apex",
8901 overrides: ["myapex"],
8902 }
8903 `)
8904
Colin Crossf61d03d2023-11-02 16:56:39 -07008905 content := android.ContentFromFileRuleForTests(t, ctx,
8906 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008907 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 -07008908 content = android.ContentFromFileRuleForTests(t, ctx,
8909 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008910 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 +09008911}
8912
Jooyung Han938b5932020-06-20 12:47:47 +09008913func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008914 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008915 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008916 apex {
8917 name: "myapex",
8918 key: "myapex.key",
8919 apps: ["app"],
8920 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008921 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008922 }
8923
8924 apex_key {
8925 name: "myapex.key",
8926 public_key: "testkey.avbpubkey",
8927 private_key: "testkey.pem",
8928 }
8929
8930 android_app {
8931 name: "app",
8932 srcs: ["foo/bar/MyClass.java"],
8933 package_name: "foo",
8934 sdk_version: "none",
8935 system_modules: "none",
8936 apex_available: [ "myapex" ],
8937 }
8938 `, withFiles(map[string][]byte{
8939 "sub/Android.bp": []byte(`
8940 override_apex {
8941 name: "override_myapex",
8942 base: "myapex",
8943 apps: ["override_app"],
8944 allowed_files: ":allowed",
8945 }
8946 // Overridable "path" property should be referenced indirectly
8947 filegroup {
8948 name: "allowed",
8949 srcs: ["allowed.txt"],
8950 }
8951 override_android_app {
8952 name: "override_app",
8953 base: "app",
8954 package_name: "bar",
8955 }
8956 `),
8957 }))
8958
Jooyung Hana0503a52023-08-23 13:12:50 +09008959 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008960 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8961 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8962 }
8963
Spandan Das50801e22024-05-13 18:29:45 +00008964 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008965 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8966 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8967 }
8968}
8969
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008970func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008971 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008972 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008973 apex {
8974 name: "myapex",
8975 key: "myapex.key",
8976 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008977 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008978 }
8979
8980 apex_key {
8981 name: "myapex.key",
8982 public_key: "testkey.avbpubkey",
8983 private_key: "testkey.pem",
8984 }
8985
8986 cc_library {
8987 name: "mylib",
8988 srcs: ["mylib.cpp"],
8989 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008990 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008991 },
8992 apex_available: ["myapex"],
8993 }
8994
8995 cc_prebuilt_library_shared {
8996 name: "mylib",
8997 prefer: false,
8998 srcs: ["prebuilt.so"],
8999 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009000 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009001 },
9002 apex_available: ["myapex"],
9003 }
9004 `)
9005}
9006
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009007func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009008 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009009 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009010 apex {
9011 name: "myapex",
9012 key: "myapex.key",
9013 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009014 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009015 }
9016 apex_key {
9017 name: "myapex.key",
9018 public_key: "testkey.avbpubkey",
9019 private_key: "testkey.pem",
9020 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009021 `,
9022 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9023 variables.CompressedApex = proptools.BoolPtr(true)
9024 }),
9025 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009026
Jooyung Hana0503a52023-08-23 13:12:50 +09009027 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009028 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9029
Jooyung Hana0503a52023-08-23 13:12:50 +09009030 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009031 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9032
9033 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009034 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009035 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9036
9037 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009038 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009039 var builder strings.Builder
9040 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9041 androidMk := builder.String()
9042 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9043}
9044
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009045func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9046 t.Parallel()
9047 ctx := testApex(t, `
9048 apex {
9049 name: "myapex",
9050 key: "myapex.key",
9051 compressible: true,
9052 updatable: false,
9053 payload_fs_type: "erofs",
9054 }
9055 apex_key {
9056 name: "myapex.key",
9057 public_key: "testkey.avbpubkey",
9058 private_key: "testkey.pem",
9059 }
9060 `,
9061 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9062 variables.CompressedApex = proptools.BoolPtr(true)
9063 }),
9064 )
9065
9066 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9067 if compressRule.Rule != nil {
9068 t.Error("erofs apex should not be compressed")
9069 }
9070}
9071
Jooyung Han26ec8482024-07-31 15:04:05 +09009072func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009073 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009074 for _, compressionEnabled := range []bool{true, false} {
9075 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009076 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009077 ctx := testApex(t, `
9078 apex_set {
9079 name: "com.company.android.myapex",
9080 apex_name: "com.android.myapex",
9081 set: "company-myapex.apks",
9082 }
9083 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9084 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9085 }),
9086 )
9087
9088 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9089 if compressionEnabled {
9090 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9091 } else {
9092 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9093 }
9094 })
9095 }
9096}
9097
Martin Stjernholm2856c662020-12-02 15:03:42 +00009098func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009099 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009100 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009101 apex {
9102 name: "myapex",
9103 key: "myapex.key",
9104 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009105 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009106 }
9107
9108 apex_key {
9109 name: "myapex.key",
9110 public_key: "testkey.avbpubkey",
9111 private_key: "testkey.pem",
9112 }
9113
9114 cc_library {
9115 name: "mylib",
9116 srcs: ["mylib.cpp"],
9117 apex_available: ["myapex"],
9118 shared_libs: ["otherlib"],
9119 system_shared_libs: [],
9120 }
9121
9122 cc_library {
9123 name: "otherlib",
9124 srcs: ["mylib.cpp"],
9125 stubs: {
9126 versions: ["current"],
9127 },
9128 }
9129
9130 cc_prebuilt_library_shared {
9131 name: "otherlib",
9132 prefer: true,
9133 srcs: ["prebuilt.so"],
9134 stubs: {
9135 versions: ["current"],
9136 },
9137 }
9138 `)
9139
Jooyung Hana0503a52023-08-23 13:12:50 +09009140 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009141 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009142 var builder strings.Builder
9143 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9144 androidMk := builder.String()
9145
9146 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9147 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009148 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009149}
9150
Jiyong Parke3867542020-12-03 17:28:25 +09009151func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009152 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009153 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009154 apex {
9155 name: "myapex",
9156 key: "myapex.key",
9157 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009158 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009159 }
9160
9161 apex_key {
9162 name: "myapex.key",
9163 public_key: "testkey.avbpubkey",
9164 private_key: "testkey.pem",
9165 }
9166
9167 cc_library {
9168 name: "mylib",
9169 srcs: ["mylib.cpp"],
9170 system_shared_libs: [],
9171 stl: "none",
9172 apex_available: ["myapex"],
9173 shared_libs: ["mylib2"],
9174 target: {
9175 apex: {
9176 exclude_shared_libs: ["mylib2"],
9177 },
9178 },
9179 }
9180
9181 cc_library {
9182 name: "mylib2",
9183 srcs: ["mylib.cpp"],
9184 system_shared_libs: [],
9185 stl: "none",
9186 }
9187 `)
9188
9189 // Check if mylib is linked to mylib2 for the non-apex target
9190 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9191 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9192
9193 // Make sure that the link doesn't occur for the apex target
9194 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9195 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9196
9197 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009198 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009199 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9200}
9201
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009202func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009203 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009204 bpBase := `
9205 apex {
9206 name: "myapex",
9207 key: "myapex.key",
9208 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009209 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009210 }
9211 apex_key {
9212 name: "myapex.key",
9213 public_key: "testkey.avbpubkey",
9214 private_key: "testkey.pem",
9215 }
9216 cc_library {
9217 name: "mylib",
9218 srcs: ["mylib.cpp"],
9219 apex_available: ["myapex"],
9220 shared_libs: ["stublib"],
9221 system_shared_libs: [],
9222 }
9223 apex {
9224 name: "otherapex",
9225 enabled: %s,
9226 key: "myapex.key",
9227 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009228 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009229 }
9230 `
9231
9232 stublibSourceBp := `
9233 cc_library {
9234 name: "stublib",
9235 srcs: ["mylib.cpp"],
9236 apex_available: ["otherapex"],
9237 system_shared_libs: [],
9238 stl: "none",
9239 stubs: {
9240 versions: ["1"],
9241 },
9242 }
9243 `
9244
9245 stublibPrebuiltBp := `
9246 cc_prebuilt_library_shared {
9247 name: "stublib",
9248 srcs: ["prebuilt.so"],
9249 apex_available: ["otherapex"],
9250 stubs: {
9251 versions: ["1"],
9252 },
9253 %s
9254 }
9255 `
9256
9257 tests := []struct {
9258 name string
9259 stublibBp string
9260 usePrebuilt bool
9261 modNames []string // Modules to collect AndroidMkEntries for
9262 otherApexEnabled []string
9263 }{
9264 {
9265 name: "only_source",
9266 stublibBp: stublibSourceBp,
9267 usePrebuilt: false,
9268 modNames: []string{"stublib"},
9269 otherApexEnabled: []string{"true", "false"},
9270 },
9271 {
9272 name: "source_preferred",
9273 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9274 usePrebuilt: false,
9275 modNames: []string{"stublib", "prebuilt_stublib"},
9276 otherApexEnabled: []string{"true", "false"},
9277 },
9278 {
9279 name: "prebuilt_preferred",
9280 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9281 usePrebuilt: true,
9282 modNames: []string{"stublib", "prebuilt_stublib"},
9283 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9284 },
9285 {
9286 name: "only_prebuilt",
9287 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9288 usePrebuilt: true,
9289 modNames: []string{"stublib"},
9290 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9291 },
9292 }
9293
9294 for _, test := range tests {
9295 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009296 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009297 for _, otherApexEnabled := range test.otherApexEnabled {
9298 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009299 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009300 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009301
9302 type modAndMkEntries struct {
9303 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009304 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009305 }
9306 entries := []*modAndMkEntries{}
9307
9308 // Gather shared lib modules that are installable
9309 for _, modName := range test.modNames {
9310 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9311 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9312 continue
9313 }
9314 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009315 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009316 continue
9317 }
Yu Liue70976d2024-10-15 20:45:35 +00009318 info := android.AndroidMkInfoForTest(t, ctx, mod)
9319 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9320 ents = append(ents, info.ExtraInfo...)
9321 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009322 if ent.Disabled {
9323 continue
9324 }
9325 entries = append(entries, &modAndMkEntries{
9326 mod: mod,
9327 mkEntries: ent,
9328 })
9329 }
9330 }
9331 }
9332
9333 var entry *modAndMkEntries = nil
9334 for _, ent := range entries {
9335 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9336 if entry != nil {
9337 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9338 } else {
9339 entry = ent
9340 }
9341 }
9342 }
9343
9344 if entry == nil {
9345 t.Errorf("AndroidMk entry for \"stublib\" missing")
9346 } else {
9347 isPrebuilt := entry.mod.Prebuilt() != nil
9348 if isPrebuilt != test.usePrebuilt {
9349 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9350 }
9351 if !entry.mod.IsStubs() {
9352 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9353 }
9354 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9355 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9356 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009357 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009358 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009359 if !android.InList(expected, cflags) {
9360 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9361 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009362 }
9363 })
9364 }
9365 })
9366 }
9367}
9368
Colin Crossc33e5212021-05-25 18:16:02 -07009369func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009370 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009371 bp := `
9372 apex {
9373 name: "myapex",
9374 key: "myapex.key",
9375 java_libs: ["mylib"],
9376 bootclasspath_fragments: ["mybootclasspathfragment"],
9377 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9378 updatable: false,
9379 }
9380
9381 apex_key {
9382 name: "myapex.key",
9383 public_key: "testkey.avbpubkey",
9384 private_key: "testkey.pem",
9385 }
9386
9387 java_library {
9388 name: "mylib",
9389 srcs: ["mylib.java"],
9390 apex_available: ["myapex"],
9391 compile_dex: true,
9392 }
9393
9394 bootclasspath_fragment {
9395 name: "mybootclasspathfragment",
9396 contents: ["mybootclasspathlib"],
9397 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009398 hidden_api: {
9399 split_packages: ["*"],
9400 },
Colin Crossc33e5212021-05-25 18:16:02 -07009401 }
9402
9403 java_library {
9404 name: "mybootclasspathlib",
9405 srcs: ["mybootclasspathlib.java"],
9406 apex_available: ["myapex"],
9407 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009408 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009409 }
9410
9411 systemserverclasspath_fragment {
9412 name: "mysystemserverclasspathfragment",
9413 contents: ["mysystemserverclasspathlib"],
9414 apex_available: ["myapex"],
9415 }
9416
9417 java_library {
9418 name: "mysystemserverclasspathlib",
9419 srcs: ["mysystemserverclasspathlib.java"],
9420 apex_available: ["myapex"],
9421 compile_dex: true,
9422 }
9423 `
9424
9425 result := android.GroupFixturePreparers(
9426 PrepareForTestWithApexBuildComponents,
9427 prepareForTestWithMyapex,
9428 java.PrepareForTestWithJavaDefaultModules,
9429 android.PrepareForTestWithAndroidBuildComponents,
9430 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009431 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9432 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009433 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009434 ).RunTest(t)
9435
9436 // Make sure jacoco ran on both mylib and mybootclasspathlib
9437 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9438 t.Errorf("Failed to find jacoco rule for mylib")
9439 }
9440 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9441 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9442 }
9443 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9444 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9445 }
9446}
9447
Jiyong Park192600a2021-08-03 07:52:17 +00009448func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009449 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009450 testApexError(t, `executable mybin is static`, `
9451 apex {
9452 name: "myapex",
9453 key: "myapex.key",
9454 binaries: ["mybin"],
9455 min_sdk_version: "29",
9456 }
9457
9458 apex_key {
9459 name: "myapex.key",
9460 public_key: "testkey.avbpubkey",
9461 private_key: "testkey.pem",
9462 }
9463
9464 cc_binary {
9465 name: "mybin",
9466 srcs: ["mylib.cpp"],
9467 relative_install_path: "foo/bar",
9468 static_executable: true,
9469 system_shared_libs: [],
9470 stl: "none",
9471 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009472 min_sdk_version: "29",
9473 }
9474 `)
9475
9476 testApexError(t, `executable mybin.rust is static`, `
9477 apex {
9478 name: "myapex",
9479 key: "myapex.key",
9480 binaries: ["mybin.rust"],
9481 min_sdk_version: "29",
9482 }
9483
9484 apex_key {
9485 name: "myapex.key",
9486 public_key: "testkey.avbpubkey",
9487 private_key: "testkey.pem",
9488 }
9489
9490 rust_binary {
9491 name: "mybin.rust",
9492 srcs: ["foo.rs"],
9493 static_executable: true,
9494 apex_available: ["myapex"],
9495 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009496 }
9497 `)
9498}
9499
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009500func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009501 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009502 ctx := testApex(t, `
9503 apex {
9504 name: "myapex",
9505 key: "myapex.key",
9506 updatable: false,
9507 java_libs: ["foo"],
9508 }
9509
9510 apex_key {
9511 name: "myapex.key",
9512 public_key: "testkey.avbpubkey",
9513 private_key: "testkey.pem",
9514 }
9515
9516 java_library {
9517 name: "foo",
9518 srcs: ["foo.java"],
9519 apex_available: ["myapex"],
9520 installable: true,
9521 }
9522 `,
9523 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9524 )
9525
Jooyung Hana0503a52023-08-23 13:12:50 +09009526 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009527 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9528 var builder strings.Builder
9529 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9530 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009531 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 +00009532}
9533
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009534func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009535 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009536 ctx := testApex(t, `
9537 apex {
9538 name: "myapex",
9539 key: "myapex.key",
9540 updatable: false,
9541 java_libs: ["foo"],
9542 required: ["otherapex"],
9543 }
9544
9545 apex {
9546 name: "otherapex",
9547 key: "myapex.key",
9548 updatable: false,
9549 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009550 }
9551
9552 apex_key {
9553 name: "myapex.key",
9554 public_key: "testkey.avbpubkey",
9555 private_key: "testkey.pem",
9556 }
9557
9558 java_library {
9559 name: "foo",
9560 srcs: ["foo.java"],
9561 apex_available: ["myapex", "otherapex"],
9562 installable: true,
9563 }
9564 `)
9565
Jooyung Hana0503a52023-08-23 13:12:50 +09009566 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009567 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9568 var builder strings.Builder
9569 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9570 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009571 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009572}
9573
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009574func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009575 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009576 ctx := testApex(t, `
9577 apex {
9578 name: "myapex",
9579 key: "myapex.key",
9580 updatable: false,
9581 }
9582
9583 apex_key {
9584 name: "myapex.key",
9585 public_key: "testkey.avbpubkey",
9586 private_key: "testkey.pem",
9587 }
9588 `)
9589
Jooyung Hana0503a52023-08-23 13:12:50 +09009590 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009591 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009592 data := android.AndroidMkDataForTest(t, ctx, bundle)
9593 var builder strings.Builder
9594 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9595 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009596 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009597}
9598
Jooyung Hana6d36672022-02-24 13:58:07 +09009599func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009600 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009601 for _, tc := range []struct {
9602 name string
9603 ref string
9604 expected_data []string
9605 }{
9606 {
9607 name: "test_using_output",
9608 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009609 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009610 },
9611 {
9612 name: "test_using_apex",
9613 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009614 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009615 },
9616 } {
9617 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009618 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009619 ctx := testApex(t, `
9620 apex {
9621 name: "myapex",
9622 key: "myapex.key",
9623 compressible: true,
9624 updatable: false,
9625 }
9626
9627 apex_key {
9628 name: "myapex.key",
9629 public_key: "testkey.avbpubkey",
9630 private_key: "testkey.pem",
9631 }
9632
9633 java_test {
9634 name: "`+tc.name+`",
9635 srcs: ["a.java"],
9636 data: ["`+tc.ref+`"],
9637 }
9638 `,
9639 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9640 variables.CompressedApex = proptools.BoolPtr(true)
9641 }))
9642 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9643 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9644 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9645 })
9646 }
9647}
9648
satayev758968a2021-12-06 11:42:40 +00009649func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009650 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009651 preparer := android.GroupFixturePreparers(
9652 PrepareForTestWithApexBuildComponents,
9653 prepareForTestWithMyapex,
9654 java.PrepareForTestWithJavaSdkLibraryFiles,
9655 java.PrepareForTestWithJavaDefaultModules,
9656 android.PrepareForTestWithAndroidBuildComponents,
9657 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9658 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9659 )
9660
9661 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9662 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009663 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009664 preparer.RunTestWithBp(t, `
9665 apex {
9666 name: "myapex",
9667 key: "myapex.key",
9668 bootclasspath_fragments: ["mybootclasspathfragment"],
9669 min_sdk_version: "30",
9670 updatable: false,
9671 }
9672
9673 apex_key {
9674 name: "myapex.key",
9675 public_key: "testkey.avbpubkey",
9676 private_key: "testkey.pem",
9677 }
9678
9679 bootclasspath_fragment {
9680 name: "mybootclasspathfragment",
9681 contents: ["mybootclasspathlib"],
9682 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009683 hidden_api: {
9684 split_packages: ["*"],
9685 },
satayev758968a2021-12-06 11:42:40 +00009686 }
9687
9688 java_sdk_library {
9689 name: "mybootclasspathlib",
9690 srcs: ["mybootclasspathlib.java"],
9691 apex_available: ["myapex"],
9692 compile_dex: true,
9693 unsafe_ignore_missing_latest_api: true,
9694 min_sdk_version: "31",
9695 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009696 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009697 }
9698
9699 java_library {
9700 name: "util",
9701 srcs: ["a.java"],
9702 apex_available: ["myapex"],
9703 min_sdk_version: "31",
9704 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009705 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009706 }
9707
9708 java_library {
9709 name: "another_util",
9710 srcs: ["a.java"],
9711 min_sdk_version: "31",
9712 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009713 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009714 }
9715 `)
9716 })
9717
9718 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9719 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009720 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009721 preparer.RunTestWithBp(t, `
9722 apex {
9723 name: "myapex",
9724 key: "myapex.key",
9725 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9726 min_sdk_version: "30",
9727 updatable: false,
9728 }
9729
9730 apex_key {
9731 name: "myapex.key",
9732 public_key: "testkey.avbpubkey",
9733 private_key: "testkey.pem",
9734 }
9735
9736 systemserverclasspath_fragment {
9737 name: "mysystemserverclasspathfragment",
9738 contents: ["mysystemserverclasspathlib"],
9739 apex_available: ["myapex"],
9740 }
9741
9742 java_sdk_library {
9743 name: "mysystemserverclasspathlib",
9744 srcs: ["mysystemserverclasspathlib.java"],
9745 apex_available: ["myapex"],
9746 compile_dex: true,
9747 min_sdk_version: "32",
9748 unsafe_ignore_missing_latest_api: true,
9749 static_libs: ["util"],
9750 }
9751
9752 java_library {
9753 name: "util",
9754 srcs: ["a.java"],
9755 apex_available: ["myapex"],
9756 min_sdk_version: "31",
9757 static_libs: ["another_util"],
9758 }
9759
9760 java_library {
9761 name: "another_util",
9762 srcs: ["a.java"],
9763 min_sdk_version: "31",
9764 apex_available: ["myapex"],
9765 }
9766 `)
9767 })
9768
9769 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009770 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009771 preparer.
satayev758968a2021-12-06 11:42:40 +00009772 RunTestWithBp(t, `
9773 apex {
9774 name: "myapex",
9775 key: "myapex.key",
9776 bootclasspath_fragments: ["mybootclasspathfragment"],
9777 min_sdk_version: "30",
9778 updatable: false,
9779 }
9780
9781 apex_key {
9782 name: "myapex.key",
9783 public_key: "testkey.avbpubkey",
9784 private_key: "testkey.pem",
9785 }
9786
9787 bootclasspath_fragment {
9788 name: "mybootclasspathfragment",
9789 contents: ["mybootclasspathlib"],
9790 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009791 hidden_api: {
9792 split_packages: ["*"],
9793 },
satayev758968a2021-12-06 11:42:40 +00009794 }
9795
9796 java_sdk_library {
9797 name: "mybootclasspathlib",
9798 srcs: ["mybootclasspathlib.java"],
9799 apex_available: ["myapex"],
9800 compile_dex: true,
9801 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009802 sdk_version: "current",
9803 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009804 }
9805 `)
9806 })
9807
9808 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009809 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009810 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9811 RunTestWithBp(t, `
9812 apex {
9813 name: "myapex",
9814 key: "myapex.key",
9815 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9816 min_sdk_version: "30",
9817 updatable: false,
9818 }
9819
9820 apex_key {
9821 name: "myapex.key",
9822 public_key: "testkey.avbpubkey",
9823 private_key: "testkey.pem",
9824 }
9825
9826 systemserverclasspath_fragment {
9827 name: "mysystemserverclasspathfragment",
9828 contents: ["mysystemserverclasspathlib"],
9829 apex_available: ["myapex"],
9830 }
9831
9832 java_sdk_library {
9833 name: "mysystemserverclasspathlib",
9834 srcs: ["mysystemserverclasspathlib.java"],
9835 apex_available: ["myapex"],
9836 compile_dex: true,
9837 unsafe_ignore_missing_latest_api: true,
9838 }
9839 `)
9840 })
9841}
9842
Jiakai Zhang6decef92022-01-12 17:56:19 +00009843// Verifies that the APEX depends on all the Make modules in the list.
9844func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9845 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9846 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009847 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009848 }
9849}
9850
9851// Verifies that the APEX does not depend on any of the Make modules in the list.
9852func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9853 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9854 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009855 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009856 }
9857}
9858
Cole Faust24e25c02024-01-19 14:12:17 -08009859func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009860 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009861 bpTemplate := `
9862 apex {
9863 name: "myapex",
9864 key: "myapex.key",
9865 java_libs: ["myjavalib"],
9866 updatable: %v,
9867 min_sdk_version: "29",
9868 }
9869 apex_key {
9870 name: "myapex.key",
9871 }
9872 java_library {
9873 name: "myjavalib",
9874 srcs: ["MyClass.java"],
9875 apex_available: [ "myapex" ],
9876 lint: {
9877 strict_updatability_linting: %v,
9878 %s
9879 },
9880 sdk_version: "current",
9881 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009882 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009883 }
9884 `
9885 fs := android.MockFS{
9886 "lint-baseline.xml": nil,
9887 }
9888
9889 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009890 testCaseName string
9891 apexUpdatable bool
9892 javaStrictUpdtabilityLint bool
9893 lintFileExists bool
9894 disallowedFlagExpectedOnApex bool
9895 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009896 }{
9897 {
Colin Cross87427352024-09-25 15:41:19 -07009898 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9899 apexUpdatable: true,
9900 javaStrictUpdtabilityLint: true,
9901 lintFileExists: false,
9902 disallowedFlagExpectedOnApex: false,
9903 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009904 },
9905 {
Colin Cross87427352024-09-25 15:41:19 -07009906 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9907 apexUpdatable: false,
9908 javaStrictUpdtabilityLint: false,
9909 lintFileExists: true,
9910 disallowedFlagExpectedOnApex: false,
9911 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009912 },
9913 {
Colin Cross87427352024-09-25 15:41:19 -07009914 testCaseName: "non-updatable apex respects strict updatability of javalib",
9915 apexUpdatable: false,
9916 javaStrictUpdtabilityLint: true,
9917 lintFileExists: true,
9918 disallowedFlagExpectedOnApex: false,
9919 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009920 },
9921 {
Colin Cross87427352024-09-25 15:41:19 -07009922 testCaseName: "updatable apex checks strict updatability of javalib",
9923 apexUpdatable: true,
9924 javaStrictUpdtabilityLint: false,
9925 lintFileExists: true,
9926 disallowedFlagExpectedOnApex: true,
9927 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009928 },
9929 }
9930
9931 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009932 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009933 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009934 fixtures := []android.FixturePreparer{}
9935 baselineProperty := ""
9936 if testCase.lintFileExists {
9937 fixtures = append(fixtures, fs.AddToFixture())
9938 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9939 }
9940 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009941
Colin Cross87427352024-09-25 15:41:19 -07009942 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009943
Colin Cross87427352024-09-25 15:41:19 -07009944 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9945 if expectStrictUpdatability {
9946 if m.Rule == nil {
9947 t.Errorf("expected strict updatability check rule on %s", name)
9948 } else {
9949 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9950 m.RuleParams.Command, "--disallowed_issues NewApi")
9951 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9952 m.Inputs.Strings(), "lint-baseline.xml")
9953 }
9954 } else {
9955 if m.Rule != nil {
9956 t.Errorf("expected no strict updatability check rule on %s", name)
9957 }
9958 }
9959 }
9960
9961 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9962 apex := result.ModuleForTests("myapex", "android_common_myapex")
9963 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9964 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9965
9966 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9967 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9968 })
Cole Faust24e25c02024-01-19 14:12:17 -08009969 }
9970}
9971
Cole Faust24e25c02024-01-19 14:12:17 -08009972// checks transtive deps of an apex coming from bootclasspath_fragment
9973func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009974 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009975 bp := `
9976 apex {
9977 name: "myapex",
9978 key: "myapex.key",
9979 bootclasspath_fragments: ["mybootclasspathfragment"],
9980 updatable: true,
9981 min_sdk_version: "29",
9982 }
9983 apex_key {
9984 name: "myapex.key",
9985 }
9986 bootclasspath_fragment {
9987 name: "mybootclasspathfragment",
9988 contents: ["myjavalib"],
9989 apex_available: ["myapex"],
9990 hidden_api: {
9991 split_packages: ["*"],
9992 },
9993 }
9994 java_library {
9995 name: "myjavalib",
9996 srcs: ["MyClass.java"],
9997 apex_available: [ "myapex" ],
9998 sdk_version: "current",
9999 min_sdk_version: "29",
10000 compile_dex: true,
10001 lint: {
10002 baseline_filename: "lint-baseline.xml",
10003 }
10004 }
10005 `
10006 fs := android.MockFS{
10007 "lint-baseline.xml": nil,
10008 }
10009
10010 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010011 apex := result.ModuleForTests("myapex", "android_common_myapex")
10012 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10013 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10014 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10015 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10016 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010017}
Spandan Das66773252022-01-15 00:23:18 +000010018
Jihoon Kang784c0052024-06-25 22:15:39 +000010019func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010020 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010021 bp := `
10022 apex {
10023 name: "myapex",
10024 key: "myapex.key",
10025 bootclasspath_fragments: ["mybootclasspathfragment"],
10026 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010027 java_libs: [
10028 "jacocoagent",
10029 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010030 }
10031 apex_key {
10032 name: "myapex.key",
10033 }
10034 bootclasspath_fragment {
10035 name: "mybootclasspathfragment",
10036 contents: ["foo"],
10037 apex_available: ["myapex"],
10038 hidden_api: {
10039 split_packages: ["*"],
10040 },
10041 }
10042 java_sdk_library {
10043 name: "foo",
10044 srcs: ["MyClass.java"],
10045 apex_available: [ "myapex" ],
10046 sdk_version: "current",
10047 min_sdk_version: "29",
10048 compile_dex: true,
10049 }
10050 `
10051 fs := android.MockFS{
10052 "lint-baseline.xml": nil,
10053 }
10054
10055 result := android.GroupFixturePreparers(
10056 prepareForApexTest,
10057 java.PrepareForTestWithJavaSdkLibraryFiles,
10058 java.PrepareForTestWithJacocoInstrumentation,
10059 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010060 android.FixtureMergeMockFs(fs),
10061 ).RunTestWithBp(t, bp)
10062
10063 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10064 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10065 android.AssertStringDoesContain(t,
10066 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10067 lintReportInputs, "foo.impl")
10068}
10069
Spandan Das42e89502022-05-06 22:12:55 +000010070// updatable apexes should propagate updatable=true to its apps
10071func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010072 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010073 bp := `
10074 apex {
10075 name: "myapex",
10076 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010077 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010078 apps: [
10079 "myapp",
10080 ],
10081 min_sdk_version: "30",
10082 }
10083 apex_key {
10084 name: "myapex.key",
10085 }
10086 android_app {
10087 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010088 apex_available: [
10089 "myapex",
10090 ],
10091 sdk_version: "current",
10092 min_sdk_version: "30",
10093 }
10094 `
Colin Cross99939e92024-10-01 16:02:46 -070010095 _ = android.GroupFixturePreparers(
10096 prepareForApexTest,
10097 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10098 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010099}
10100
Jingwen Chendea7a642023-03-28 11:30:50 +000010101func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010102 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010103 ctx := testApex(t, `
10104 apex {
10105 name: "myapex",
10106 key: "myapex.key",
10107 updatable: false,
10108 }
10109
10110 apex_key {
10111 name: "myapex.key",
10112 public_key: "testkey.avbpubkey",
10113 private_key: "testkey.pem",
10114 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010115 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010116 generateFsRule := mod.Rule("generateFsConfig")
10117 cmd := generateFsRule.RuleParams.Command
10118
10119 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10120}
10121
10122func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010123 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010124 ctx := testApex(t, `
10125 apex {
10126 name: "myapex",
10127 key: "myapex.key",
10128 canned_fs_config: "my_config",
10129 updatable: false,
10130 }
10131
10132 apex_key {
10133 name: "myapex.key",
10134 public_key: "testkey.avbpubkey",
10135 private_key: "testkey.pem",
10136 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010137 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010138 generateFsRule := mod.Rule("generateFsConfig")
10139 cmd := generateFsRule.RuleParams.Command
10140
10141 // Ensure that canned_fs_config has "cat my_config" at the end
10142 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10143}
Spandan Das20fce2d2023-04-12 17:21:39 +000010144
10145func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010146 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010147 testCases := []struct {
10148 desc string
10149 hasStubs bool
10150 apexAvailable string
10151 expectedError string
10152 }{
10153 {
10154 desc: "non-stub library can have multiple apex_available",
10155 hasStubs: false,
10156 apexAvailable: `["myapex", "otherapex"]`,
10157 },
10158 {
10159 desc: "stub library should not be available to anyapex",
10160 hasStubs: true,
10161 apexAvailable: `["//apex_available:anyapex"]`,
10162 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10163 },
10164 {
10165 desc: "stub library should not be available to multiple apexes",
10166 hasStubs: true,
10167 apexAvailable: `["myapex", "otherapex"]`,
10168 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10169 },
10170 {
10171 desc: "stub library can be available to a core apex and a test apex",
10172 hasStubs: true,
10173 apexAvailable: `["myapex", "test_myapex"]`,
10174 },
10175 }
10176 bpTemplate := `
10177 cc_library {
10178 name: "libfoo",
10179 %v
10180 apex_available: %v,
10181 }
10182 apex {
10183 name: "myapex",
10184 key: "apex.key",
10185 updatable: false,
10186 native_shared_libs: ["libfoo"],
10187 }
10188 apex {
10189 name: "otherapex",
10190 key: "apex.key",
10191 updatable: false,
10192 }
10193 apex_test {
10194 name: "test_myapex",
10195 key: "apex.key",
10196 updatable: false,
10197 native_shared_libs: ["libfoo"],
10198 }
10199 apex_key {
10200 name: "apex.key",
10201 }
10202 `
10203 for _, tc := range testCases {
10204 stubs := ""
10205 if tc.hasStubs {
10206 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10207 }
10208 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10209 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10210 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10211 })
10212 if tc.expectedError == "" {
10213 testApex(t, bp, mockFsFixturePreparer)
10214 } else {
10215 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10216 }
10217 }
10218}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010219
10220func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010221 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010222 context := android.GroupFixturePreparers(
10223 android.PrepareForIntegrationTestWithAndroid,
10224 cc.PrepareForIntegrationTestWithCc,
10225 PrepareForTestWithApexBuildComponents,
10226 prepareForTestWithMyapex,
10227 filesystem.PrepareForTestWithFilesystemBuildComponents,
10228 )
10229 result := context.RunTestWithBp(t, `
10230 android_system_image {
10231 name: "myfilesystem",
10232 deps: [
10233 "libfoo",
10234 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010235 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010236 gen_linker_config: true,
10237 linker_config_srcs: ["linker.config.json"],
10238 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010239 }
10240
10241 cc_library {
10242 name: "libfoo",
10243 shared_libs: [
10244 "libbar",
10245 ],
10246 stl: "none",
10247 }
10248
10249 cc_library {
10250 name: "libbar",
10251 stl: "none",
10252 apex_available: ["myapex"],
10253 }
10254
10255 apex {
10256 name: "myapex",
10257 native_shared_libs: ["libbar"],
10258 key: "myapex.key",
10259 updatable: false,
10260 }
10261
10262 apex_key {
10263 name: "myapex.key",
10264 public_key: "testkey.avbpubkey",
10265 private_key: "testkey.pem",
10266 }
10267 `)
10268
Cole Faust3b806d32024-03-11 15:15:03 -070010269 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010270 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10271 inputs.Strings(),
10272 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10273}
Yu Liueae7b362023-11-16 17:05:47 -080010274
10275var apex_default_bp = `
10276 apex_key {
10277 name: "myapex.key",
10278 public_key: "testkey.avbpubkey",
10279 private_key: "testkey.pem",
10280 }
10281
10282 filegroup {
10283 name: "myapex.manifest",
10284 srcs: ["apex_manifest.json"],
10285 }
10286
10287 filegroup {
10288 name: "myapex.androidmanifest",
10289 srcs: ["AndroidManifest.xml"],
10290 }
10291`
10292
10293func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010294 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010295 ctx := testApex(t, apex_default_bp+`
10296 apex {
10297 name: "myapex",
10298 manifest: ":myapex.manifest",
10299 androidManifest: ":myapex.androidmanifest",
10300 key: "myapex.key",
10301 java_libs: [
10302 "my_java_library_foo",
10303 "my_java_library_bar",
10304 ],
10305 updatable: false,
10306 }
10307
10308 java_library {
10309 name: "my_java_library_foo",
10310 srcs: ["foo/bar/MyClass.java"],
10311 sdk_version: "none",
10312 system_modules: "none",
10313 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010314 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010315 "myapex",
10316 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010317 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010318 }
10319
10320 java_library {
10321 name: "my_java_library_bar",
10322 srcs: ["foo/bar/MyClass.java"],
10323 sdk_version: "none",
10324 system_modules: "none",
10325 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010326 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010327 "myapex",
10328 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010329 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010330 }
10331
10332 aconfig_declarations {
10333 name: "my_aconfig_declarations_foo",
10334 package: "com.example.package",
10335 container: "myapex",
10336 srcs: ["foo.aconfig"],
10337 }
10338
10339 java_aconfig_library {
10340 name: "my_java_aconfig_library_foo",
10341 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010342 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010343 "myapex",
10344 ],
10345 }
10346
10347 aconfig_declarations {
10348 name: "my_aconfig_declarations_bar",
10349 package: "com.example.package",
10350 container: "myapex",
10351 srcs: ["bar.aconfig"],
10352 }
10353
10354 java_aconfig_library {
10355 name: "my_java_aconfig_library_bar",
10356 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010357 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010358 "myapex",
10359 ],
10360 }
10361 `)
10362
10363 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10364 s := mod.Rule("apexRule").Args["copy_commands"]
10365 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010366 if len(copyCmds) != 14 {
10367 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010368 }
10369
Jooyung Hana3fddf42024-09-03 13:22:21 +090010370 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10371 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10372 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10373 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010374 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010375
Yu Liubba555e2024-02-17 00:36:42 +000010376 inputs := []string{
10377 "my_aconfig_declarations_foo/intermediate.pb",
10378 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010379 }
Yu Liubba555e2024-02-17 00:36:42 +000010380 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10381 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10382 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10383 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010384 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010385}
10386
10387func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010388 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010389 ctx := testApex(t, apex_default_bp+`
10390 apex {
10391 name: "myapex",
10392 manifest: ":myapex.manifest",
10393 androidManifest: ":myapex.androidmanifest",
10394 key: "myapex.key",
10395 java_libs: [
10396 "my_java_library_foo",
10397 ],
10398 native_shared_libs: [
10399 "my_cc_library_bar",
10400 ],
10401 binaries: [
10402 "my_cc_binary_baz",
10403 ],
10404 updatable: false,
10405 }
10406
10407 java_library {
10408 name: "my_java_library_foo",
10409 srcs: ["foo/bar/MyClass.java"],
10410 sdk_version: "none",
10411 system_modules: "none",
10412 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010413 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010414 "myapex",
10415 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010416 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010417 }
10418
10419 cc_library {
10420 name: "my_cc_library_bar",
10421 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010422 static_libs: [
10423 "my_cc_aconfig_library_bar",
10424 "my_cc_aconfig_library_baz",
10425 ],
Yu Liueae7b362023-11-16 17:05:47 -080010426 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010427 "myapex",
10428 ],
10429 }
10430
10431 cc_binary {
10432 name: "my_cc_binary_baz",
10433 srcs: ["foo/bar/MyClass.cc"],
10434 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010435 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010436 "myapex",
10437 ],
10438 }
10439
10440 aconfig_declarations {
10441 name: "my_aconfig_declarations_foo",
10442 package: "com.example.package",
10443 container: "myapex",
10444 srcs: ["foo.aconfig"],
10445 }
10446
10447 java_aconfig_library {
10448 name: "my_java_aconfig_library_foo",
10449 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010450 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010451 "myapex",
10452 ],
10453 }
10454
10455 aconfig_declarations {
10456 name: "my_aconfig_declarations_bar",
10457 package: "com.example.package",
10458 container: "myapex",
10459 srcs: ["bar.aconfig"],
10460 }
10461
10462 cc_aconfig_library {
10463 name: "my_cc_aconfig_library_bar",
10464 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010465 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010466 "myapex",
10467 ],
10468 }
10469
10470 aconfig_declarations {
10471 name: "my_aconfig_declarations_baz",
10472 package: "com.example.package",
10473 container: "myapex",
10474 srcs: ["baz.aconfig"],
10475 }
10476
10477 cc_aconfig_library {
10478 name: "my_cc_aconfig_library_baz",
10479 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010480 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010481 "myapex",
10482 ],
10483 }
10484
10485 cc_library {
10486 name: "server_configurable_flags",
10487 srcs: ["server_configurable_flags.cc"],
10488 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010489 cc_library {
10490 name: "libbase",
10491 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010492 apex_available: [
10493 "myapex",
10494 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010495 }
10496 cc_library {
10497 name: "libaconfig_storage_read_api_cc",
10498 srcs: ["libaconfig_storage_read_api_cc.cc"],
10499 }
Yu Liueae7b362023-11-16 17:05:47 -080010500 `)
10501
10502 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10503 s := mod.Rule("apexRule").Args["copy_commands"]
10504 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010505 if len(copyCmds) != 18 {
10506 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010507 }
10508
Jooyung Hana3fddf42024-09-03 13:22:21 +090010509 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10510 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10511 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10512 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010513 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010514
Yu Liubba555e2024-02-17 00:36:42 +000010515 inputs := []string{
10516 "my_aconfig_declarations_foo/intermediate.pb",
10517 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10518 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010519 }
Yu Liubba555e2024-02-17 00:36:42 +000010520 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10521 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10522 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10523 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010524 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010525}
10526
Yu Liucec0e412023-11-30 16:45:50 -080010527func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010528 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010529 ctx := testApex(t, apex_default_bp+`
10530 apex {
10531 name: "myapex",
10532 manifest: ":myapex.manifest",
10533 androidManifest: ":myapex.androidmanifest",
10534 key: "myapex.key",
10535 native_shared_libs: [
10536 "libmy_rust_library",
10537 ],
10538 binaries: [
10539 "my_rust_binary",
10540 ],
10541 rust_dyn_libs: [
10542 "libmy_rust_dylib",
10543 ],
10544 updatable: false,
10545 }
10546
10547 rust_library {
10548 name: "libflags_rust", // test mock
10549 crate_name: "flags_rust",
10550 srcs: ["lib.rs"],
10551 apex_available: [
10552 "myapex",
10553 ],
10554 }
10555
10556 rust_library {
10557 name: "liblazy_static", // test mock
10558 crate_name: "lazy_static",
10559 srcs: ["src/lib.rs"],
10560 apex_available: [
10561 "myapex",
10562 ],
10563 }
10564
Ted Bauer02d475c2024-03-27 20:56:26 +000010565 rust_library {
10566 name: "libaconfig_storage_read_api", // test mock
10567 crate_name: "aconfig_storage_read_api",
10568 srcs: ["src/lib.rs"],
10569 apex_available: [
10570 "myapex",
10571 ],
10572 }
10573
Ted Bauer6ef40db2024-03-29 14:04:10 +000010574 rust_library {
10575 name: "liblogger", // test mock
10576 crate_name: "logger",
10577 srcs: ["src/lib.rs"],
10578 apex_available: [
10579 "myapex",
10580 ],
10581 }
10582
10583 rust_library {
10584 name: "liblog_rust", // test mock
10585 crate_name: "log_rust",
10586 srcs: ["src/lib.rs"],
10587 apex_available: [
10588 "myapex",
10589 ],
10590 }
10591
Yu Liucec0e412023-11-30 16:45:50 -080010592 rust_ffi_shared {
10593 name: "libmy_rust_library",
10594 srcs: ["src/lib.rs"],
10595 rustlibs: ["libmy_rust_aconfig_library_foo"],
10596 crate_name: "my_rust_library",
10597 apex_available: [
10598 "myapex",
10599 ],
10600 }
10601
10602 rust_library_dylib {
10603 name: "libmy_rust_dylib",
10604 srcs: ["foo/bar/MyClass.rs"],
10605 rustlibs: ["libmy_rust_aconfig_library_bar"],
10606 crate_name: "my_rust_dylib",
10607 apex_available: [
10608 "myapex",
10609 ],
10610 }
10611
10612 rust_binary {
10613 name: "my_rust_binary",
10614 srcs: ["foo/bar/MyClass.rs"],
10615 rustlibs: [
10616 "libmy_rust_aconfig_library_baz",
10617 "libmy_rust_dylib",
10618 ],
10619 apex_available: [
10620 "myapex",
10621 ],
10622 }
10623
10624 aconfig_declarations {
10625 name: "my_aconfig_declarations_foo",
10626 package: "com.example.package",
10627 container: "myapex",
10628 srcs: ["foo.aconfig"],
10629 }
10630
10631 aconfig_declarations {
10632 name: "my_aconfig_declarations_bar",
10633 package: "com.example.package",
10634 container: "myapex",
10635 srcs: ["bar.aconfig"],
10636 }
10637
10638 aconfig_declarations {
10639 name: "my_aconfig_declarations_baz",
10640 package: "com.example.package",
10641 container: "myapex",
10642 srcs: ["baz.aconfig"],
10643 }
10644
10645 rust_aconfig_library {
10646 name: "libmy_rust_aconfig_library_foo",
10647 aconfig_declarations: "my_aconfig_declarations_foo",
10648 crate_name: "my_rust_aconfig_library_foo",
10649 apex_available: [
10650 "myapex",
10651 ],
10652 }
10653
10654 rust_aconfig_library {
10655 name: "libmy_rust_aconfig_library_bar",
10656 aconfig_declarations: "my_aconfig_declarations_bar",
10657 crate_name: "my_rust_aconfig_library_bar",
10658 apex_available: [
10659 "myapex",
10660 ],
10661 }
10662
10663 rust_aconfig_library {
10664 name: "libmy_rust_aconfig_library_baz",
10665 aconfig_declarations: "my_aconfig_declarations_baz",
10666 crate_name: "my_rust_aconfig_library_baz",
10667 apex_available: [
10668 "myapex",
10669 ],
10670 }
10671 `)
10672
10673 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10674 s := mod.Rule("apexRule").Args["copy_commands"]
10675 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010676 if len(copyCmds) != 38 {
10677 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010678 }
10679
Jooyung Hana3fddf42024-09-03 13:22:21 +090010680 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10681 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10682 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10683 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010684 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010685
Yu Liubba555e2024-02-17 00:36:42 +000010686 inputs := []string{
10687 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010688 "my_aconfig_declarations_bar/intermediate.pb",
10689 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010690 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10691 }
10692 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10693 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10694 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10695 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010696 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010697}
10698
10699func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10700 aconfigRule := mod.Description(desc)
10701 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010702 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010703 if len(aconfigArgs) != len(inputs) {
10704 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010705 }
Yu Liucec0e412023-11-30 16:45:50 -080010706
Yu Liubba555e2024-02-17 00:36:42 +000010707 ensureEquals(t, container, aconfigRule.Args["container"])
10708 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10709
10710 buildParams := aconfigRule.BuildParams
10711 for _, input := range inputs {
10712 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10713 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010714 }
Yu Liubba555e2024-02-17 00:36:42 +000010715
10716 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010717}
10718
Yu Liueae7b362023-11-16 17:05:47 -080010719func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010720 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010721 ctx := testApex(t, apex_default_bp+`
10722 apex {
10723 name: "myapex",
10724 manifest: ":myapex.manifest",
10725 androidManifest: ":myapex.androidmanifest",
10726 key: "myapex.key",
10727 java_libs: [
10728 "my_java_library_foo",
10729 "other_java_library_bar",
10730 ],
10731 updatable: false,
10732 }
10733
10734 java_library {
10735 name: "my_java_library_foo",
10736 srcs: ["foo/bar/MyClass.java"],
10737 sdk_version: "none",
10738 system_modules: "none",
10739 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010740 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010741 "myapex",
10742 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010743 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010744 }
10745
10746 java_library {
10747 name: "other_java_library_bar",
10748 srcs: ["foo/bar/MyClass.java"],
10749 sdk_version: "none",
10750 system_modules: "none",
10751 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010752 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010753 "myapex",
10754 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010755 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010756 }
10757
10758 aconfig_declarations {
10759 name: "my_aconfig_declarations_foo",
10760 package: "com.example.package",
10761 container: "myapex",
10762 srcs: ["foo.aconfig"],
10763 }
10764
10765 java_aconfig_library {
10766 name: "my_java_aconfig_library_foo",
10767 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010768 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010769 "myapex",
10770 ],
10771 }
10772
10773 aconfig_declarations {
10774 name: "other_aconfig_declarations_bar",
10775 package: "com.example.package",
10776 container: "otherapex",
10777 srcs: ["bar.aconfig"],
10778 }
10779
10780 java_aconfig_library {
10781 name: "other_java_aconfig_library_bar",
10782 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010783 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010784 "myapex",
10785 ],
10786 }
10787 `)
10788
10789 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10790 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10791 s := " " + combineAconfigRule.Args["cache_files"]
10792 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10793 if len(aconfigArgs) != 1 {
10794 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10795 }
10796 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10797
10798 buildParams := combineAconfigRule.BuildParams
10799 if len(buildParams.Inputs) != 1 {
10800 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10801 }
10802 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10803 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10804}
10805
10806func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010807 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010808 ctx := testApex(t, apex_default_bp+`
10809 apex {
10810 name: "myapex",
10811 manifest: ":myapex.manifest",
10812 androidManifest: ":myapex.androidmanifest",
10813 key: "myapex.key",
10814 java_libs: [
10815 "my_java_library_foo",
10816 "my_java_library_bar",
10817 ],
10818 updatable: false,
10819 }
10820
10821 java_library {
10822 name: "my_java_library_foo",
10823 srcs: ["foo/bar/MyClass.java"],
10824 sdk_version: "none",
10825 system_modules: "none",
10826 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010827 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010828 "myapex",
10829 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010830 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010831 }
10832
10833 java_library {
10834 name: "my_java_library_bar",
10835 srcs: ["foo/bar/MyClass.java"],
10836 sdk_version: "none",
10837 system_modules: "none",
10838 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010839 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010840 "myapex",
10841 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010842 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010843 }
10844
10845 aconfig_declarations {
10846 name: "my_aconfig_declarations_foo",
10847 package: "com.example.package",
10848 container: "myapex",
10849 srcs: ["foo.aconfig"],
10850 }
10851
10852 java_aconfig_library {
10853 name: "my_java_aconfig_library_foo",
10854 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010855 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010856 "myapex",
10857 ],
10858 }
10859
10860 java_aconfig_library {
10861 name: "my_java_aconfig_library_bar",
10862 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010863 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010864 "myapex",
10865 ],
10866 }
10867 `)
10868
10869 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10870 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10871 s := " " + combineAconfigRule.Args["cache_files"]
10872 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10873 if len(aconfigArgs) != 1 {
10874 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10875 }
10876 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10877
10878 buildParams := combineAconfigRule.BuildParams
10879 if len(buildParams.Inputs) != 1 {
10880 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10881 }
10882 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10883 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10884}
Spandan Das5be63332023-12-13 00:06:32 +000010885
10886// Test that the boot jars come from the _selected_ apex prebuilt
10887// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10888func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010889 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010890 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10891 t.Helper()
10892 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10893 foundLibfooJar := false
10894 base := stem + ".jar"
10895 for _, output := range s.AllOutputs() {
10896 if filepath.Base(output) == base {
10897 foundLibfooJar = true
10898 buildRule := s.Output(output)
10899 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10900 }
10901 }
10902 if !foundLibfooJar {
10903 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10904 }
10905 }
10906
Spandan Das64c9e0c2023-12-20 20:13:34 +000010907 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10908 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10909 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10910 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10911 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10912 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)
10913 }
10914
10915 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10916 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10917 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10918 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10919 }
10920
Spandan Das5be63332023-12-13 00:06:32 +000010921 bp := `
10922 // Source APEX.
10923
10924 java_library {
10925 name: "framework-foo",
10926 srcs: ["foo.java"],
10927 installable: true,
10928 apex_available: [
10929 "com.android.foo",
10930 ],
10931 }
10932
10933 bootclasspath_fragment {
10934 name: "foo-bootclasspath-fragment",
10935 contents: ["framework-foo"],
10936 apex_available: [
10937 "com.android.foo",
10938 ],
10939 hidden_api: {
10940 split_packages: ["*"],
10941 },
10942 }
10943
10944 apex_key {
10945 name: "com.android.foo.key",
10946 public_key: "com.android.foo.avbpubkey",
10947 private_key: "com.android.foo.pem",
10948 }
10949
10950 apex {
10951 name: "com.android.foo",
10952 key: "com.android.foo.key",
10953 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10954 updatable: false,
10955 }
10956
10957 // Prebuilt APEX.
10958
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010959 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010960 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010961 public: {
10962 jars: ["foo.jar"],
10963 },
Spandan Das5be63332023-12-13 00:06:32 +000010964 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010965 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010966 }
10967
10968 prebuilt_bootclasspath_fragment {
10969 name: "foo-bootclasspath-fragment",
10970 contents: ["framework-foo"],
10971 hidden_api: {
10972 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10973 metadata: "my-bootclasspath-fragment/metadata.csv",
10974 index: "my-bootclasspath-fragment/index.csv",
10975 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10976 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10977 },
10978 apex_available: [
10979 "com.android.foo",
10980 ],
10981 }
10982
10983 prebuilt_apex {
10984 name: "com.android.foo",
10985 apex_name: "com.android.foo",
10986 src: "com.android.foo-arm.apex",
10987 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10988 }
10989
10990 // Another Prebuilt ART APEX
10991 prebuilt_apex {
10992 name: "com.android.foo.v2",
10993 apex_name: "com.android.foo", // Used to determine the API domain
10994 src: "com.android.foo-arm.apex",
10995 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10996 }
10997
10998 // APEX contribution modules
10999
11000 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011001 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011002 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011003 contents: ["com.android.foo"],
11004 }
11005
11006 apex_contributions {
11007 name: "foo.prebuilt.contributions",
11008 api_domain: "com.android.foo",
11009 contents: ["prebuilt_com.android.foo"],
11010 }
11011
11012 apex_contributions {
11013 name: "foo.prebuilt.v2.contributions",
11014 api_domain: "com.android.foo",
11015 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011016 }
11017 `
11018
11019 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011020 desc string
11021 selectedApexContributions string
11022 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011023 }{
11024 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011025 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11026 selectedApexContributions: "foo.source.contributions",
11027 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011028 },
11029 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011030 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11031 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011032 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 +000011033 },
11034 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011035 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11036 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011037 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 +000011038 },
11039 }
11040
11041 fragment := java.ApexVariantReference{
11042 Apex: proptools.StringPtr("com.android.foo"),
11043 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11044 }
11045
11046 for _, tc := range testCases {
11047 preparer := android.GroupFixturePreparers(
11048 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11049 android.FixtureMergeMockFs(map[string][]byte{
11050 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11051 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011052 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11053 // file creation.
11054 java.FixtureConfigureBootJars("platform:foo"),
11055 android.FixtureModifyMockFS(func(fs android.MockFS) {
11056 fs["platform/Android.bp"] = []byte(`
11057 java_library {
11058 name: "foo",
11059 srcs: ["Test.java"],
11060 compile_dex: true,
11061 }
11062 `)
11063 fs["platform/Test.java"] = nil
11064 }),
11065
Colin Crossa66b4632024-08-08 15:50:47 -070011066 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011067 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011068 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011069 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011070 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11071 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011072 }
11073}
Spandan Das3576e762024-01-03 18:57:03 +000011074
11075// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11076// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11077func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011078 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011079 // for a mainline module family, check that only the flagged soong module is visible to make
11080 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11081 variation := func(moduleName string) string {
11082 ret := "android_common_com.android.foo"
11083 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011084 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011085 }
11086 return ret
11087 }
11088
11089 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11090 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11091
11092 for _, hiddenModuleName := range hiddenModuleNames {
11093 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11094 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11095
11096 }
11097 }
11098
11099 bp := `
11100 apex_key {
11101 name: "com.android.foo.key",
11102 public_key: "com.android.foo.avbpubkey",
11103 private_key: "com.android.foo.pem",
11104 }
11105
11106 // AOSP source apex
11107 apex {
11108 name: "com.android.foo",
11109 key: "com.android.foo.key",
11110 updatable: false,
11111 }
11112
11113 // Google source apex
11114 override_apex {
11115 name: "com.google.android.foo",
11116 base: "com.android.foo",
11117 key: "com.android.foo.key",
11118 }
11119
11120 // Prebuilt Google APEX.
11121
11122 prebuilt_apex {
11123 name: "com.google.android.foo",
11124 apex_name: "com.android.foo",
11125 src: "com.android.foo-arm.apex",
11126 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11127 }
11128
11129 // Another Prebuilt Google APEX
11130 prebuilt_apex {
11131 name: "com.google.android.foo.v2",
11132 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011133 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011134 src: "com.android.foo-arm.apex",
11135 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11136 }
11137
11138 // APEX contribution modules
11139
11140 apex_contributions {
11141 name: "foo.source.contributions",
11142 api_domain: "com.android.foo",
11143 contents: ["com.google.android.foo"],
11144 }
11145
11146 apex_contributions {
11147 name: "foo.prebuilt.contributions",
11148 api_domain: "com.android.foo",
11149 contents: ["prebuilt_com.google.android.foo"],
11150 }
11151
11152 apex_contributions {
11153 name: "foo.prebuilt.v2.contributions",
11154 api_domain: "com.android.foo",
11155 contents: ["prebuilt_com.google.android.foo.v2"],
11156 }
11157
11158 // This is an incompatible module because it selects multiple versions of the same mainline module
11159 apex_contributions {
11160 name: "foo.prebuilt.duplicate.contributions",
11161 api_domain: "com.android.foo",
11162 contents: [
11163 "prebuilt_com.google.android.foo",
11164 "prebuilt_com.google.android.foo.v2",
11165 ],
11166 }
11167 `
11168
11169 testCases := []struct {
11170 desc string
11171 selectedApexContributions string
11172 expectedVisibleModuleName string
11173 expectedHiddenModuleNames []string
11174 expectedError string
11175 }{
11176 {
11177 desc: "Source apex is selected, prebuilts should be hidden from make",
11178 selectedApexContributions: "foo.source.contributions",
11179 expectedVisibleModuleName: "com.google.android.foo",
11180 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11181 },
11182 {
11183 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11184 selectedApexContributions: "foo.prebuilt.contributions",
11185 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11186 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11187 },
11188 {
11189 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11190 selectedApexContributions: "foo.prebuilt.v2.contributions",
11191 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11192 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11193 },
11194 {
11195 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11196 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11197 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11198 },
11199 }
11200
11201 for _, tc := range testCases {
11202 preparer := android.GroupFixturePreparers(
11203 android.FixtureMergeMockFs(map[string][]byte{
11204 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11205 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011206 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011207 )
11208 if tc.expectedError != "" {
11209 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11210 testApex(t, bp, preparer)
11211 return
11212 }
11213 ctx := testApex(t, bp, preparer)
11214
Spandan Das3576e762024-01-03 18:57:03 +000011215 // Check that
11216 // 1. The contents of the selected apex_contributions are visible to make
11217 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11218 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11219 }
11220}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011221
Spandan Das85bd4622024-08-01 00:51:20 +000011222// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11223func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011224 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011225 // for a mainline module family, check that only the flagged soong module is visible to make
11226 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11227 variation := func(moduleName string) string {
11228 ret := "android_common_com.android.adservices"
11229 if moduleName == "com.google.android.foo" {
11230 ret = "android_common_com.google.android.foo_com.google.android.foo"
11231 }
11232 return ret
11233 }
11234
11235 for _, visibleModuleName := range visibleModuleNames {
11236 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11237 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11238 }
11239
11240 for _, hiddenModuleName := range hiddenModuleNames {
11241 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11242 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11243
11244 }
11245 }
11246
11247 bp := `
11248 apex_key {
11249 name: "com.android.adservices.key",
11250 public_key: "com.android.adservices.avbpubkey",
11251 private_key: "com.android.adservices.pem",
11252 }
11253
11254 // AOSP source apex
11255 apex {
11256 name: "com.android.adservices",
11257 key: "com.android.adservices.key",
11258 updatable: false,
11259 }
11260
11261 // Prebuilt Google APEX.
11262
11263 prebuilt_apex {
11264 name: "com.google.android.adservices",
11265 apex_name: "com.android.adservices",
11266 src: "com.android.foo-arm.apex",
11267 }
11268
11269 // Another Prebuilt Google APEX
11270 prebuilt_apex {
11271 name: "com.google.android.adservices.v2",
11272 apex_name: "com.android.adservices",
11273 src: "com.android.foo-arm.apex",
11274 }
11275
11276 // APEX contribution modules
11277
11278
11279 apex_contributions {
11280 name: "adservices.prebuilt.contributions",
11281 api_domain: "com.android.adservices",
11282 contents: ["prebuilt_com.google.android.adservices"],
11283 }
11284
11285 apex_contributions {
11286 name: "adservices.prebuilt.v2.contributions",
11287 api_domain: "com.android.adservices",
11288 contents: ["prebuilt_com.google.android.adservices.v2"],
11289 }
11290 `
11291
11292 testCases := []struct {
11293 desc string
11294 selectedApexContributions string
11295 expectedVisibleModuleNames []string
11296 expectedHiddenModuleNames []string
11297 }{
11298 {
11299 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11300 selectedApexContributions: "",
11301 expectedVisibleModuleNames: []string{"com.android.adservices"},
11302 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11303 },
11304 {
11305 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11306 selectedApexContributions: "adservices.prebuilt.contributions",
11307 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11308 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11309 },
11310 {
11311 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11312 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11313 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11314 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11315 },
11316 }
11317
11318 for _, tc := range testCases {
11319 preparer := android.GroupFixturePreparers(
11320 android.FixtureMergeMockFs(map[string][]byte{
11321 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11322 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011323 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011324 )
11325 ctx := testApex(t, bp, preparer)
11326
11327 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11328 }
11329}
11330
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011331func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011332 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011333 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11334 for _, moduleName := range moduleNames {
11335 ret += fmt.Sprintf(`
11336 aconfig_declarations {
11337 name: "%[1]s",
11338 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011339 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011340 srcs: [
11341 "%[1]s.aconfig",
11342 ],
11343 }
11344 java_aconfig_library {
11345 name: "%[1]s-lib",
11346 aconfig_declarations: "%[1]s",
11347 }
11348 `, moduleName)
11349 }
11350 return ret
11351 }
11352
11353 result := android.GroupFixturePreparers(
11354 prepareForApexTest,
11355 java.PrepareForTestWithJavaSdkLibraryFiles,
11356 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011357 ).RunTestWithBp(t, `
11358 java_library {
11359 name: "baz-java-lib",
11360 static_libs: [
11361 "baz-lib",
11362 ],
11363 }
11364 filegroup {
11365 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011366 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011367 ":qux-lib{.generated_srcjars}",
11368 ],
11369 }
11370 filegroup {
11371 name: "qux-another-filegroup",
11372 srcs: [
11373 ":qux-filegroup",
11374 ],
11375 }
11376 java_library {
11377 name: "quux-java-lib",
11378 srcs: [
11379 "a.java",
11380 ],
11381 libs: [
11382 "quux-lib",
11383 ],
11384 }
11385 java_sdk_library {
11386 name: "foo",
11387 srcs: [
11388 ":qux-another-filegroup",
11389 ],
11390 api_packages: ["foo"],
11391 system: {
11392 enabled: true,
11393 },
11394 module_lib: {
11395 enabled: true,
11396 },
11397 test: {
11398 enabled: true,
11399 },
11400 static_libs: [
11401 "bar-lib",
11402 ],
11403 libs: [
11404 "baz-java-lib",
11405 "quux-java-lib",
11406 ],
11407 aconfig_declarations: [
11408 "bar",
11409 ],
11410 }
11411 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11412
11413 m := result.ModuleForTests("foo.stubs.source", "android_common")
11414 outDir := "out/soong/.intermediates"
11415
11416 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11417 // textproto files
11418 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11419
11420 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11421 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11422 // to aconfig.
11423 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11424 "passed as an input",
11425 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11426
11427 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11428 // to metalava as classpath. Thus the cache file provided by the associated
11429 // aconfig_declarations module "baz" should be passed to aconfig.
11430 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11431 "java_aconfig_library passed as an input",
11432 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11433
11434 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11435 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11436 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11437 "input",
11438 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11439
11440 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11441 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11442 // aconfig_declarations module "quux" should not be passed to aconfig.
11443 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11444 "depend on java_aconfig_library not passed as an input",
11445 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11446}
Cole Faust7c991b42024-05-15 11:17:55 -070011447
11448func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011449 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011450 ctx := testApex(t, `
11451 apex {
11452 name: "myapex",
11453 key: "myapex.key",
11454 prebuilts: ["myetc", "myetc2"],
11455 min_sdk_version: "29",
11456 }
11457 apex_key {
11458 name: "myapex.key",
11459 public_key: "testkey.avbpubkey",
11460 private_key: "testkey.pem",
11461 }
11462
11463 prebuilt_etc {
11464 name: "myetc",
11465 src: "myprebuilt",
11466 filename: "myfilename",
11467 }
11468 prebuilt_etc {
11469 name: "myetc2",
11470 sub_dir: "mysubdir",
11471 src: "myprebuilt",
11472 filename: "myfilename",
11473 }
11474 `, withFiles(android.MockFS{
11475 "packages/modules/common/build/allowed_deps.txt": nil,
11476 }))
11477
11478 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11479 data := android.AndroidMkDataForTest(t, ctx, ab)
11480 var builder strings.Builder
11481 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11482 androidMk := builder.String()
11483
11484 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11485 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11486}
Spandan Das50801e22024-05-13 18:29:45 +000011487
11488func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011489 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011490 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11491 args := module.Rule("apexRule").Args
11492 optFlags := args["opt_flags"]
11493 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11494 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11495 }
11496 }
11497
11498 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11499 t.Helper()
11500 found := false
11501 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11502 if dep == wantDep {
11503 found = true
11504 }
11505 })
11506 if !found {
11507 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11508 }
11509 }
11510
11511 ctx := testApex(t, `
11512 apex {
11513 name: "com.android.apex30",
11514 min_sdk_version: "30",
11515 key: "apex30.key",
11516 java_libs: ["javalib"],
11517 }
11518
11519 java_library {
11520 name: "javalib",
11521 srcs: ["A.java"],
11522 apex_available: ["com.android.apex30"],
11523 min_sdk_version: "30",
11524 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011525 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011526 }
11527
11528 override_apex {
11529 name: "com.mycompany.android.apex30",
11530 base: "com.android.apex30",
11531 }
11532
11533 override_apex {
11534 name: "com.mycompany.android.apex31",
11535 base: "com.android.apex30",
11536 min_sdk_version: "31",
11537 }
11538
11539 apex_key {
11540 name: "apex30.key",
11541 public_key: "testkey.avbpubkey",
11542 private_key: "testkey.pem",
11543 }
11544
11545 `, android.FixtureMergeMockFs(android.MockFS{
11546 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11547 }),
11548 )
11549
11550 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11551 checkMinSdkVersion(t, baseModule, "30")
11552
11553 // Override module, but uses same min_sdk_version
11554 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11555 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11556 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11557 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11558
11559 // Override module, uses different min_sdk_version
11560 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11561 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11562 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11563 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11564}
Spandan Das0b28fa02024-05-28 23:40:17 +000011565
11566func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011567 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011568 context := android.GroupFixturePreparers(
11569 android.PrepareForIntegrationTestWithAndroid,
11570 PrepareForTestWithApexBuildComponents,
11571 android.FixtureMergeMockFs(android.MockFS{
11572 "system/sepolicy/apex/foo-file_contexts": nil,
11573 }),
11574 )
11575 res := context.RunTestWithBp(t, `
11576 apex {
11577 name: "foo",
11578 key: "myapex.key",
11579 apex_available_name: "com.android.foo",
11580 variant_version: "0",
11581 updatable: false,
11582 }
11583 apex_key {
11584 name: "myapex.key",
11585 public_key: "testkey.avbpubkey",
11586 private_key: "testkey.pem",
11587 }
11588 prebuilt_apex {
11589 name: "foo",
11590 src: "foo.apex",
11591 prefer: true,
11592 }
11593 override_apex {
11594 name: "myoverrideapex",
11595 base: "foo",
11596 }
11597 `)
11598
11599 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11600}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011601
11602func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011603 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011604 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`, `
11605 apex {
11606 name: "myapex",
11607 key: "myapex.key",
11608 updatable: true,
11609 min_sdk_version: "current",
11610 }
11611
11612 apex_key {
11613 name: "myapex.key",
11614 public_key: "testkey.avbpubkey",
11615 private_key: "testkey.pem",
11616 }
11617 `)
11618}
Spandan Das2f68f192024-07-22 19:25:50 +000011619
11620func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011621 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011622 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11623 result := android.GroupFixturePreparers(
11624 prepareForApexTest,
11625 android.PrepareForTestWithAndroidMk,
11626 android.PrepareForTestWithMakevars,
11627 android.FixtureMergeMockFs(fs),
11628 ).RunTest(t)
11629
11630 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011631 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011632
11633 installRules := result.InstallMakeRulesForTesting(t)
11634
11635 var installedlibRule *android.InstallMakeRule
11636 for i, rule := range installRules {
11637 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11638 if installedlibRule != nil {
11639 t.Errorf("Duplicate install rules for %s", rule.Target)
11640 }
11641 installedlibRule = &installRules[i]
11642 }
11643 }
11644 if installedlibRule == nil {
11645 t.Errorf("No install rule found for installedlib")
11646 return
11647 }
11648
11649 if expectLibfooOnSystemLib {
11650 android.AssertStringListContains(t,
11651 "installedlib doesn't have install dependency on libfoo impl",
11652 installedlibRule.OrderOnlyDeps,
11653 "out/target/product/test_device/system/lib/libfoo.so")
11654 } else {
11655 android.AssertStringListDoesNotContain(t,
11656 "installedlib has install dependency on libfoo stub",
11657 installedlibRule.Deps,
11658 "out/target/product/test_device/system/lib/libfoo.so")
11659 android.AssertStringListDoesNotContain(t,
11660 "installedlib has order-only install dependency on libfoo stub",
11661 installedlibRule.OrderOnlyDeps,
11662 "out/target/product/test_device/system/lib/libfoo.so")
11663 }
11664 }
11665
11666 prebuiltLibfooBp := []byte(`
11667 cc_prebuilt_library {
11668 name: "libfoo",
11669 prefer: true,
11670 srcs: ["libfoo.so"],
11671 stubs: {
11672 versions: ["1"],
11673 },
11674 apex_available: ["apexfoo"],
11675 }
11676 `)
11677
11678 apexfooBp := []byte(`
11679 apex {
11680 name: "apexfoo",
11681 key: "apexfoo.key",
11682 native_shared_libs: ["libfoo"],
11683 updatable: false,
11684 compile_multilib: "both",
11685 }
11686 apex_key {
11687 name: "apexfoo.key",
11688 public_key: "testkey.avbpubkey",
11689 private_key: "testkey.pem",
11690 }
11691 `)
11692
11693 installedlibBp := []byte(`
11694 cc_library {
11695 name: "installedlib",
11696 shared_libs: ["libfoo"],
11697 }
11698 `)
11699
11700 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011701 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011702 testFunc(
11703 t,
11704 /*expectLibfooOnSystemLib=*/ false,
11705 android.MockFS{
11706 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11707 "apexfoo/Android.bp": apexfooBp,
11708 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11709 "Android.bp": installedlibBp,
11710 },
11711 )
11712 })
11713
11714 disabledSourceLibfooBp := []byte(`
11715 cc_library {
11716 name: "libfoo",
11717 enabled: false,
11718 stubs: {
11719 versions: ["1"],
11720 },
11721 apex_available: ["apexfoo"],
11722 }
11723 `)
11724
11725 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011726 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011727 testFunc(
11728 t,
11729 /*expectLibfooOnSystemLib=*/ false,
11730 android.MockFS{
11731 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11732 "impl/Android.bp": disabledSourceLibfooBp,
11733 "apexfoo/Android.bp": apexfooBp,
11734 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11735 "Android.bp": installedlibBp,
11736 },
11737 )
11738 })
11739}
Jihoon Kange246bb72024-09-18 22:26:22 +000011740
11741func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011742 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011743 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11744 // in libs of android_app and java_library does not lead to class loader context device/host
11745 // path mismatch errors.
11746 android.GroupFixturePreparers(
11747 prepareForApexTest,
11748 android.PrepareForIntegrationTestWithAndroid,
11749 PrepareForTestWithApexBuildComponents,
11750 android.FixtureModifyEnv(func(env map[string]string) {
11751 env["DISABLE_CONTAINER_CHECK"] = "true"
11752 }),
11753 withFiles(filesForSdkLibrary),
11754 android.FixtureMergeMockFs(android.MockFS{
11755 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11756 }),
11757 ).RunTestWithBp(t, `
11758 apex {
11759 name: "com.android.foo30",
11760 key: "myapex.key",
11761 updatable: true,
11762 bootclasspath_fragments: [
11763 "foo-bootclasspath-fragment",
11764 ],
11765 java_libs: [
11766 "bar",
11767 ],
11768 apps: [
11769 "bar-app",
11770 ],
11771 min_sdk_version: "30",
11772 }
11773 apex_key {
11774 name: "myapex.key",
11775 public_key: "testkey.avbpubkey",
11776 private_key: "testkey.pem",
11777 }
11778 bootclasspath_fragment {
11779 name: "foo-bootclasspath-fragment",
11780 contents: [
11781 "framework-foo",
11782 ],
11783 apex_available: [
11784 "com.android.foo30",
11785 ],
11786 hidden_api: {
11787 split_packages: ["*"]
11788 },
11789 }
11790
11791 java_sdk_library {
11792 name: "framework-foo",
11793 srcs: [
11794 "A.java"
11795 ],
11796 unsafe_ignore_missing_latest_api: true,
11797 apex_available: [
11798 "com.android.foo30",
11799 ],
11800 compile_dex: true,
11801 sdk_version: "core_current",
11802 shared_library: false,
11803 }
11804
11805 java_library {
11806 name: "bar",
11807 srcs: [
11808 "A.java"
11809 ],
11810 libs: [
11811 "framework-foo.impl",
11812 ],
11813 apex_available: [
11814 "com.android.foo30",
11815 ],
11816 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011817 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011818 }
11819
11820 java_library {
11821 name: "baz",
11822 srcs: [
11823 "A.java"
11824 ],
11825 libs: [
11826 "bar",
11827 ],
11828 sdk_version: "core_current",
11829 }
11830
11831 android_app {
11832 name: "bar-app",
11833 srcs: [
11834 "A.java"
11835 ],
11836 libs: [
11837 "baz",
11838 "framework-foo.impl",
11839 ],
11840 apex_available: [
11841 "com.android.foo30",
11842 ],
11843 sdk_version: "core_current",
11844 min_sdk_version: "30",
11845 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011846 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011847 }
11848 `)
11849}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011850
11851// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11852func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011853 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011854 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11855 apex {
11856 name: "myapex",
11857 key: "myapex.key",
11858 systemserverclasspath_fragments: [
11859 "mysystemserverclasspathfragment",
11860 ],
11861 min_sdk_version: "29",
11862 updatable: true,
11863 system_ext_specific: true,
11864 }
11865
11866 apex_key {
11867 name: "myapex.key",
11868 public_key: "testkey.avbpubkey",
11869 private_key: "testkey.pem",
11870 }
11871
11872 java_library {
11873 name: "foo",
11874 srcs: ["b.java"],
11875 min_sdk_version: "29",
11876 installable: true,
11877 apex_available: [
11878 "myapex",
11879 ],
11880 sdk_version: "current",
11881 }
11882
11883 systemserverclasspath_fragment {
11884 name: "mysystemserverclasspathfragment",
11885 contents: [
11886 "foo",
11887 ],
11888 apex_available: [
11889 "myapex",
11890 ],
11891 }
11892 `,
11893 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11894 )
11895}
Spandan Das72d86c62024-10-15 19:27:41 +000011896
11897// partitions should not package the artifacts that are included inside the apex.
11898func TestFilesystemWithApexDeps(t *testing.T) {
11899 t.Parallel()
11900 result := testApex(t, `
11901 android_filesystem {
11902 name: "myfilesystem",
11903 deps: ["myapex"],
11904 }
11905 apex {
11906 name: "myapex",
11907 key: "myapex.key",
11908 binaries: ["binfoo"],
11909 native_shared_libs: ["libfoo"],
11910 apps: ["appfoo"],
11911 updatable: false,
11912 }
11913 apex_key {
11914 name: "myapex.key",
11915 }
11916 cc_binary {
11917 name: "binfoo",
11918 apex_available: ["myapex"],
11919 }
11920 cc_library {
11921 name: "libfoo",
11922 apex_available: ["myapex"],
11923 }
11924 android_app {
11925 name: "appfoo",
11926 sdk_version: "current",
11927 apex_available: ["myapex"],
11928 }
11929 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11930
11931 partition := result.ModuleForTests("myfilesystem", "android_common")
11932 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11933 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11934}
Colin Crossb614cd42024-10-11 12:52:21 -070011935
11936func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11937 t.Parallel()
11938
11939 extractDepenencyPathFromErrors := func(errs []error) []string {
11940 i := slices.IndexFunc(errs, func(err error) bool {
11941 return strings.Contains(err.Error(), "dependency path:")
11942 })
11943 if i < 0 {
11944 return nil
11945 }
11946 var dependencyPath []string
11947 for _, err := range errs[i+1:] {
11948 s := err.Error()
11949 lastSpace := strings.LastIndexByte(s, ' ')
11950 if lastSpace >= 0 {
11951 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11952 }
11953 }
11954 return dependencyPath
11955 }
11956
11957 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11958 return func(t *testing.T, result *android.TestResult) {
11959 t.Helper()
11960 if len(result.Errs) == 0 {
11961 t.Fatalf("expected errors")
11962 }
11963 t.Log("found errors:")
11964 for _, err := range result.Errs {
11965 t.Log(err)
11966 }
11967 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11968 t.Fatalf("expected error %q, got %q", w, g)
11969 }
11970 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11971 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11972 t.Errorf("expected dependency path %q, got %q", w, g)
11973 }
11974 }
11975 }
11976
11977 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11978 return func(bp *bpmodify.Blueprint) {
11979 m := bp.ModulesByName(module)
11980 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11981 if err != nil {
11982 panic(err)
11983 }
11984 props.AddStringToList(lib)
11985 }
11986 }
11987
11988 bpTemplate := `
11989 apex {
11990 name: "myapex",
11991 key: "myapex.key",
11992 native_shared_libs: ["mylib"],
11993 rust_dyn_libs: ["libmyrust"],
11994 binaries: ["mybin", "myrustbin"],
11995 jni_libs: ["libjni"],
11996 apps: ["myapp"],
11997 updatable: false,
11998 }
11999
12000 apex {
12001 name: "otherapex",
12002 key: "myapex.key",
12003 native_shared_libs: ["libotherapex"],
12004 updatable: false,
12005 }
12006
12007 apex_key {
12008 name: "myapex.key",
12009 public_key: "testkey.avbpubkey",
12010 private_key: "testkey.pem",
12011 }
12012
12013 cc_library {
12014 name: "mylib",
12015 srcs: ["foo.cpp"],
12016 apex_available: ["myapex"],
12017 }
12018
12019 cc_binary {
12020 name: "mybin",
12021 srcs: ["foo.cpp"],
12022 apex_available: ["myapex"],
12023 }
12024
12025 rust_library {
12026 name: "libmyrust",
12027 crate_name: "myrust",
12028 srcs: ["src/lib.rs"],
12029 rustlibs: ["libmyrust_transitive_dylib"],
12030 rlibs: ["libmyrust_transitive_rlib"],
12031 apex_available: ["myapex"],
12032 }
12033
12034 rust_library{
12035 name: "libmyrust_transitive_dylib",
12036 crate_name: "myrust_transitive_dylib",
12037 srcs: ["src/lib.rs"],
12038 apex_available: ["myapex"],
12039 }
12040
12041 rust_library {
12042 name: "libmyrust_transitive_rlib",
12043 crate_name: "myrust_transitive_rlib",
12044 srcs: ["src/lib.rs"],
12045 apex_available: ["myapex"],
12046 }
12047
12048 rust_binary {
12049 name: "myrustbin",
12050 srcs: ["src/main.rs"],
12051 apex_available: ["myapex"],
12052 }
12053
12054 cc_library {
12055 name: "libbar",
12056 sdk_version: "current",
12057 srcs: ["bar.cpp"],
12058 apex_available: ["myapex"],
12059 stl: "none",
12060 }
12061
12062 android_app {
12063 name: "myapp",
12064 jni_libs: ["libembeddedjni"],
12065 use_embedded_native_libs: true,
12066 sdk_version: "current",
12067 apex_available: ["myapex"],
12068 }
12069
12070 cc_library {
12071 name: "libembeddedjni",
12072 sdk_version: "current",
12073 srcs: ["bar.cpp"],
12074 apex_available: ["myapex"],
12075 stl: "none",
12076 }
12077
12078 cc_library {
12079 name: "libjni",
12080 sdk_version: "current",
12081 srcs: ["bar.cpp"],
12082 apex_available: ["myapex"],
12083 stl: "none",
12084 }
12085
12086 cc_library {
12087 name: "libotherapex",
12088 sdk_version: "current",
12089 srcs: ["otherapex.cpp"],
12090 apex_available: ["otherapex"],
12091 stubs: {
12092 symbol_file: "libotherapex.map.txt",
12093 versions: ["1", "2", "3"],
12094 },
12095 stl: "none",
12096 }
12097
12098 cc_library {
12099 name: "libplatform",
12100 sdk_version: "current",
12101 srcs: ["libplatform.cpp"],
12102 stubs: {
12103 symbol_file: "libplatform.map.txt",
12104 versions: ["1", "2", "3"],
12105 },
12106 stl: "none",
12107 system_shared_libs: [],
12108 }
12109 `
12110
12111 testCases := []struct {
12112 name string
12113 bpModifier func(bp *bpmodify.Blueprint)
12114 dependencyPath []string
12115 }{
12116 {
12117 name: "library dependency in other apex",
12118 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12119 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12120 },
12121 {
12122 name: "transitive library dependency in other apex",
12123 bpModifier: func(bp *bpmodify.Blueprint) {
12124 addToSharedLibs("mylib", "libbar")(bp)
12125 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12126 },
12127 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12128 },
12129 {
12130 name: "library dependency in platform",
12131 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12132 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12133 },
12134 {
12135 name: "jni library dependency in other apex",
12136 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12137 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12138 },
12139 {
12140 name: "transitive jni library dependency in other apex",
12141 bpModifier: func(bp *bpmodify.Blueprint) {
12142 addToSharedLibs("libjni", "libbar")(bp)
12143 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12144 },
12145 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12146 },
12147 {
12148 name: "jni library dependency in platform",
12149 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12150 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12151 },
12152 {
12153 name: "transitive jni library dependency in platform",
12154 bpModifier: func(bp *bpmodify.Blueprint) {
12155 addToSharedLibs("libjni", "libbar")(bp)
12156 addToSharedLibs("libbar", "libplatform#impl")(bp)
12157 },
12158 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12159 },
Spandan Das10c41362024-12-03 01:33:09 +000012160 {
12161 name: "app jni library dependency in other apex",
12162 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12163 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12164 },
12165 {
12166 name: "transitive app jni library dependency in other apex",
12167 bpModifier: func(bp *bpmodify.Blueprint) {
12168 addToSharedLibs("libembeddedjni", "libbar")(bp)
12169 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12170 },
12171 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12172 },
12173 {
12174 name: "app jni library dependency in platform",
12175 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12176 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12177 },
12178 {
12179 name: "transitive app jni library dependency in platform",
12180 bpModifier: func(bp *bpmodify.Blueprint) {
12181 addToSharedLibs("libembeddedjni", "libbar")(bp)
12182 addToSharedLibs("libbar", "libplatform#impl")(bp)
12183 },
12184 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12185 },
Colin Crossb614cd42024-10-11 12:52:21 -070012186 {
12187 name: "binary dependency in other apex",
12188 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12189 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12190 },
12191 {
12192 name: "transitive binary dependency in other apex",
12193 bpModifier: func(bp *bpmodify.Blueprint) {
12194 addToSharedLibs("mybin", "libbar")(bp)
12195 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12196 },
12197 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12198 },
12199 {
12200 name: "binary dependency in platform",
12201 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12202 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12203 },
12204 {
12205 name: "transitive binary dependency in platform",
12206 bpModifier: func(bp *bpmodify.Blueprint) {
12207 addToSharedLibs("mybin", "libbar")(bp)
12208 addToSharedLibs("libbar", "libplatform#impl")(bp)
12209 },
12210 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12211 },
12212
12213 {
12214 name: "rust library dependency in other apex",
12215 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12216 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12217 },
12218 {
12219 name: "transitive rust library dependency in other apex",
12220 bpModifier: func(bp *bpmodify.Blueprint) {
12221 addToSharedLibs("libmyrust", "libbar")(bp)
12222 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12223 },
12224 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12225 },
12226 {
12227 name: "rust library dependency in platform",
12228 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12229 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12230 },
12231 {
12232 name: "transitive rust library dependency in platform",
12233 bpModifier: func(bp *bpmodify.Blueprint) {
12234 addToSharedLibs("libmyrust", "libbar")(bp)
12235 addToSharedLibs("libbar", "libplatform#impl")(bp)
12236 },
12237 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12238 },
12239 {
12240 name: "transitive rust library dylib dependency in other apex",
12241 bpModifier: func(bp *bpmodify.Blueprint) {
12242 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12243 },
12244 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12245 },
12246 {
12247 name: "transitive rust library dylib dependency in platform",
12248 bpModifier: func(bp *bpmodify.Blueprint) {
12249 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12250 },
12251 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12252 },
12253 {
12254 name: "transitive rust library rlib dependency in other apex",
12255 bpModifier: func(bp *bpmodify.Blueprint) {
12256 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12257 },
12258 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12259 },
12260 {
12261 name: "transitive rust library rlib dependency in platform",
12262 bpModifier: func(bp *bpmodify.Blueprint) {
12263 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12264 },
12265 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12266 },
12267 {
12268 name: "rust binary dependency in other apex",
12269 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12270 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12271 },
12272 {
12273 name: "transitive rust binary dependency in other apex",
12274 bpModifier: func(bp *bpmodify.Blueprint) {
12275 addToSharedLibs("myrustbin", "libbar")(bp)
12276 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12277 },
12278 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12279 },
12280 {
12281 name: "rust binary dependency in platform",
12282 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12283 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12284 },
12285 {
12286 name: "transitive rust binary dependency in platform",
12287 bpModifier: func(bp *bpmodify.Blueprint) {
12288 addToSharedLibs("myrustbin", "libbar")(bp)
12289 addToSharedLibs("libbar", "libplatform#impl")(bp)
12290 },
12291 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12292 },
12293 }
12294
12295 for _, testCase := range testCases {
12296 t.Run(testCase.name, func(t *testing.T) {
12297 t.Parallel()
12298 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12299 if err != nil {
12300 t.Fatal(err)
12301 }
12302 if testCase.bpModifier != nil {
12303 func() {
12304 defer func() {
12305 if r := recover(); r != nil {
12306 t.Fatalf("panic in bpModifier: %v", r)
12307 }
12308 }()
12309 testCase.bpModifier(bp)
12310 }()
12311 }
12312 android.GroupFixturePreparers(
12313 android.PrepareForTestWithAndroidBuildComponents,
12314 cc.PrepareForTestWithCcBuildComponents,
12315 java.PrepareForTestWithDexpreopt,
12316 rust.PrepareForTestWithRustDefaultModules,
12317 PrepareForTestWithApexBuildComponents,
12318 prepareForTestWithMyapex,
12319 prepareForTestWithOtherapex,
12320 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12321 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12322 }),
12323 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12324 RunTestWithBp(t, bp.String())
12325 })
12326 }
12327}