blob: 81a62d9d9044465dc103dd284641f4298f1fa1eb [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900901 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800914 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000927 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 versions: ["1", "2", "3"],
929 },
930 }
931
932 cc_library {
933 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900934 srcs: ["mylib.cpp"],
935 shared_libs: ["mylib4"],
936 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["10", "11", "12"],
941 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900944
945 cc_library {
946 name: "mylib4",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000950 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900951 }
Jiyong Park105dc322021-06-11 17:22:09 +0900952
Spandan Das357ffcc2024-07-24 18:07:48 +0000953 cc_prebuilt_library_shared {
954 name: "my_prebuilt_platform_lib",
955 stubs: {
956 symbol_file: "my_prebuilt_platform_lib.map.txt",
957 versions: ["1", "2", "3"],
958 },
959 srcs: ["foo.so"],
960 }
961
962 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963 cc_prebuilt_library_shared {
964 name: "my_prebuilt_platform_stub_only_lib",
965 stubs: {
966 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967 versions: ["1", "2", "3"],
968 }
969 }
970
Jiyong Park105dc322021-06-11 17:22:09 +0900971 rust_binary {
972 name: "foo.rust",
973 srcs: ["foo.rs"],
974 shared_libs: ["libfoo.shared_from_rust"],
975 prefer_rlib: true,
976 apex_available: ["myapex"],
977 }
978
979 cc_library_shared {
980 name: "libfoo.shared_from_rust",
981 srcs: ["mylib.cpp"],
982 system_shared_libs: [],
983 stl: "none",
984 stubs: {
985 versions: ["10", "11", "12"],
986 },
987 }
988
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989 `)
990
Jooyung Hana0503a52023-08-23 13:12:50 +0900991 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 copyCmds := apexRule.Args["copy_commands"]
993
994 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996
997 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
Colin Crossaede88c2020-08-11 12:17:01 -07001003 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001006 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001008 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009
Colin Crossea91a172024-11-05 16:14:05 -08001010 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001011 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001013 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001014
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001015 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016 // is replaced by sharing of "cFlags" in cc/builder.go.
1017 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018 // module variable representing "cflags". So it was not detected by ensureNotContains.
1019 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021 // including the original cflags's "-include mylib.h".
1022 //
Jiyong Park64379952018-12-13 18:37:29 +09001023 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001024 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001026
Jiyong Park85cc35a2022-07-17 11:30:47 +09001027 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1028 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029 // Ensure that genstub for apex-provided lib is invoked with --apex
1030 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001031
Jooyung Hana0503a52023-08-23 13:12:50 +09001032 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001033 "lib64/mylib.so",
1034 "lib64/mylib3.so",
1035 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001036 "bin/foo.rust",
1037 "lib64/libc++.so", // by the implicit dependency from foo.rust
1038 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001039 })
Jiyong Park105dc322021-06-11 17:22:09 +09001040
1041 // Ensure that stub dependency from a rust module is not included
1042 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001047
Jooyung Hana0503a52023-08-23 13:12:50 +09001048 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001049 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001050
1051 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1056 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057
1058 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1063 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064}
1065
Jooyung Han20348752023-12-05 15:23:56 +09001066func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001067 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001068 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069 apex {
1070 name: "myapex",
1071 key: "myapex.key",
1072 vendor: true,
1073 updatable: false,
1074 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "libbar",
1085 srcs: ["mylib.cpp"],
1086 llndk: {
1087 symbol_file: "libbar.map.txt",
1088 }
1089 }
1090 `)
1091}
1092
Jiyong Park1bc84122021-06-22 20:23:05 +09001093func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001094 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001095 ctx := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 binaries: ["foo.rust"],
1101 updatable: false,
1102 platform_apis: true,
1103 }
1104
1105 apex_key {
1106 name: "myapex.key",
1107 public_key: "testkey.avbpubkey",
1108 private_key: "testkey.pem",
1109 }
1110
1111 cc_library {
1112 name: "mylib",
1113 srcs: ["mylib.cpp"],
1114 shared_libs: ["mylib2"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 apex_available: [ "myapex" ],
1118 }
1119
1120 cc_library {
1121 name: "mylib2",
1122 srcs: ["mylib.cpp"],
1123 cflags: ["-include mylib.h"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["1", "2", "3"],
1128 },
1129 }
1130
1131 rust_binary {
1132 name: "foo.rust",
1133 srcs: ["foo.rs"],
1134 shared_libs: ["libfoo.shared_from_rust"],
1135 prefer_rlib: true,
1136 apex_available: ["myapex"],
1137 }
1138
1139 cc_library_shared {
1140 name: "libfoo.shared_from_rust",
1141 srcs: ["mylib.cpp"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["10", "11", "12"],
1146 },
1147 }
1148 `)
1149
Jooyung Hana0503a52023-08-23 13:12:50 +09001150 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001151 copyCmds := apexRule.Args["copy_commands"]
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156
1157 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001162 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165}
1166
Colin Cross7812fd32020-09-25 12:35:10 -07001167func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001169 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001170 apex {
1171 name: "myapex",
1172 key: "myapex.key",
1173 native_shared_libs: ["mylib", "mylib3"],
1174 min_sdk_version: "29",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 cc_library {
1184 name: "mylib",
1185 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001186 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001187 system_shared_libs: [],
1188 stl: "none",
1189 apex_available: [ "myapex" ],
1190 min_sdk_version: "28",
1191 }
1192
1193 cc_library {
1194 name: "mylib2",
1195 srcs: ["mylib.cpp"],
1196 cflags: ["-include mylib.h"],
1197 system_shared_libs: [],
1198 stl: "none",
1199 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001200 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001201 versions: ["28", "29", "30", "current"],
1202 },
1203 min_sdk_version: "28",
1204 }
1205
1206 cc_library {
1207 name: "mylib3",
1208 srcs: ["mylib.cpp"],
1209 shared_libs: ["mylib4"],
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001213 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001214 versions: ["28", "29", "30", "current"],
1215 },
1216 apex_available: [ "myapex" ],
1217 min_sdk_version: "28",
1218 }
1219
1220 cc_library {
1221 name: "mylib4",
1222 srcs: ["mylib.cpp"],
1223 system_shared_libs: [],
1224 stl: "none",
1225 apex_available: [ "myapex" ],
1226 min_sdk_version: "28",
1227 }
1228 `)
1229
Jooyung Hana0503a52023-08-23 13:12:50 +09001230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001231 copyCmds := apexRule.Args["copy_commands"]
1232
1233 // Ensure that direct non-stubs dep is always included
1234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235
1236 // Ensure that indirect stubs dep is not included
1237 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238
1239 // Ensure that direct stubs dep is included
1240 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241
1242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243
Jiyong Park55549df2021-02-26 23:57:23 +09001244 // Ensure that mylib is linking with the latest version of stub for mylib2
1245 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001246 // ... and not linking to the non-stub (impl) variant of mylib2
1247 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248
Colin Crossea91a172024-11-05 16:14:05 -08001249 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001250 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251 // .. and not linking to the stubs variant of mylib3
1252 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253
1254 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001255 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001256 ensureNotContains(t, mylib2Cflags, "-include ")
1257
Jiyong Park85cc35a2022-07-17 11:30:47 +09001258 // Ensure that genstub is invoked with --systemapi
1259 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001260
Jooyung Hana0503a52023-08-23 13:12:50 +09001261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001262 "lib64/mylib.so",
1263 "lib64/mylib3.so",
1264 "lib64/mylib4.so",
1265 })
1266}
1267
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001268func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269 t.Parallel()
1270 // myapex (Z)
1271 // mylib -----------------.
1272 // |
1273 // otherapex (29) |
1274 // libstub's versions: 29 Z current
1275 // |
1276 // <platform> |
1277 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001278 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001279 apex {
1280 name: "myapex",
1281 key: "myapex.key",
1282 native_shared_libs: ["mylib"],
1283 min_sdk_version: "Z", // non-final
1284 }
1285
1286 cc_library {
1287 name: "mylib",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libstub"],
1290 apex_available: ["myapex"],
1291 min_sdk_version: "Z",
1292 }
1293
1294 apex_key {
1295 name: "myapex.key",
1296 public_key: "testkey.avbpubkey",
1297 private_key: "testkey.pem",
1298 }
1299
1300 apex {
1301 name: "otherapex",
1302 key: "myapex.key",
1303 native_shared_libs: ["libstub"],
1304 min_sdk_version: "29",
1305 }
1306
1307 cc_library {
1308 name: "libstub",
1309 srcs: ["mylib.cpp"],
1310 stubs: {
1311 versions: ["29", "Z", "current"],
1312 },
1313 apex_available: ["otherapex"],
1314 min_sdk_version: "29",
1315 }
1316
1317 // platform module depending on libstub from otherapex should use the latest stub("current")
1318 cc_library {
1319 name: "libplatform",
1320 srcs: ["mylib.cpp"],
1321 shared_libs: ["libstub"],
1322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001323 `,
1324 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326 variables.Platform_sdk_final = proptools.BoolPtr(false)
1327 variables.Platform_version_active_codenames = []string{"Z"}
1328 }),
1329 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001330
Jiyong Park55549df2021-02-26 23:57:23 +09001331 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001333 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336
1337 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342}
1343
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001346 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001348 name: "myapex2",
1349 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001351 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 }
1353
1354 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001355 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "mylib",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001364 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 system_shared_libs: [],
1366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001367 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 }
1369
1370 cc_library {
1371 name: "libfoo",
1372 srcs: ["mylib.cpp"],
1373 shared_libs: ["libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["10", "20", "30"],
1378 },
1379 }
1380
1381 cc_library {
1382 name: "libbar",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 }
1387
Jiyong Park678c8812020-02-07 17:25:49 +09001388 cc_library_static {
1389 name: "libbaz",
1390 srcs: ["mylib.cpp"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex2" ],
1394 }
1395
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001396 `)
1397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that direct non-stubs dep is always included
1402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403
1404 // Ensure that indirect stubs dep is not included
1405 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406
1407 // Ensure that dependency of stubs is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409
Colin Crossaede88c2020-08-11 12:17:01 -07001410 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411
1412 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001415 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001418
1419 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001421
Colin Crossf61d03d2023-11-02 16:56:39 -07001422 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001424 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001425
Colin Crossf61d03d2023-11-02 16:56:39 -07001426 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001428 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429}
1430
Jooyung Hand3639552019-08-09 12:57:43 +09001431func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001432 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001561 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001562 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001563 cc_library {
1564 name: "libc",
1565 no_libcrt: true,
1566 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001567 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568 stl: "none",
1569 system_shared_libs: [],
1570 stubs: { versions: ["1"] },
1571 apex_available: ["com.android.runtime"],
1572
1573 sanitize: {
1574 hwaddress: true,
1575 }
1576 }
1577
1578 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001579 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 no_libcrt: true,
1581 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001582 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 stl: "none",
1584 system_shared_libs: [],
1585 srcs: [""],
1586 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
1589 sanitize: {
1590 never: true,
1591 },
Spandan Das4de7b492023-05-05 21:13:01 +00001592 apex_available: [
1593 "//apex_available:anyapex",
1594 "//apex_available:platform",
1595 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001596 } `)
1597 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598
Jooyung Hana0503a52023-08-23 13:12:50 +09001599 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 "lib64/bionic/libc.so",
1601 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602 })
1603
Colin Cross4c4c1be2022-02-10 11:41:18 -08001604 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001605
1606 installed := hwasan.Description("install libclang_rt.hwasan")
1607 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608
1609 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612}
1613
1614func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001615 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001616 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001617 prepareForTestOfRuntimeApexWithHwasan,
1618 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619 variables.SanitizeDevice = []string{"hwaddress"}
1620 }),
1621 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622 cc_library {
1623 name: "libc",
1624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 stubs: { versions: ["1"] },
1630 apex_available: ["com.android.runtime"],
1631 }
1632
1633 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001634 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001635 no_libcrt: true,
1636 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001637 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 stl: "none",
1639 system_shared_libs: [],
1640 srcs: [""],
1641 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001642 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
1644 sanitize: {
1645 never: true,
1646 },
Spandan Das4de7b492023-05-05 21:13:01 +00001647 apex_available: [
1648 "//apex_available:anyapex",
1649 "//apex_available:platform",
1650 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001651 }
Paul Duffina02cae32021-03-09 01:44:06 +00001652 `)
1653 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654
Jooyung Hana0503a52023-08-23 13:12:50 +09001655 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 "lib64/bionic/libc.so",
1657 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658 })
1659
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 installed := hwasan.Description("install libclang_rt.hwasan")
1663 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664
1665 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668}
1669
Jooyung Han61b66e92020-03-21 14:21:46 +00001670func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001671 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 testcases := []struct {
1673 name string
1674 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001675 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001676 shouldLink string
1677 shouldNotLink []string
1678 }{
1679 {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001681 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001682 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 shouldLink: "current",
1684 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 },
1686 {
Jiyong Park55549df2021-02-26 23:57:23 +09001687 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001688 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001689 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 shouldLink: "current",
1691 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 },
1693 }
1694 for _, tc := range testcases {
1695 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001696 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001697 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 apex {
1699 name: "myapex",
1700 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001702 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001703 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Jooyung Han61b66e92020-03-21 14:21:46 +00001706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 cc_library {
1713 name: "mylib",
1714 srcs: ["mylib.cpp"],
1715 vendor_available: true,
1716 shared_libs: ["libbar"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722
Jooyung Han61b66e92020-03-21 14:21:46 +00001723 cc_library {
1724 name: "libbar",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001729 llndk: {
1730 symbol_file: "libbar.map.txt",
1731 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001733 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001734 withUnbundledBuild,
1735 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001736
Jooyung Han61b66e92020-03-21 14:21:46 +00001737 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 "lib64/mylib.so",
1740 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001741
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001743 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001746
Steven Moreland2c4000c2021-04-27 02:08:49 +00001747 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001752
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 ver := tc.shouldLink
1755 if tc.shouldLink == "current" {
1756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 }
1758 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 })
1760 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761}
1762
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001770 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "mylib",
1781 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001782 system_shared_libs: ["libc"],
1783 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 }
1787
1788 cc_library_shared {
1789 name: "mylib_shared",
1790 srcs: ["mylib.cpp"],
1791 shared_libs: ["libdl#27"],
1792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001793 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001794 }
1795
1796 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001797 name: "libBootstrap",
1798 srcs: ["mylib.cpp"],
1799 stl: "none",
1800 bootstrap: true,
1801 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 `)
1803
Jooyung Hana0503a52023-08-23 13:12:50 +09001804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 copyCmds := apexRule.Args["copy_commands"]
1806
1807 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001811
1812 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001813 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
Colin Crossaede88c2020-08-11 12:17:01 -07001815 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818
1819 // For dependency to libc
1820 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001821 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001823 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001824 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001825 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827
1828 // For dependency to libm
1829 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001832 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001833 // ... and is not compiling with the stub
1834 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836
1837 // For dependency to libdl
1838 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001839 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... Cflags from stub is correctly exported to mylib
1846 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001848
1849 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001850 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001854}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001855
Jooyung Han749dc692020-04-15 11:03:39 +09001856func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001857 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001858 // there are three links between liba --> libz.
1859 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001860 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001861 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001862 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 apex {
1871 name: "otherapex",
1872 key: "myapex.key",
1873 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882
1883 cc_library {
1884 name: "libx",
1885 shared_libs: ["liba"],
1886 system_shared_libs: [],
1887 stl: "none",
1888 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001889 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 cc_library {
1893 name: "liby",
1894 shared_libs: ["liba"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
1900
1901 cc_library {
1902 name: "liba",
1903 shared_libs: ["libz"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [
1907 "//apex_available:anyapex",
1908 "//apex_available:platform",
1909 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "libz",
1915 system_shared_libs: [],
1916 stl: "none",
1917 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001918 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001919 },
1920 }
Jooyung Han749dc692020-04-15 11:03:39 +09001921 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001922
1923 expectLink := func(from, from_variant, to, to_variant string) {
1924 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926 }
1927 expectNoLink := func(from, from_variant, to, to_variant string) {
1928 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 // platform liba is linked to non-stub version
1932 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001933 // liba in myapex is linked to current
1934 expectLink("liba", "shared_apex29", "libz", "shared_current")
1935 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001936 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001937 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001938 // liba in otherapex is linked to current
1939 expectLink("liba", "shared_apex30", "libz", "shared_current")
1940 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001941 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001943}
1944
Jooyung Hanaed150d2020-04-02 01:41:41 +09001945func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001947 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 native_shared_libs: ["libx"],
1952 min_sdk_version: "R",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 cc_library {
1962 name: "libx",
1963 shared_libs: ["libz"],
1964 system_shared_libs: [],
1965 stl: "none",
1966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001967 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 }
1969
1970 cc_library {
1971 name: "libz",
1972 system_shared_libs: [],
1973 stl: "none",
1974 stubs: {
1975 versions: ["29", "R"],
1976 },
1977 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"R"}
1981 }),
1982 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001983
1984 expectLink := func(from, from_variant, to, to_variant string) {
1985 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987 }
1988 expectNoLink := func(from, from_variant, to, to_variant string) {
1989 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001992 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001994 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001996}
1997
Jooyung Han4c4da062021-06-23 10:23:16 +09001998func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001999 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002000 testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 java_libs: ["libx"],
2005 min_sdk_version: "S",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 java_library {
2015 name: "libx",
2016 srcs: ["a.java"],
2017 apex_available: [ "myapex" ],
2018 sdk_version: "current",
2019 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002020 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002021 }
2022 `,
2023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024 variables.Platform_version_active_codenames = []string{"S"}
2025 variables.Platform_sdk_codename = proptools.StringPtr("S")
2026 }),
2027 )
2028}
2029
Jooyung Han749dc692020-04-15 11:03:39 +09002030func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002031 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002032 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002037 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002038 }
2039
2040 apex_key {
2041 name: "myapex.key",
2042 public_key: "testkey.avbpubkey",
2043 private_key: "testkey.pem",
2044 }
2045
2046 cc_library {
2047 name: "libx",
2048 shared_libs: ["libz"],
2049 system_shared_libs: [],
2050 stl: "none",
2051 apex_available: [ "myapex" ],
2052 }
2053
2054 cc_library {
2055 name: "libz",
2056 system_shared_libs: [],
2057 stl: "none",
2058 stubs: {
2059 versions: ["1", "2"],
2060 },
2061 }
2062 `)
2063
2064 expectLink := func(from, from_variant, to, to_variant string) {
2065 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067 }
2068 expectNoLink := func(from, from_variant, to, to_variant string) {
2069 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002072 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002073 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002076}
2077
Jooyung Handfc864c2023-03-20 18:19:07 +09002078func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002079 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 ctx := testApex(t, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002085 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002086 vendor: true,
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 cc_library {
2097 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002098 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002099 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002101 shared_libs: ["libbar"],
2102 }
2103
2104 cc_library {
2105 name: "libbar",
2106 stubs: { versions: ["29", "30"] },
2107 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002108 }
2109 `)
2110
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002111 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002114
2115 // Ensure that mylib links with "current" LLNDK
2116 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002117 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002118
2119 // Ensure that mylib is targeting 29
2120 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122
2123 // Ensure that the correct variant of crtbegin_so is used.
2124 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002126
2127 // Ensure that the crtbegin_so used by the APEX is targeting 29
2128 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130}
2131
Jooyung Han4495f842023-04-25 16:39:59 +09002132func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002133 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002134 ctx := testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 updatable: true,
2139 native_shared_libs: [
2140 "mylib",
2141 "yourlib",
2142 ],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex {
2147 name: "myapex2",
2148 key: "myapex.key",
2149 updatable: false,
2150 native_shared_libs: ["yourlib"],
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["libbar"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex"],
2165 }
2166
2167 cc_library {
2168 name: "libbar",
2169 stubs: { versions: ["29", "30"] },
2170 }
2171
2172 cc_library {
2173 name: "yourlib",
2174 srcs: ["mylib.cpp"],
2175 min_sdk_version: "29",
2176 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }))
2181
2182 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2184 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002185 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002186 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002188
Jooyung Hana0503a52023-08-23 13:12:50 +09002189 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002190 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002192 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195 flatlist, "mylib:(minSdkVersion:29)")
2196 android.AssertStringListContains(t, "track platform-available lib",
2197 flatlist, "yourlib(minSdkVersion:29)")
2198}
2199
Nouby Mohamed8609a552024-09-04 22:19:51 +00002200func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002201 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002202 ctx := testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 updatable: true,
2207 native_shared_libs: [
2208 "mylib",
2209 "yourlib",
2210 ],
2211 min_sdk_version: "29",
2212 }
2213
2214 apex {
2215 name: "myapex2",
2216 key: "myapex.key",
2217 updatable: false,
2218 native_shared_libs: ["yourlib"],
2219 }
2220
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226
2227 cc_library {
2228 name: "mylib",
2229 srcs: ["mylib.cpp"],
2230 shared_libs: ["libbar"],
2231 min_sdk_version: "29",
2232 apex_available: ["myapex"],
2233 }
2234
2235 cc_library {
2236 name: "libbar",
2237 stubs: { versions: ["29", "30"] },
2238 }
2239
2240 cc_library {
2241 name: "yourlib",
2242 srcs: ["mylib.cpp"],
2243 min_sdk_version: "29",
2244 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2245 }
2246 `, withFiles(android.MockFS{
2247 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2248 }),
2249 android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2252 },
2253 ))
2254
2255 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2256 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2257 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2258 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2259 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2260 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2261
2262 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2263 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2264 myapex.Output("depsinfo/flatlist.txt")), "\n")
2265 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2266 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2267 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2268 flatlist, "mylib:(minSdkVersion:29)")
2269 android.AssertStringListContains(t, "track platform-available lib",
2270 flatlist, "yourlib(minSdkVersion:29)")
2271}
2272
2273func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002274 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002275 ctx := testApex(t, `
2276 apex {
2277 name: "myapex",
2278 key: "myapex.key",
2279 updatable: true,
2280 native_shared_libs: [
2281 "mylib",
2282 "yourlib",
2283 ],
2284 min_sdk_version: "29",
2285 }
2286
2287 apex {
2288 name: "myapex2",
2289 key: "myapex.key",
2290 updatable: false,
2291 native_shared_libs: ["yourlib"],
2292 }
2293
2294 apex_key {
2295 name: "myapex.key",
2296 public_key: "testkey.avbpubkey",
2297 private_key: "testkey.pem",
2298 }
2299
2300 cc_library {
2301 name: "mylib",
2302 srcs: ["mylib.cpp"],
2303 shared_libs: ["libbar"],
2304 min_sdk_version: "29",
2305 apex_available: ["myapex"],
2306 }
2307
2308 cc_library {
2309 name: "libbar",
2310 stubs: { versions: ["29", "30"] },
2311 }
2312
2313 cc_library {
2314 name: "yourlib",
2315 srcs: ["mylib.cpp"],
2316 min_sdk_version: "29",
2317 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2318 }
2319 `, withFiles(android.MockFS{
2320 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2321 "packages/modules/common/build/allowed_deps.txt": nil,
2322 }),
2323 android.FixtureModifyProductVariables(
2324 func(variables android.FixtureProductVariables) {
2325 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2326 },
2327 ))
2328
2329 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2330 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2331 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2332 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2333 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2334 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2335
2336 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2337 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2338 myapex.Output("depsinfo/flatlist.txt")), "\n")
2339 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2340 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2341 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2342 flatlist, "mylib:(minSdkVersion:29)")
2343 android.AssertStringListContains(t, "track platform-available lib",
2344 flatlist, "yourlib(minSdkVersion:29)")
2345}
2346
Jooyung Han4495f842023-04-25 16:39:59 +09002347func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002348 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002349 ctx := testApex(t, `
2350 apex {
2351 name: "myapex",
2352 key: "myapex.key",
2353 updatable: true,
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
2362 `)
2363 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2364 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2365 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2366 }
2367}
2368
Jooyung Han03b51852020-02-26 22:45:42 +09002369func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002371 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002372 apex {
2373 name: "myapex",
2374 key: "myapex.key",
2375 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002376 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002377 }
2378
2379 apex_key {
2380 name: "myapex.key",
2381 public_key: "testkey.avbpubkey",
2382 private_key: "testkey.pem",
2383 }
2384
2385 cc_library {
2386 name: "libx",
2387 system_shared_libs: [],
2388 stl: "none",
2389 apex_available: [ "myapex" ],
2390 stubs: {
2391 versions: ["1", "2"],
2392 },
2393 }
2394
2395 cc_library {
2396 name: "libz",
2397 shared_libs: ["libx"],
2398 system_shared_libs: [],
2399 stl: "none",
2400 }
2401 `)
2402
2403 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002404 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002405 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2406 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2407 }
2408 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002409 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002410 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2411 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2412 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002413 expectLink("libz", "shared", "libx", "shared_current")
2414 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002415 expectNoLink("libz", "shared", "libz", "shared_1")
2416 expectNoLink("libz", "shared", "libz", "shared")
2417}
2418
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002419var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2420 func(variables android.FixtureProductVariables) {
2421 variables.SanitizeDevice = []string{"hwaddress"}
2422 },
2423)
2424
Jooyung Han75568392020-03-20 04:29:24 +09002425func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002426 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002427 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002428 apex {
2429 name: "myapex",
2430 key: "myapex.key",
2431 native_shared_libs: ["libx"],
2432 min_sdk_version: "29",
2433 }
2434
2435 apex_key {
2436 name: "myapex.key",
2437 public_key: "testkey.avbpubkey",
2438 private_key: "testkey.pem",
2439 }
2440
2441 cc_library {
2442 name: "libx",
2443 shared_libs: ["libbar"],
2444 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002445 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002446 }
2447
2448 cc_library {
2449 name: "libbar",
2450 stubs: {
2451 versions: ["29", "30"],
2452 },
2453 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002454 `,
2455 prepareForTestWithSantitizeHwaddress,
2456 )
Jooyung Han03b51852020-02-26 22:45:42 +09002457 expectLink := func(from, from_variant, to, to_variant string) {
2458 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2459 libFlags := ld.Args["libFlags"]
2460 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2461 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002462 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002463}
2464
Jooyung Han75568392020-03-20 04:29:24 +09002465func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002466 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002467 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 native_shared_libs: ["libx"],
2472 min_sdk_version: "29",
2473 }
2474
2475 apex_key {
2476 name: "myapex.key",
2477 public_key: "testkey.avbpubkey",
2478 private_key: "testkey.pem",
2479 }
2480
2481 cc_library {
2482 name: "libx",
2483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002485 }
Jooyung Han75568392020-03-20 04:29:24 +09002486 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002487
2488 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002489 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002490 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002491 // note that platform variant is not.
2492 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002493 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002494}
2495
Jooyung Han749dc692020-04-15 11:03:39 +09002496func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002497 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002498 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002499 apex {
2500 name: "myapex",
2501 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002502 native_shared_libs: ["mylib"],
2503 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002504 }
2505
2506 apex_key {
2507 name: "myapex.key",
2508 public_key: "testkey.avbpubkey",
2509 private_key: "testkey.pem",
2510 }
Jooyung Han749dc692020-04-15 11:03:39 +09002511
2512 cc_library {
2513 name: "mylib",
2514 srcs: ["mylib.cpp"],
2515 system_shared_libs: [],
2516 stl: "none",
2517 apex_available: [
2518 "myapex",
2519 ],
2520 min_sdk_version: "30",
2521 }
2522 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002523
2524 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["libfoo.ffi"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
2538 rust_ffi_shared {
2539 name: "libfoo.ffi",
2540 srcs: ["foo.rs"],
2541 crate_name: "foo",
2542 apex_available: [
2543 "myapex",
2544 ],
2545 min_sdk_version: "30",
2546 }
2547 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002548
2549 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 java_libs: ["libfoo"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 java_import {
2564 name: "libfoo",
2565 jars: ["libfoo.jar"],
2566 apex_available: [
2567 "myapex",
2568 ],
2569 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002570 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002571 }
2572 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002573
2574 // Skip check for modules compiling against core API surface
2575 testApex(t, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 java_libs: ["libfoo"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 java_library {
2590 name: "libfoo",
2591 srcs: ["Foo.java"],
2592 apex_available: [
2593 "myapex",
2594 ],
2595 // Compile against core API surface
2596 sdk_version: "core_current",
2597 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002598 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002599 }
2600 `)
2601
Jooyung Han749dc692020-04-15 11:03:39 +09002602}
2603
2604func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002605 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002606 testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 native_shared_libs: ["libfoo"],
2611 java_libs: ["libbar"],
2612 min_sdk_version: "29",
2613 }
2614
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
2619 }
2620
2621 cc_library {
2622 name: "libfoo",
2623 srcs: ["mylib.cpp"],
2624 shared_libs: ["libfoo_dep"],
2625 apex_available: ["myapex"],
2626 min_sdk_version: "29",
2627 }
2628
2629 cc_library {
2630 name: "libfoo_dep",
2631 srcs: ["mylib.cpp"],
2632 apex_available: ["myapex"],
2633 min_sdk_version: "29",
2634 }
2635
2636 java_library {
2637 name: "libbar",
2638 sdk_version: "current",
2639 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002640 static_libs: [
2641 "libbar_dep",
2642 "libbar_import_dep",
2643 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002644 apex_available: ["myapex"],
2645 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002646 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002647 }
2648
2649 java_library {
2650 name: "libbar_dep",
2651 sdk_version: "current",
2652 srcs: ["a.java"],
2653 apex_available: ["myapex"],
2654 min_sdk_version: "29",
2655 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002656
2657 java_import {
2658 name: "libbar_import_dep",
2659 jars: ["libbar.jar"],
2660 apex_available: ["myapex"],
2661 min_sdk_version: "29",
2662 }
Jooyung Han03b51852020-02-26 22:45:42 +09002663 `)
2664}
2665
Colin Cross8ca61c12022-10-06 21:00:14 -07002666func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002667 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002668 // Tests that an apex dependency with min_sdk_version higher than the
2669 // min_sdk_version of the apex is allowed as long as the dependency's
2670 // min_sdk_version is less than or equal to the api level that the
2671 // architecture was introduced in. In this case, arm64 didn't exist
2672 // until api level 21, so the arm64 code will never need to run on
2673 // an api level 20 device, even if other architectures of the apex
2674 // will.
2675 testApex(t, `
2676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 native_shared_libs: ["libfoo"],
2680 min_sdk_version: "20",
2681 }
2682
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688
2689 cc_library {
2690 name: "libfoo",
2691 srcs: ["mylib.cpp"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "21",
2694 stl: "none",
2695 }
2696 `)
2697}
2698
Artur Satayev8cf899a2020-04-15 17:29:42 +01002699func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002700 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002701 testCases := []struct {
2702 name string
2703 expectedError string
2704 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002705 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002706 }{
2707 {
2708 name: "Non-updatable apex with non-stable dep",
2709 bp: `
2710 apex {
2711 name: "myapex",
2712 java_libs: ["myjar"],
2713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 java_library {
2722 name: "myjar",
2723 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002724 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002725 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002726 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002727 }
2728 `,
2729 },
2730 {
2731 name: "Updatable apex with stable dep",
2732 bp: `
2733 apex {
2734 name: "myapex",
2735 java_libs: ["myjar"],
2736 key: "myapex.key",
2737 updatable: true,
2738 min_sdk_version: "29",
2739 }
2740 apex_key {
2741 name: "myapex.key",
2742 public_key: "testkey.avbpubkey",
2743 private_key: "testkey.pem",
2744 }
2745 java_library {
2746 name: "myjar",
2747 srcs: ["foo/bar/MyClass.java"],
2748 sdk_version: "current",
2749 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002750 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002751 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002752 }
2753 `,
2754 },
2755 {
2756 name: "Updatable apex with non-stable dep",
2757 expectedError: "cannot depend on \"myjar\"",
2758 bp: `
2759 apex {
2760 name: "myapex",
2761 java_libs: ["myjar"],
2762 key: "myapex.key",
2763 updatable: true,
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 java_library {
2771 name: "myjar",
2772 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002773 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002774 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002775 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002776 }
2777 `,
2778 },
2779 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002780 name: "Updatable apex with non-stable legacy core platform dep",
2781 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2782 bp: `
2783 apex {
2784 name: "myapex",
2785 java_libs: ["myjar-uses-legacy"],
2786 key: "myapex.key",
2787 updatable: true,
2788 }
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794 java_library {
2795 name: "myjar-uses-legacy",
2796 srcs: ["foo/bar/MyClass.java"],
2797 sdk_version: "core_platform",
2798 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002799 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 }
2801 `,
2802 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2803 },
2804 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002805 name: "Updatable apex with non-stable transitive dep",
2806 // This is not actually detecting that the transitive dependency is unstable, rather it is
2807 // detecting that the transitive dependency is building against a wider API surface than the
2808 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002809 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002810 bp: `
2811 apex {
2812 name: "myapex",
2813 java_libs: ["myjar"],
2814 key: "myapex.key",
2815 updatable: true,
2816 }
2817 apex_key {
2818 name: "myapex.key",
2819 public_key: "testkey.avbpubkey",
2820 private_key: "testkey.pem",
2821 }
2822 java_library {
2823 name: "myjar",
2824 srcs: ["foo/bar/MyClass.java"],
2825 sdk_version: "current",
2826 apex_available: ["myapex"],
2827 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002828 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002829 }
2830 java_library {
2831 name: "transitive-jar",
2832 srcs: ["foo/bar/MyClass.java"],
2833 sdk_version: "core_platform",
2834 apex_available: ["myapex"],
2835 }
2836 `,
2837 },
2838 }
2839
2840 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002841 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2842 continue
2843 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002844 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002845 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002846 errorHandler := android.FixtureExpectsNoErrors
2847 if test.expectedError != "" {
2848 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 android.GroupFixturePreparers(
2851 java.PrepareForTestWithJavaDefaultModules,
2852 PrepareForTestWithApexBuildComponents,
2853 prepareForTestWithMyapex,
2854 android.OptionalFixturePreparer(test.preparer),
2855 ).
2856 ExtendWithErrorHandler(errorHandler).
2857 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 })
2859 }
2860}
2861
Jooyung Han749dc692020-04-15 11:03:39 +09002862func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2863 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 native_shared_libs: ["mylib"],
2868 min_sdk_version: "29",
2869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 cc_library {
2878 name: "mylib",
2879 srcs: ["mylib.cpp"],
2880 shared_libs: ["mylib2"],
2881 system_shared_libs: [],
2882 stl: "none",
2883 apex_available: [
2884 "myapex",
2885 ],
2886 min_sdk_version: "29",
2887 }
2888
2889 // indirect part of the apex
2890 cc_library {
2891 name: "mylib2",
2892 srcs: ["mylib.cpp"],
2893 system_shared_libs: [],
2894 stl: "none",
2895 apex_available: [
2896 "myapex",
2897 ],
2898 min_sdk_version: "30",
2899 }
2900 `)
2901}
2902
2903func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002904 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002905 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 apps: ["AppFoo"],
2910 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002911 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 android_app {
2921 name: "AppFoo",
2922 srcs: ["foo/bar/MyClass.java"],
2923 sdk_version: "current",
2924 min_sdk_version: "29",
2925 system_modules: "none",
2926 stl: "none",
2927 static_libs: ["bar"],
2928 apex_available: [ "myapex" ],
2929 }
2930
2931 java_library {
2932 name: "bar",
2933 sdk_version: "current",
2934 srcs: ["a.java"],
2935 apex_available: [ "myapex" ],
2936 }
2937 `)
2938}
2939
2940func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 native_shared_libs: ["mylib"],
2947 min_sdk_version: "29",
2948 }
2949
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955
Colin Crossea91a172024-11-05 16:14:05 -08002956 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002957 cc_library {
2958 name: "mylib",
2959 srcs: ["mylib.cpp"],
2960 shared_libs: ["mylib2"],
2961 system_shared_libs: [],
2962 stl: "none",
2963 apex_available: ["myapex", "otherapex"],
2964 min_sdk_version: "29",
2965 }
2966
2967 cc_library {
2968 name: "mylib2",
2969 srcs: ["mylib.cpp"],
2970 system_shared_libs: [],
2971 stl: "none",
2972 apex_available: ["otherapex"],
2973 stubs: { versions: ["29", "30"] },
2974 min_sdk_version: "30",
2975 }
2976
2977 apex {
2978 name: "otherapex",
2979 key: "myapex.key",
2980 native_shared_libs: ["mylib", "mylib2"],
2981 min_sdk_version: "30",
2982 }
2983 `)
2984 expectLink := func(from, from_variant, to, to_variant string) {
2985 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2986 libFlags := ld.Args["libFlags"]
2987 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2988 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002989 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002990 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002991}
2992
Jooyung Haned124c32021-01-26 11:43:46 +09002993func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002994 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002995 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2996 func(variables android.FixtureProductVariables) {
2997 variables.Platform_sdk_codename = proptools.StringPtr("S")
2998 variables.Platform_version_active_codenames = []string{"S"}
2999 },
3000 )
Jooyung Haned124c32021-01-26 11:43:46 +09003001 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3002 apex {
3003 name: "myapex",
3004 key: "myapex.key",
3005 native_shared_libs: ["libfoo"],
3006 min_sdk_version: "S",
3007 }
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013 cc_library {
3014 name: "libfoo",
3015 shared_libs: ["libbar"],
3016 apex_available: ["myapex"],
3017 min_sdk_version: "29",
3018 }
3019 cc_library {
3020 name: "libbar",
3021 apex_available: ["myapex"],
3022 }
3023 `, withSAsActiveCodeNames)
3024}
3025
3026func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003027 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003028 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3029 variables.Platform_sdk_codename = proptools.StringPtr("S")
3030 variables.Platform_version_active_codenames = []string{"S", "T"}
3031 })
Colin Cross1c460562021-02-16 17:55:47 -08003032 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 native_shared_libs: ["libfoo"],
3037 min_sdk_version: "S",
3038 }
3039 apex_key {
3040 name: "myapex.key",
3041 public_key: "testkey.avbpubkey",
3042 private_key: "testkey.pem",
3043 }
3044 cc_library {
3045 name: "libfoo",
3046 shared_libs: ["libbar"],
3047 apex_available: ["myapex"],
3048 min_sdk_version: "S",
3049 }
3050 cc_library {
3051 name: "libbar",
3052 stubs: {
3053 symbol_file: "libbar.map.txt",
3054 versions: ["30", "S", "T"],
3055 },
3056 }
3057 `, withSAsActiveCodeNames)
3058
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003059 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003060 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3061 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003062 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003063}
3064
Jiyong Park7c2ee712018-12-07 00:42:25 +09003065func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003066 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003067 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003068 apex {
3069 name: "myapex",
3070 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003071 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003072 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003073 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003074 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003075 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003076 }
3077
3078 apex_key {
3079 name: "myapex.key",
3080 public_key: "testkey.avbpubkey",
3081 private_key: "testkey.pem",
3082 }
3083
3084 prebuilt_etc {
3085 name: "myetc",
3086 src: "myprebuilt",
3087 sub_dir: "foo/bar",
3088 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003089
3090 cc_library {
3091 name: "mylib",
3092 srcs: ["mylib.cpp"],
3093 relative_install_path: "foo/bar",
3094 system_shared_libs: [],
3095 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003096 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003097 }
3098
3099 cc_binary {
3100 name: "mybin",
3101 srcs: ["mylib.cpp"],
3102 relative_install_path: "foo/bar",
3103 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003105 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003106 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003107
3108 rust_binary {
3109 name: "mybin.rust",
3110 srcs: ["foo.rs"],
3111 relative_install_path: "rust_subdir",
3112 apex_available: [ "myapex" ],
3113 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003114 `)
3115
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003117 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003118
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003119 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003120 ensureContains(t, cmd, "/etc ")
3121 ensureContains(t, cmd, "/etc/foo ")
3122 ensureContains(t, cmd, "/etc/foo/bar ")
3123 ensureContains(t, cmd, "/lib64 ")
3124 ensureContains(t, cmd, "/lib64/foo ")
3125 ensureContains(t, cmd, "/lib64/foo/bar ")
3126 ensureContains(t, cmd, "/lib ")
3127 ensureContains(t, cmd, "/lib/foo ")
3128 ensureContains(t, cmd, "/lib/foo/bar ")
3129 ensureContains(t, cmd, "/bin ")
3130 ensureContains(t, cmd, "/bin/foo ")
3131 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003132 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003133}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003134
Jooyung Han35155c42020-02-06 17:33:20 +09003135func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 multilib: {
3142 both: {
3143 native_shared_libs: ["mylib"],
3144 binaries: ["mybin"],
3145 },
3146 },
3147 compile_multilib: "both",
3148 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 cc_library {
3159 name: "mylib",
3160 relative_install_path: "foo/bar",
3161 system_shared_libs: [],
3162 stl: "none",
3163 apex_available: [ "myapex" ],
3164 native_bridge_supported: true,
3165 }
3166
3167 cc_binary {
3168 name: "mybin",
3169 relative_install_path: "foo/bar",
3170 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003171 stl: "none",
3172 apex_available: [ "myapex" ],
3173 native_bridge_supported: true,
3174 compile_multilib: "both", // default is "first" for binary
3175 multilib: {
3176 lib64: {
3177 suffix: "64",
3178 },
3179 },
3180 }
Spandan Das45e40012024-12-02 22:45:48 +00003181 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003182 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003183 "bin/foo/bar/mybin",
3184 "bin/foo/bar/mybin64",
3185 "bin/arm/foo/bar/mybin",
3186 "bin/arm64/foo/bar/mybin64",
3187 "lib/foo/bar/mylib.so",
3188 "lib/arm/foo/bar/mylib.so",
3189 "lib64/foo/bar/mylib.so",
3190 "lib64/arm64/foo/bar/mylib.so",
3191 })
3192}
3193
Jooyung Han85d61762020-06-24 23:50:26 +09003194func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003195 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003196 result := android.GroupFixturePreparers(
3197 prepareForApexTest,
3198 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3199 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003200 apex {
3201 name: "myapex",
3202 key: "myapex.key",
3203 binaries: ["mybin"],
3204 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212 cc_binary {
3213 name: "mybin",
3214 vendor: true,
3215 shared_libs: ["libfoo"],
3216 }
3217 cc_library {
3218 name: "libfoo",
3219 proprietary: true,
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003224 "bin/mybin",
3225 "lib64/libfoo.so",
3226 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3227 "lib64/libc++.so",
3228 })
3229
Jooyung Hana0503a52023-08-23 13:12:50 +09003230 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003231 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003232 name := apexBundle.BaseModuleName()
3233 prefix := "TARGET_"
3234 var builder strings.Builder
3235 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003236 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003237 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003238 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003239
Jooyung Hana0503a52023-08-23 13:12:50 +09003240 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003241 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3242 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003243}
3244
Justin Yun13decfb2021-03-08 19:25:55 +09003245func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003246 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003247 ctx := testApex(t, `
3248 apex {
3249 name: "myapex",
3250 key: "myapex.key",
3251 updatable: false,
3252 product_specific: true,
3253 binaries: ["foo"],
3254 }
3255
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }
3261
3262 cc_binary {
3263 name: "foo",
3264 product_available: true,
3265 apex_available: ["myapex"],
3266 srcs: ["foo.cpp"],
3267 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003268 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003269
3270 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003271 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003272 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3273 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3274 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3275 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3276}
3277
Jooyung Han8e5685d2020-09-21 11:02:57 +09003278func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003279 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003280 testCases := []struct {
3281 name string
3282 additionalProp string
3283 }{
3284 {"system apex with prebuilt_firmware", ""},
3285 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3286 }
3287 for _, tc := range testCases {
3288 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003289 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003290 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003291 apex {
3292 name: "myapex",
3293 key: "myapex.key",
3294 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003296 `+tc.additionalProp+`
3297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 prebuilt_firmware {
3304 name: "myfirmware",
3305 src: "myfirmware.bin",
3306 filename_from_src: true,
3307 `+tc.additionalProp+`
3308 }
3309 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 "etc/firmware/myfirmware.bin",
3312 })
3313 })
3314 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003315}
3316
Jooyung Hanefb184e2020-06-25 17:14:25 +09003317func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003318 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003320 apex {
3321 name: "myapex",
3322 key: "myapex.key",
3323 vendor: true,
3324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003325 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003326 }
3327
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333
3334 cc_library {
3335 name: "mylib",
3336 vendor_available: true,
3337 }
3338 `)
3339
Jooyung Hana0503a52023-08-23 13:12:50 +09003340 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003341 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003342 name := apexBundle.BaseModuleName()
3343 prefix := "TARGET_"
3344 var builder strings.Builder
3345 data.Custom(&builder, name, prefix, "", data)
3346 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003347 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003348}
3349
Jooyung Han2ed99d02020-06-24 23:26:26 +09003350func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003351 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003352 apex {
3353 name: "myapex",
3354 key: "myapex.key",
3355 vintf_fragments: ["fragment.xml"],
3356 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003357 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003358 }
3359 apex_key {
3360 name: "myapex.key",
3361 public_key: "testkey.avbpubkey",
3362 private_key: "testkey.pem",
3363 }
3364 cc_binary {
3365 name: "mybin",
3366 }
3367 `)
3368
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003370 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003371 name := apexBundle.BaseModuleName()
3372 prefix := "TARGET_"
3373 var builder strings.Builder
3374 data.Custom(&builder, name, prefix, "", data)
3375 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003376 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003377 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378}
3379
Jiyong Park16e91a02018-12-20 18:18:08 +09003380func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003381 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003382 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003383 apex {
3384 name: "myapex",
3385 key: "myapex.key",
3386 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 srcs: ["mylib.cpp"],
3399 system_shared_libs: [],
3400 stl: "none",
3401 stubs: {
3402 versions: ["1", "2", "3"],
3403 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003404 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003405 }
3406
3407 cc_binary {
3408 name: "not_in_apex",
3409 srcs: ["mylib.cpp"],
3410 static_libs: ["mylib"],
3411 static_executable: true,
3412 system_shared_libs: [],
3413 stl: "none",
3414 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003415 `)
3416
Colin Cross7113d202019-11-20 16:39:12 -08003417 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003418
3419 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003420 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003421}
Jiyong Park9335a262018-12-24 11:31:58 +09003422
3423func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003424 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003425 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003426 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003427 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003428 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003429 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003430 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003431 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003433 }
3434
3435 cc_library {
3436 name: "mylib",
3437 srcs: ["mylib.cpp"],
3438 system_shared_libs: [],
3439 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003440 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 android_app_certificate {
3450 name: "myapex.certificate",
3451 certificate: "testkey",
3452 }
3453
3454 android_app_certificate {
3455 name: "myapex.certificate.override",
3456 certificate: "testkey.override",
3457 }
3458
Jiyong Park9335a262018-12-24 11:31:58 +09003459 `)
3460
3461 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003462 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003463
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003464 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3465 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003466 "vendor/foo/devkeys/testkey.avbpubkey")
3467 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003468 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3469 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003470 "vendor/foo/devkeys/testkey.pem")
3471 }
3472
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003473 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003474 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003475 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003476 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003477 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003478 }
3479}
Jiyong Park58e364a2019-01-19 19:24:06 +09003480
Jooyung Hanf121a652019-12-17 14:30:11 +09003481func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003485 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003490 }
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003496 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003497 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3498 if actual := rule.Args["certificates"]; actual != expected {
3499 t.Errorf("certificates should be %q, not %q", expected, actual)
3500 }
3501 })
3502 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003503 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003504 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003505 apex {
3506 name: "myapex_keytest",
3507 key: "myapex.key",
3508 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516 android_app_certificate {
3517 name: "myapex.certificate.override",
3518 certificate: "testkey.override",
3519 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003520 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003521 expected := "testkey.override.x509.pem testkey.override.pk8"
3522 if actual := rule.Args["certificates"]; actual != expected {
3523 t.Errorf("certificates should be %q, not %q", expected, actual)
3524 }
3525 })
3526 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003534 }
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540 android_app_certificate {
3541 name: "myapex.certificate",
3542 certificate: "testkey",
3543 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003544 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003545 expected := "testkey.x509.pem testkey.pk8"
3546 if actual := rule.Args["certificates"]; actual != expected {
3547 t.Errorf("certificates should be %q, not %q", expected, actual)
3548 }
3549 })
3550 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003551 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003552 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003553 apex {
3554 name: "myapex_keytest",
3555 key: "myapex.key",
3556 file_contexts: ":myapex-file_contexts",
3557 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003558 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003559 }
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565 android_app_certificate {
3566 name: "myapex.certificate.override",
3567 certificate: "testkey.override",
3568 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003569 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003570 expected := "testkey.override.x509.pem testkey.override.pk8"
3571 if actual := rule.Args["certificates"]; actual != expected {
3572 t.Errorf("certificates should be %q, not %q", expected, actual)
3573 }
3574 })
3575 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003576 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003577 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003578 apex {
3579 name: "myapex",
3580 key: "myapex.key",
3581 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003582 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003583 }
3584 apex_key {
3585 name: "myapex.key",
3586 public_key: "testkey.avbpubkey",
3587 private_key: "testkey.pem",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex_keytest",
3600 key: "myapex.key",
3601 file_contexts: ":myapex-file_contexts",
3602 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003603 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003604 }
3605 apex_key {
3606 name: "myapex.key",
3607 public_key: "testkey.avbpubkey",
3608 private_key: "testkey.pem",
3609 }
3610 android_app_certificate {
3611 name: "myapex.certificate.override",
3612 certificate: "testkey.override",
3613 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003614 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003615 expected := "testkey.override.x509.pem testkey.override.pk8"
3616 if actual := rule.Args["certificates"]; actual != expected {
3617 t.Errorf("certificates should be %q, not %q", expected, actual)
3618 }
3619 })
3620}
3621
Jiyong Park58e364a2019-01-19 19:24:06 +09003622func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003623 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003624 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003625 apex {
3626 name: "myapex",
3627 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003628 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003629 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003630 }
3631
3632 apex {
3633 name: "otherapex",
3634 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003635 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003636 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003637 }
3638
3639 apex_key {
3640 name: "myapex.key",
3641 public_key: "testkey.avbpubkey",
3642 private_key: "testkey.pem",
3643 }
3644
3645 cc_library {
3646 name: "mylib",
3647 srcs: ["mylib.cpp"],
3648 system_shared_libs: [],
3649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003650 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003651 "myapex",
3652 "otherapex",
3653 ],
Jooyung Han24282772020-03-21 23:20:55 +09003654 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003655 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003656 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003657 cc_library {
3658 name: "mylib2",
3659 srcs: ["mylib.cpp"],
3660 system_shared_libs: [],
3661 stl: "none",
3662 apex_available: [
3663 "myapex",
3664 "otherapex",
3665 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003666 static_libs: ["mylib3"],
3667 recovery_available: true,
3668 min_sdk_version: "29",
3669 }
3670 cc_library {
3671 name: "mylib3",
3672 srcs: ["mylib.cpp"],
3673 system_shared_libs: [],
3674 stl: "none",
3675 apex_available: [
3676 "myapex",
3677 "otherapex",
3678 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003679 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003680 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003681 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003682 `)
3683
Jooyung Hanc87a0592020-03-02 17:44:33 +09003684 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003685 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003686 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003687
Vinh Tranf9754732023-01-19 22:41:46 -05003688 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003689 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003690 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003695
Colin Crossaede88c2020-08-11 12:17:01 -07003696 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3697 // each variant defines additional macros to distinguish which apex variant it is built for
3698
3699 // non-APEX variant does not have __ANDROID_APEX__ defined
3700 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3701 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3702
Vinh Tranf9754732023-01-19 22:41:46 -05003703 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003706
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707 // non-APEX variant does not have __ANDROID_APEX__ defined
3708 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3710
Vinh Tranf9754732023-01-19 22:41:46 -05003711 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003714}
Jiyong Park7e636d02019-01-28 16:16:54 +09003715
3716func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003718 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003719 apex {
3720 name: "myapex",
3721 key: "myapex.key",
3722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003723 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003724 }
3725
3726 apex_key {
3727 name: "myapex.key",
3728 public_key: "testkey.avbpubkey",
3729 private_key: "testkey.pem",
3730 }
3731
3732 cc_library_headers {
3733 name: "mylib_headers",
3734 export_include_dirs: ["my_include"],
3735 system_shared_libs: [],
3736 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003737 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003738 }
3739
3740 cc_library {
3741 name: "mylib",
3742 srcs: ["mylib.cpp"],
3743 system_shared_libs: [],
3744 stl: "none",
3745 header_libs: ["mylib_headers"],
3746 export_header_lib_headers: ["mylib_headers"],
3747 stubs: {
3748 versions: ["1", "2", "3"],
3749 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003750 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003751 }
3752
3753 cc_library {
3754 name: "otherlib",
3755 srcs: ["mylib.cpp"],
3756 system_shared_libs: [],
3757 stl: "none",
3758 shared_libs: ["mylib"],
3759 }
3760 `)
3761
Colin Cross7113d202019-11-20 16:39:12 -08003762 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003763
3764 // Ensure that the include path of the header lib is exported to 'otherlib'
3765 ensureContains(t, cFlags, "-Imy_include")
3766}
Alex Light9670d332019-01-29 18:07:33 -08003767
Jiyong Park7cd10e32020-01-14 09:22:18 +09003768type fileInApex struct {
3769 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003770 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 isLink bool
3772}
3773
Jooyung Han1724d582022-12-21 10:17:44 +09003774func (f fileInApex) String() string {
3775 return f.src + ":" + f.path
3776}
3777
3778func (f fileInApex) match(expectation string) bool {
3779 parts := strings.Split(expectation, ":")
3780 if len(parts) == 1 {
3781 match, _ := path.Match(parts[0], f.path)
3782 return match
3783 }
3784 if len(parts) == 2 {
3785 matchSrc, _ := path.Match(parts[0], f.src)
3786 matchDst, _ := path.Match(parts[1], f.path)
3787 return matchSrc && matchDst
3788 }
3789 panic("invalid expected file specification: " + expectation)
3790}
3791
Jooyung Hana57af4a2020-01-23 05:36:59 +00003792func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003793 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003794 module := ctx.ModuleForTests(moduleName, variant)
3795 apexRule := module.MaybeRule("apexRule")
3796 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003798 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003799 for _, cmd := range strings.Split(copyCmds, "&&") {
3800 cmd = strings.TrimSpace(cmd)
3801 if cmd == "" {
3802 continue
3803 }
3804 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003805 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003806 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 switch terms[0] {
3808 case "mkdir":
3809 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 t.Fatal("copyCmds contains invalid cp command", cmd)
3812 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003813 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003814 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003815 isLink = false
3816 case "ln":
3817 if len(terms) != 3 && len(terms) != 4 {
3818 // ln LINK TARGET or ln -s LINK TARGET
3819 t.Fatal("copyCmds contains invalid ln command", cmd)
3820 }
3821 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003822 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003823 isLink = true
3824 default:
3825 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3826 }
3827 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003828 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003829 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003830 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 }
Jooyung Han1724d582022-12-21 10:17:44 +09003832 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003833 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003834 }
3835 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003836 return ret
3837}
3838
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003839func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003840 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003841 var failed bool
3842 var surplus []string
3843 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003844 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003845 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003846 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003847 if file.match(expected) {
3848 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003849 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003850 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003851 }
3852 }
Jooyung Han1724d582022-12-21 10:17:44 +09003853 if !matchFound {
3854 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003857
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003859 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003860 t.Log("surplus files", surplus)
3861 failed = true
3862 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003865 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 if !filesMatched[expected] {
3868 missing = append(missing, expected)
3869 }
3870 }
3871 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003872 t.Log("missing files", missing)
3873 failed = true
3874 }
3875 if failed {
3876 t.Fail()
3877 }
3878}
3879
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003880func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3881 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3882}
3883
3884func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003885 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3887 if deapexer.Output != nil {
3888 outputs = append(outputs, deapexer.Output.String())
3889 }
3890 for _, output := range deapexer.ImplicitOutputs {
3891 outputs = append(outputs, output.String())
3892 }
3893 actualFiles := make([]fileInApex, 0, len(outputs))
3894 for _, output := range outputs {
3895 dir := "/deapexer/"
3896 pos := strings.LastIndex(output, dir)
3897 if pos == -1 {
3898 t.Fatal("Unknown deapexer output ", output)
3899 }
3900 path := output[pos+len(dir):]
3901 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3902 }
3903 assertFileListEquals(t, files, actualFiles)
3904}
3905
Jooyung Han39edb6c2019-11-06 16:53:07 +09003906func vndkLibrariesTxtFiles(vers ...string) (result string) {
3907 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003908 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003909 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 prebuilt_etc {
3911 name: "` + txt + `.libraries.` + v + `.txt",
3912 src: "dummy.txt",
3913 }
3914 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 }
3916 }
3917 return
3918}
3919
Jooyung Han344d5432019-08-23 11:17:39 +09003920func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003921 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003922 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003923 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003924 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003926 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003928 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 }
3930
3931 apex_key {
3932 name: "myapex.key",
3933 public_key: "testkey.avbpubkey",
3934 private_key: "testkey.pem",
3935 }
3936
Jooyung Han31c470b2019-10-18 16:26:59 +09003937 vndk_prebuilt_shared {
3938 name: "libvndk27",
3939 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003940 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003941 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003942 vndk: {
3943 enabled: true,
3944 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003945 target_arch: "arm64",
3946 arch: {
3947 arm: {
3948 srcs: ["libvndk27_arm.so"],
3949 },
3950 arm64: {
3951 srcs: ["libvndk27_arm64.so"],
3952 },
3953 },
Colin Cross2807f002021-03-02 10:15:29 -08003954 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003955 }
3956
3957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "x86_64",
3966 arch: {
3967 x86: {
3968 srcs: ["libvndk27_x86.so"],
3969 },
3970 x86_64: {
3971 srcs: ["libvndk27_x86_64.so"],
3972 },
3973 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003974 }
3975 `+vndkLibrariesTxtFiles("27"),
3976 withFiles(map[string][]byte{
3977 "libvndk27_arm.so": nil,
3978 "libvndk27_arm64.so": nil,
3979 "libvndk27_x86.so": nil,
3980 "libvndk27_x86_64.so": nil,
3981 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003982
Jooyung Hana0503a52023-08-23 13:12:50 +09003983 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003984 "lib/libvndk27_arm.so",
3985 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 })
Jooyung Han344d5432019-08-23 11:17:39 +09003988}
3989
Jooyung Han90eee022019-10-01 20:02:42 +09003990func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003993 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003994 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003995 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003997 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003998 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003999 }
4000 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004001 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004002 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004003 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004004 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004006 }
4007 apex_key {
4008 name: "myapex.key",
4009 public_key: "testkey.avbpubkey",
4010 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004011 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004012
4013 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004014 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004015 apexManifestRule := module.Rule("apexManifestRule")
4016 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004017 }
4018
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004019 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004020 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004021}
4022
Jooyung Han344d5432019-08-23 11:17:39 +09004023func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004024 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004025 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004026 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004027 name: "com.android.vndk.v30",
4028 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 native_bridge_supported: true,
4031 }
4032
4033 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004034 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004035 public_key: "testkey.avbpubkey",
4036 private_key: "testkey.pem",
4037 }
4038
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004039 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004040 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004041 version: "30",
4042 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004043 srcs: ["mylib.cpp"],
4044 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004045 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004046 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004047 vndk: {
4048 enabled: true,
4049 },
Jooyung Han344d5432019-08-23 11:17:39 +09004050 }
4051 `)
4052}
4053
Jooyung Han31c470b2019-10-18 16:26:59 +09004054func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004055 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004059 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004062 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 vndk_prebuilt_shared {
4072 name: "libvndk27",
4073 version: "27",
4074 target_arch: "arm",
4075 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004076 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 vndk: {
4078 enabled: true,
4079 },
4080 arch: {
4081 arm: {
4082 srcs: ["libvndk27.so"],
4083 }
4084 },
4085 }
4086
4087 vndk_prebuilt_shared {
4088 name: "libvndk27",
4089 version: "27",
4090 target_arch: "arm",
4091 binder32bit: true,
4092 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004093 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004094 vndk: {
4095 enabled: true,
4096 },
4097 arch: {
4098 arm: {
4099 srcs: ["libvndk27binder32.so"],
4100 }
4101 },
Colin Cross2807f002021-03-02 10:15:29 -08004102 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004104 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004105 withFiles(map[string][]byte{
4106 "libvndk27.so": nil,
4107 "libvndk27binder32.so": nil,
4108 }),
4109 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004110 android.FixtureModifyConfig(func(config android.Config) {
4111 target := android.Target{
4112 Os: android.Android,
4113 Arch: android.Arch{
4114 ArchType: android.Arm,
4115 ArchVariant: "armv7-a-neon",
4116 Abi: []string{"armeabi-v7a"},
4117 },
4118 NativeBridge: android.NativeBridgeDisabled,
4119 NativeBridgeHostArchName: "",
4120 NativeBridgeRelativePath: "",
4121 }
4122 config.Targets[android.Android] = []android.Target{target}
4123 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004124 }),
4125 )
4126
Jooyung Hana0503a52023-08-23 13:12:50 +09004127 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004129 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 })
4131}
4132
Jooyung Hane1633032019-08-01 17:41:43 +09004133func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004134 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004135 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004136 apex {
4137 name: "myapex_nodep",
4138 key: "myapex.key",
4139 native_shared_libs: ["lib_nodep"],
4140 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004142 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004143 }
4144
4145 apex {
4146 name: "myapex_dep",
4147 key: "myapex.key",
4148 native_shared_libs: ["lib_dep"],
4149 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004151 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004152 }
4153
4154 apex {
4155 name: "myapex_provider",
4156 key: "myapex.key",
4157 native_shared_libs: ["libfoo"],
4158 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004161 }
4162
4163 apex {
4164 name: "myapex_selfcontained",
4165 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004166 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004167 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004170 }
4171
4172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
4177
4178 cc_library {
4179 name: "lib_nodep",
4180 srcs: ["mylib.cpp"],
4181 system_shared_libs: [],
4182 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004183 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004184 }
4185
4186 cc_library {
4187 name: "lib_dep",
4188 srcs: ["mylib.cpp"],
4189 shared_libs: ["libfoo"],
4190 system_shared_libs: [],
4191 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004192 apex_available: [
4193 "myapex_dep",
4194 "myapex_provider",
4195 "myapex_selfcontained",
4196 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004197 }
4198
4199 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004200 name: "lib_dep_on_bar",
4201 srcs: ["mylib.cpp"],
4202 shared_libs: ["libbar"],
4203 system_shared_libs: [],
4204 stl: "none",
4205 apex_available: [
4206 "myapex_selfcontained",
4207 ],
4208 }
4209
4210
4211 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004212 name: "libfoo",
4213 srcs: ["mytest.cpp"],
4214 stubs: {
4215 versions: ["1"],
4216 },
4217 system_shared_libs: [],
4218 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004219 apex_available: [
4220 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004221 ],
4222 }
4223
4224 cc_library {
4225 name: "libbar",
4226 srcs: ["mytest.cpp"],
4227 stubs: {
4228 versions: ["1"],
4229 },
4230 system_shared_libs: [],
4231 stl: "none",
4232 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 "myapex_selfcontained",
4234 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004235 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004236
Jooyung Hane1633032019-08-01 17:41:43 +09004237 `)
4238
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004239 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004240 var provideNativeLibs, requireNativeLibs []string
4241
Jooyung Hana0503a52023-08-23 13:12:50 +09004242 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4244 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004245 ensureListEmpty(t, provideNativeLibs)
4246 ensureListEmpty(t, requireNativeLibs)
4247
Jooyung Hana0503a52023-08-23 13:12:50 +09004248 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004249 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4250 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004251 ensureListEmpty(t, provideNativeLibs)
4252 ensureListContains(t, requireNativeLibs, "libfoo.so")
4253
Jooyung Hana0503a52023-08-23 13:12:50 +09004254 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004255 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4256 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004257 ensureListContains(t, provideNativeLibs, "libfoo.so")
4258 ensureListEmpty(t, requireNativeLibs)
4259
Jooyung Hana0503a52023-08-23 13:12:50 +09004260 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004261 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4262 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004263 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004264 ensureListEmpty(t, requireNativeLibs)
4265}
4266
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004267func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004268 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004269 ctx := testApex(t, `
4270 apex {
4271 name: "myapex",
4272 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 native_shared_libs: ["mylib"],
4274 updatable: false,
4275 }
4276
4277 apex_key {
4278 name: "myapex.key",
4279 public_key: "testkey.avbpubkey",
4280 private_key: "testkey.pem",
4281 }
4282
4283 cc_library {
4284 name: "mylib",
4285 srcs: ["mylib.cpp"],
4286 system_shared_libs: [],
4287 stl: "none",
4288 apex_available: [
4289 "//apex_available:platform",
4290 "myapex",
4291 ],
4292 }
4293 `, android.FixtureMergeEnv(map[string]string{
4294 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4295 }))
4296
Jooyung Hana0503a52023-08-23 13:12:50 +09004297 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004298 apexManifestRule := module.Rule("apexManifestRule")
4299 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4300}
4301
Vinh Tran8f5310f2022-10-07 18:16:47 -04004302func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004303 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004304 testCases := []struct {
4305 compileMultiLibProp string
4306 containedLibs []string
4307 notContainedLibs []string
4308 }{
4309 {
4310 containedLibs: []string{
4311 "image.apex/lib64/mylib.so",
4312 "image.apex/lib/mylib.so",
4313 },
4314 compileMultiLibProp: `compile_multilib: "both",`,
4315 },
4316 {
4317 containedLibs: []string{"image.apex/lib64/mylib.so"},
4318 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4319 compileMultiLibProp: `compile_multilib: "first",`,
4320 },
4321 {
4322 containedLibs: []string{"image.apex/lib64/mylib.so"},
4323 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4324 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4325 },
4326 {
4327 containedLibs: []string{"image.apex/lib64/mylib.so"},
4328 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4329 compileMultiLibProp: `compile_multilib: "64",`,
4330 },
4331 {
4332 containedLibs: []string{"image.apex/lib/mylib.so"},
4333 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4334 compileMultiLibProp: `compile_multilib: "32",`,
4335 },
4336 }
4337 for _, testCase := range testCases {
4338 ctx := testApex(t, fmt.Sprintf(`
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 %s
4343 native_shared_libs: ["mylib"],
4344 updatable: false,
4345 }
4346 apex_key {
4347 name: "myapex.key",
4348 public_key: "testkey.avbpubkey",
4349 private_key: "testkey.pem",
4350 }
4351 cc_library {
4352 name: "mylib",
4353 srcs: ["mylib.cpp"],
4354 apex_available: [
4355 "//apex_available:platform",
4356 "myapex",
4357 ],
4358 }
4359 `, testCase.compileMultiLibProp),
4360 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004362 apexRule := module.Rule("apexRule")
4363 copyCmds := apexRule.Args["copy_commands"]
4364 for _, containedLib := range testCase.containedLibs {
4365 ensureContains(t, copyCmds, containedLib)
4366 }
4367 for _, notContainedLib := range testCase.notContainedLibs {
4368 ensureNotContains(t, copyCmds, notContainedLib)
4369 }
4370 }
4371}
4372
Alex Light0851b882019-02-07 13:20:53 -08004373func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004376 apex {
4377 name: "myapex",
4378 key: "myapex.key",
4379 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004380 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004381 }
4382
4383 apex_key {
4384 name: "myapex.key",
4385 public_key: "testkey.avbpubkey",
4386 private_key: "testkey.pem",
4387 }
4388
4389 cc_library {
4390 name: "mylib_common",
4391 srcs: ["mylib.cpp"],
4392 system_shared_libs: [],
4393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004394 apex_available: [
4395 "//apex_available:platform",
4396 "myapex",
4397 ],
Alex Light0851b882019-02-07 13:20:53 -08004398 }
4399 `)
4400
Jooyung Hana0503a52023-08-23 13:12:50 +09004401 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004402 apexRule := module.Rule("apexRule")
4403 copyCmds := apexRule.Args["copy_commands"]
4404
4405 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4406 t.Log("Apex was a test apex!")
4407 t.Fail()
4408 }
4409 // Ensure that main rule creates an output
4410 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4411
4412 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004413 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004414
4415 // Ensure that both direct and indirect deps are copied into apex
4416 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4417
Colin Cross7113d202019-11-20 16:39:12 -08004418 // Ensure that the platform variant ends with _shared
4419 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004420
Colin Cross56a83212020-09-15 18:30:11 -07004421 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004422 t.Log("Found mylib_common not in any apex!")
4423 t.Fail()
4424 }
4425}
4426
4427func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004428 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004429 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004430 apex_test {
4431 name: "myapex",
4432 key: "myapex.key",
4433 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004434 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004435 }
4436
4437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
4442
4443 cc_library {
4444 name: "mylib_common_test",
4445 srcs: ["mylib.cpp"],
4446 system_shared_libs: [],
4447 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004448 // TODO: remove //apex_available:platform
4449 apex_available: [
4450 "//apex_available:platform",
4451 "myapex",
4452 ],
Alex Light0851b882019-02-07 13:20:53 -08004453 }
4454 `)
4455
Jooyung Hana0503a52023-08-23 13:12:50 +09004456 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004457 apexRule := module.Rule("apexRule")
4458 copyCmds := apexRule.Args["copy_commands"]
4459
4460 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4461 t.Log("Apex was not a test apex!")
4462 t.Fail()
4463 }
4464 // Ensure that main rule creates an output
4465 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4466
4467 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004468 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004469
4470 // Ensure that both direct and indirect deps are copied into apex
4471 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4472
Colin Cross7113d202019-11-20 16:39:12 -08004473 // Ensure that the platform variant ends with _shared
4474 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004475}
4476
Jooyung Han85707de2023-12-01 14:21:13 +09004477func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004478 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004479 ctx := testApex(t, `
4480 apex {
4481 name: "myapex",
4482 key: "myapex.key",
4483 updatable: false,
4484 binaries: ["mybin"],
4485 }
4486 apex {
4487 name: "myvendorapex",
4488 key: "myapex.key",
4489 file_contexts: "myvendorapex_file_contexts",
4490 vendor: true,
4491 updatable: false,
4492 binaries: ["mybin"],
4493 }
4494 apex_key {
4495 name: "myapex.key",
4496 public_key: "testkey.avbpubkey",
4497 private_key: "testkey.pem",
4498 }
4499 cc_binary {
4500 name: "mybin",
4501 vendor_available: true,
4502 system_shared_libs: [],
4503 stl: "none",
4504 shared_libs: ["libz"],
4505 apex_available: ["//apex_available:anyapex"],
4506 }
4507 cc_library {
4508 name: "libz",
4509 vendor_available: true,
4510 system_shared_libs: [],
4511 stl: "none",
4512 stubs: {
4513 versions: ["28", "30"],
4514 },
4515 target: {
4516 vendor: {
4517 no_stubs: true,
4518 },
4519 },
4520 }
4521 `, withFiles(map[string][]byte{
4522 "myvendorapex_file_contexts": nil,
4523 }))
4524
4525 // libz provides stubs for core variant.
4526 {
4527 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4528 "bin/mybin",
4529 })
4530 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4531 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4532 }
4533 // libz doesn't provide stubs for vendor variant.
4534 {
4535 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4536 "bin/mybin",
4537 "lib64/libz.so",
4538 })
4539 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4540 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4541 }
4542}
4543
Alex Light9670d332019-01-29 18:07:33 -08004544func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004545 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004546 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004550 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004551 multilib: {
4552 first: {
4553 native_shared_libs: ["mylib_common"],
4554 }
4555 },
4556 target: {
4557 android: {
4558 multilib: {
4559 first: {
4560 native_shared_libs: ["mylib"],
4561 }
4562 }
4563 },
4564 host: {
4565 multilib: {
4566 first: {
4567 native_shared_libs: ["mylib2"],
4568 }
4569 }
4570 }
4571 }
4572 }
4573
4574 apex_key {
4575 name: "myapex.key",
4576 public_key: "testkey.avbpubkey",
4577 private_key: "testkey.pem",
4578 }
4579
4580 cc_library {
4581 name: "mylib",
4582 srcs: ["mylib.cpp"],
4583 system_shared_libs: [],
4584 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004585 // TODO: remove //apex_available:platform
4586 apex_available: [
4587 "//apex_available:platform",
4588 "myapex",
4589 ],
Alex Light9670d332019-01-29 18:07:33 -08004590 }
4591
4592 cc_library {
4593 name: "mylib_common",
4594 srcs: ["mylib.cpp"],
4595 system_shared_libs: [],
4596 stl: "none",
4597 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004598 // TODO: remove //apex_available:platform
4599 apex_available: [
4600 "//apex_available:platform",
4601 "myapex",
4602 ],
Alex Light9670d332019-01-29 18:07:33 -08004603 }
4604
4605 cc_library {
4606 name: "mylib2",
4607 srcs: ["mylib.cpp"],
4608 system_shared_libs: [],
4609 stl: "none",
4610 compile_multilib: "first",
4611 }
4612 `)
4613
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004615 copyCmds := apexRule.Args["copy_commands"]
4616
4617 // Ensure that main rule creates an output
4618 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4619
4620 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004621 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4622 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4623 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004624
4625 // Ensure that both direct and indirect deps are copied into apex
4626 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4627 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4628 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4629
Colin Cross7113d202019-11-20 16:39:12 -08004630 // Ensure that the platform variant ends with _shared
4631 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4632 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4633 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004634}
Jiyong Park04480cf2019-02-06 00:16:29 +09004635
Jiyong Park59140302020-12-14 18:44:04 +09004636func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004637 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004638 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004639 apex {
4640 name: "myapex",
4641 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004642 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004643 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004644 arch: {
4645 arm64: {
4646 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004647 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 },
4649 x86_64: {
4650 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 }
4654 }
4655
4656 apex_key {
4657 name: "myapex.key",
4658 public_key: "testkey.avbpubkey",
4659 private_key: "testkey.pem",
4660 }
4661
4662 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004663 name: "mylib.generic",
4664 srcs: ["mylib.cpp"],
4665 system_shared_libs: [],
4666 stl: "none",
4667 // TODO: remove //apex_available:platform
4668 apex_available: [
4669 "//apex_available:platform",
4670 "myapex",
4671 ],
4672 }
4673
4674 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004675 name: "mylib.arm64",
4676 srcs: ["mylib.cpp"],
4677 system_shared_libs: [],
4678 stl: "none",
4679 // TODO: remove //apex_available:platform
4680 apex_available: [
4681 "//apex_available:platform",
4682 "myapex",
4683 ],
4684 }
4685
4686 cc_library {
4687 name: "mylib.x64",
4688 srcs: ["mylib.cpp"],
4689 system_shared_libs: [],
4690 stl: "none",
4691 // TODO: remove //apex_available:platform
4692 apex_available: [
4693 "//apex_available:platform",
4694 "myapex",
4695 ],
4696 }
4697 `)
4698
Jooyung Hana0503a52023-08-23 13:12:50 +09004699 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004700 copyCmds := apexRule.Args["copy_commands"]
4701
4702 // Ensure that apex variant is created for the direct dep
4703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004704 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004705 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4706
4707 // Ensure that both direct and indirect deps are copied into apex
4708 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4709 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4710}
4711
Jiyong Park04480cf2019-02-06 00:16:29 +09004712func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004713 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004714 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004718 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004719 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004720 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004721 }
4722
4723 apex_key {
4724 name: "myapex.key",
4725 public_key: "testkey.avbpubkey",
4726 private_key: "testkey.pem",
4727 }
4728
4729 sh_binary {
4730 name: "myscript",
4731 src: "mylib.cpp",
4732 filename: "myscript.sh",
4733 sub_dir: "script",
4734 }
4735 `)
4736
Jooyung Hana0503a52023-08-23 13:12:50 +09004737 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004738 copyCmds := apexRule.Args["copy_commands"]
4739
4740 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4741}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004742
Jooyung Han91df2082019-11-20 01:49:42 +09004743func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004744 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004745 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004746 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004747 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004748 {"", "system"},
4749 {"product_specific: true", "product"},
4750 {"soc_specific: true", "vendor"},
4751 {"proprietary: true", "vendor"},
4752 {"vendor: true", "vendor"},
4753 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004754 }
4755 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004756 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004757 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004758 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004759 apex {
4760 name: "myapex",
4761 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004762 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004763 `+tc.propName+`
4764 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004765
Jooyung Han91df2082019-11-20 01:49:42 +09004766 apex_key {
4767 name: "myapex.key",
4768 public_key: "testkey.avbpubkey",
4769 private_key: "testkey.pem",
4770 }
4771 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004772
Jooyung Hana0503a52023-08-23 13:12:50 +09004773 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004774 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004775 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004776 if actual != expected {
4777 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4778 }
Jooyung Han91df2082019-11-20 01:49:42 +09004779 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004780 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004781}
Jiyong Park67882562019-03-21 01:11:21 +09004782
Jooyung Han580eb4f2020-06-24 19:33:06 +09004783func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004785 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004786 apex {
4787 name: "myapex",
4788 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004789 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792 apex_key {
4793 name: "myapex.key",
4794 public_key: "testkey.avbpubkey",
4795 private_key: "testkey.pem",
4796 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004797 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004798 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004799 rule := module.Output("file_contexts")
4800 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4801}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004805 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
4809 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004810 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812
Jooyung Han580eb4f2020-06-24 19:33:06 +09004813 apex_key {
4814 name: "myapex.key",
4815 public_key: "testkey.avbpubkey",
4816 private_key: "testkey.pem",
4817 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004818 `, withFiles(map[string][]byte{
4819 "my_own_file_contexts": nil,
4820 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 product_specific: true,
4830 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004831 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004833
Jooyung Han580eb4f2020-06-24 19:33:06 +09004834 apex_key {
4835 name: "myapex.key",
4836 public_key: "testkey.avbpubkey",
4837 private_key: "testkey.pem",
4838 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004839 `)
4840
Colin Cross1c460562021-02-16 17:55:47 -08004841 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004842 apex {
4843 name: "myapex",
4844 key: "myapex.key",
4845 product_specific: true,
4846 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004847 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004848 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004849
Jooyung Han580eb4f2020-06-24 19:33:06 +09004850 apex_key {
4851 name: "myapex.key",
4852 public_key: "testkey.avbpubkey",
4853 private_key: "testkey.pem",
4854 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004855 `, withFiles(map[string][]byte{
4856 "product_specific_file_contexts": nil,
4857 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004858 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004859 rule := module.Output("file_contexts")
4860 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4861}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004862
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004864 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004865 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 product_specific: true,
4870 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004871 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004872 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004873
Jooyung Han580eb4f2020-06-24 19:33:06 +09004874 apex_key {
4875 name: "myapex.key",
4876 public_key: "testkey.avbpubkey",
4877 private_key: "testkey.pem",
4878 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004879
Jooyung Han580eb4f2020-06-24 19:33:06 +09004880 filegroup {
4881 name: "my-file-contexts",
4882 srcs: ["product_specific_file_contexts"],
4883 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004884 `, withFiles(map[string][]byte{
4885 "product_specific_file_contexts": nil,
4886 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004887 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004888 rule := module.Output("file_contexts")
4889 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004890}
4891
Jiyong Park67882562019-03-21 01:11:21 +09004892func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004894 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004895 apex_key {
4896 name: "myapex.key",
4897 public_key: ":my.avbpubkey",
4898 private_key: ":my.pem",
4899 product_specific: true,
4900 }
4901
4902 filegroup {
4903 name: "my.avbpubkey",
4904 srcs: ["testkey2.avbpubkey"],
4905 }
4906
4907 filegroup {
4908 name: "my.pem",
4909 srcs: ["testkey2.pem"],
4910 }
4911 `)
4912
4913 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4914 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004915 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004916 if actual_pubkey != expected_pubkey {
4917 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4918 }
4919 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004920 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004921 if actual_privkey != expected_privkey {
4922 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4923 }
4924}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004925
4926func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004927 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004928 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929 prebuilt_apex {
4930 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004931 arch: {
4932 arm64: {
4933 src: "myapex-arm64.apex",
4934 },
4935 arm: {
4936 src: "myapex-arm.apex",
4937 },
4938 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939 }
4940 `)
4941
Wei Li340ee8e2022-03-18 17:33:24 -07004942 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4943 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004944
Jiyong Parkc95714e2019-03-29 14:23:10 +09004945 expectedInput := "myapex-arm64.apex"
4946 if prebuilt.inputApex.String() != expectedInput {
4947 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4948 }
Wei Li340ee8e2022-03-18 17:33:24 -07004949 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4950 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4951 rule := testingModule.Rule("genProvenanceMetaData")
4952 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4953 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4954 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4955 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004956
4957 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4958 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004960
Paul Duffinc0609c62021-03-01 17:27:16 +00004961func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004962 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004963 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004964 prebuilt_apex {
4965 name: "myapex",
4966 }
4967 `)
4968}
4969
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004970func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004971 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004972 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004973 prebuilt_apex {
4974 name: "myapex",
4975 src: "myapex-arm.apex",
4976 filename: "notmyapex.apex",
4977 }
4978 `)
4979
Wei Li340ee8e2022-03-18 17:33:24 -07004980 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4981 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004982
4983 expected := "notmyapex.apex"
4984 if p.installFilename != expected {
4985 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4986 }
Wei Li340ee8e2022-03-18 17:33:24 -07004987 rule := testingModule.Rule("genProvenanceMetaData")
4988 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4989 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4990 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4991 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004992}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004993
Samiul Islam7c02e262021-09-08 17:48:28 +01004994func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004995 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004996 testApex(t, `
4997 apex_set {
4998 name: "com.company.android.myapex",
4999 apex_name: "com.android.myapex",
5000 set: "company-myapex.apks",
5001 filename: "com.company.android.myapex.apex"
5002 }
5003 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5004
5005 testApex(t, `
5006 apex_set {
5007 name: "com.company.android.myapex",
5008 apex_name: "com.android.myapex",
5009 set: "company-myapex.apks",
5010 filename: "com.company.android.myapex.capex"
5011 }
5012 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5013
5014 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5015 apex_set {
5016 name: "com.company.android.myapex",
5017 apex_name: "com.android.myapex",
5018 set: "company-myapex.apks",
5019 filename: "some-random-suffix"
5020 }
5021 `)
5022}
5023
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005024func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005025 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005026 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005027 prebuilt_apex {
5028 name: "myapex.prebuilt",
5029 src: "myapex-arm.apex",
5030 overrides: [
5031 "myapex",
5032 ],
5033 }
5034 `)
5035
Wei Li340ee8e2022-03-18 17:33:24 -07005036 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5037 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005038
5039 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005040 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005041 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005042 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005043 }
Wei Li340ee8e2022-03-18 17:33:24 -07005044 rule := testingModule.Rule("genProvenanceMetaData")
5045 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5046 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5047 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5048 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005049}
5050
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005051func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005052 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005053 testApex(t, `
5054 prebuilt_apex {
5055 name: "com.company.android.myapex",
5056 apex_name: "com.android.myapex",
5057 src: "company-myapex-arm.apex",
5058 }
5059 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5060
5061 testApex(t, `
5062 apex_set {
5063 name: "com.company.android.myapex",
5064 apex_name: "com.android.myapex",
5065 set: "company-myapex.apks",
5066 }
5067 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5068}
5069
5070func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005071 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005072 _ = android.GroupFixturePreparers(
5073 java.PrepareForTestWithJavaDefaultModules,
5074 PrepareForTestWithApexBuildComponents,
5075 android.FixtureWithRootAndroidBp(`
5076 platform_bootclasspath {
5077 name: "platform-bootclasspath",
5078 fragments: [
5079 {
5080 apex: "com.android.art",
5081 module: "art-bootclasspath-fragment",
5082 },
5083 ],
5084 }
5085
5086 prebuilt_apex {
5087 name: "com.company.android.art",
5088 apex_name: "com.android.art",
5089 src: "com.company.android.art-arm.apex",
5090 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5091 }
5092
5093 prebuilt_bootclasspath_fragment {
5094 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005095 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005096 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005097 hidden_api: {
5098 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5099 metadata: "my-bootclasspath-fragment/metadata.csv",
5100 index: "my-bootclasspath-fragment/index.csv",
5101 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5102 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5103 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005104 }
5105
5106 java_import {
5107 name: "core-oj",
5108 jars: ["prebuilt.jar"],
5109 }
5110 `),
5111 ).RunTest(t)
5112}
5113
Spandan Das59a4a2b2024-01-09 21:35:56 +00005114// A minimal context object for use with DexJarBuildPath
5115type moduleErrorfTestCtx struct {
5116}
5117
5118func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5119}
5120
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005122 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005123 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005124 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005125 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5126 // is disabled.
5127 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005128
5129 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5130 // file creation.
5131 java.FixtureConfigureBootJars("platform:foo"),
5132 android.FixtureModifyMockFS(func(fs android.MockFS) {
5133 fs["platform/Android.bp"] = []byte(`
5134 java_library {
5135 name: "foo",
5136 srcs: ["Test.java"],
5137 compile_dex: true,
5138 }
5139 `)
5140 fs["platform/Test.java"] = nil
5141 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005142 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005143
Paul Duffin40a3f652021-07-19 13:11:24 +01005144 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005145 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005146 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005147 var rule android.TestingBuildParams
5148
5149 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5150 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005151 }
5152
Paul Duffin40a3f652021-07-19 13:11:24 +01005153 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5154 t.Helper()
5155 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5156 var rule android.TestingBuildParams
5157
5158 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5159 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5160 }
5161
Paul Duffin89f570a2021-06-16 01:42:33 +01005162 fragment := java.ApexVariantReference{
5163 Apex: proptools.StringPtr("myapex"),
5164 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5165 }
5166
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005167 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005168 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 bp := `
5170 prebuilt_apex {
5171 name: "myapex",
5172 arch: {
5173 arm64: {
5174 src: "myapex-arm64.apex",
5175 },
5176 arm: {
5177 src: "myapex-arm.apex",
5178 },
5179 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005180 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5181 }
5182
5183 prebuilt_bootclasspath_fragment {
5184 name: "my-bootclasspath-fragment",
5185 contents: ["libfoo", "libbar"],
5186 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005187 hidden_api: {
5188 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5189 metadata: "my-bootclasspath-fragment/metadata.csv",
5190 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005191 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5192 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5193 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005194 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
5196
Spandan Das52c01a12024-09-20 01:09:48 +00005197 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005199 public: {
5200 jars: ["libfoo.jar"],
5201 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005203 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005204 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 }
Paul Duffin37856732021-02-26 14:24:15 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 public: {
5210 jars: ["libbar.jar"],
5211 },
5212 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005213 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005214 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005215 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005216 `
5217
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005219
Paul Duffin537ea3d2021-05-14 10:38:00 +01005220 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005221 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005222 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005223 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005224 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005225 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005226 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005227 })
5228
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005229 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005230 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005231 bp := `
5232 apex_set {
5233 name: "myapex",
5234 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005236 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5237 }
5238
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 prebuilt_bootclasspath_fragment {
5240 name: "my-bootclasspath-fragment",
5241 contents: ["libfoo", "libbar"],
5242 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005243 hidden_api: {
5244 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5245 metadata: "my-bootclasspath-fragment/metadata.csv",
5246 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005247 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5248 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5249 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005250 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 }
5252
Liz Kammer2dc72442023-04-20 10:10:48 -04005253 prebuilt_systemserverclasspath_fragment {
5254 name: "my-systemserverclasspath-fragment",
5255 contents: ["libbaz"],
5256 apex_available: ["myapex"],
5257 }
5258
Spandan Das52c01a12024-09-20 01:09:48 +00005259 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005260 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005261 public: {
5262 jars: ["libfoo.jar"],
5263 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005265 shared_library: false,
5266 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005267 }
5268
Spandan Das52c01a12024-09-20 01:09:48 +00005269
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005270 java_sdk_library_import {
5271 name: "libbar",
5272 public: {
5273 jars: ["libbar.jar"],
5274 },
5275 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005276 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005277 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005278 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005279
5280 java_sdk_library_import {
5281 name: "libbaz",
5282 public: {
5283 jars: ["libbaz.jar"],
5284 },
5285 apex_available: ["myapex"],
5286 shared_library: false,
5287 permitted_packages: ["baz"],
5288 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005289 `
5290
Paul Duffin89f570a2021-06-16 01:42:33 +01005291 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005292
Paul Duffin537ea3d2021-05-14 10:38:00 +01005293 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005294 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005295 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005296 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005297 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005298 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005300
5301 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5302
5303 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005304 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005305 "myjavalib.myapex",
5306 "libfoo.myapex",
5307 "libbar.myapex",
5308 "libbaz.myapex",
5309 }
5310 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5311 for i, e := range mkEntries {
5312 g := e.OverrideName
5313 if w := overrideNames[i]; w != g {
5314 t.Errorf("Expected override name %q, got %q", w, g)
5315 }
5316 }
5317
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005318 })
5319
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005320 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005321 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005322 bp := `
5323 prebuilt_apex {
5324 name: "myapex",
5325 arch: {
5326 arm64: {
5327 src: "myapex-arm64.apex",
5328 },
5329 arm: {
5330 src: "myapex-arm.apex",
5331 },
5332 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005333 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5334 }
5335
5336 prebuilt_bootclasspath_fragment {
5337 name: "my-bootclasspath-fragment",
5338 contents: ["libfoo", "libbar"],
5339 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005340 hidden_api: {
5341 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5342 metadata: "my-bootclasspath-fragment/metadata.csv",
5343 index: "my-bootclasspath-fragment/index.csv",
5344 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5345 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5346 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 }
5348
5349 java_import {
5350 name: "libfoo",
5351 jars: ["libfoo.jar"],
5352 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005353 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_library {
5357 name: "libfoo",
5358 srcs: ["foo/bar/MyClass.java"],
5359 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005360 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005361 }
Paul Duffin37856732021-02-26 14:24:15 +00005362
5363 java_sdk_library_import {
5364 name: "libbar",
5365 public: {
5366 jars: ["libbar.jar"],
5367 },
5368 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005370 }
5371
5372 java_sdk_library {
5373 name: "libbar",
5374 srcs: ["foo/bar/MyClass.java"],
5375 unsafe_ignore_missing_latest_api: true,
5376 apex_available: ["myapex"],
5377 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005378 `
5379
5380 // In this test the source (java_library) libfoo is active since the
5381 // prebuilt (java_import) defaults to prefer:false. However the
5382 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5383 // find the dex boot jar in it. We either need to disable the source libfoo
5384 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005385 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005386 // dexbootjar check is skipped if AllowMissingDependencies is true
5387 preparerAllowMissingDeps := android.GroupFixturePreparers(
5388 preparer,
5389 android.PrepareForTestWithAllowMissingDependencies,
5390 )
5391 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 })
5393
5394 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005395 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005397 apex {
5398 name: "myapex",
5399 key: "myapex.key",
5400 updatable: false,
5401 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5402 }
5403
5404 apex_key {
5405 name: "myapex.key",
5406 public_key: "testkey.avbpubkey",
5407 private_key: "testkey.pem",
5408 }
5409
5410 bootclasspath_fragment {
5411 name: "my-bootclasspath-fragment",
5412 contents: ["libfoo", "libbar"],
5413 apex_available: ["myapex"],
5414 hidden_api: {
5415 split_packages: ["*"],
5416 },
5417 }
5418
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 prebuilt_apex {
5420 name: "myapex",
5421 arch: {
5422 arm64: {
5423 src: "myapex-arm64.apex",
5424 },
5425 arm: {
5426 src: "myapex-arm.apex",
5427 },
5428 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005429 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5430 }
5431
5432 prebuilt_bootclasspath_fragment {
5433 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005434 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005435 contents: ["libfoo", "libbar"],
5436 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005437 hidden_api: {
5438 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5439 metadata: "my-bootclasspath-fragment/metadata.csv",
5440 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005441 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5442 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5443 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005444 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005445 }
5446
Spandan Das52c01a12024-09-20 01:09:48 +00005447 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 name: "libfoo",
5449 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005450 public: {
5451 jars: ["libfoo.jar"],
5452 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005453 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005454 shared_library: false,
5455 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 }
5457
5458 java_library {
5459 name: "libfoo",
5460 srcs: ["foo/bar/MyClass.java"],
5461 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005462 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005463 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005464 }
Paul Duffin37856732021-02-26 14:24:15 +00005465
5466 java_sdk_library_import {
5467 name: "libbar",
5468 prefer: true,
5469 public: {
5470 jars: ["libbar.jar"],
5471 },
5472 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005473 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005474 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005475 }
5476
5477 java_sdk_library {
5478 name: "libbar",
5479 srcs: ["foo/bar/MyClass.java"],
5480 unsafe_ignore_missing_latest_api: true,
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005483 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 `
5485
Paul Duffin89f570a2021-06-16 01:42:33 +01005486 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005487
Paul Duffin537ea3d2021-05-14 10:38:00 +01005488 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005489 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005490 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005491 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005492 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005493 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005494 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005495 })
5496
5497 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005498 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 bp := `
5500 apex {
5501 name: "myapex",
5502 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005503 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005504 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 }
5506
5507 apex_key {
5508 name: "myapex.key",
5509 public_key: "testkey.avbpubkey",
5510 private_key: "testkey.pem",
5511 }
5512
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 bootclasspath_fragment {
5514 name: "my-bootclasspath-fragment",
5515 contents: ["libfoo", "libbar"],
5516 apex_available: ["myapex"],
5517 hidden_api: {
5518 split_packages: ["*"],
5519 },
5520 }
5521
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005522 prebuilt_apex {
5523 name: "myapex",
5524 arch: {
5525 arm64: {
5526 src: "myapex-arm64.apex",
5527 },
5528 arm: {
5529 src: "myapex-arm.apex",
5530 },
5531 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005532 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5533 }
5534
5535 prebuilt_bootclasspath_fragment {
5536 name: "my-bootclasspath-fragment",
5537 contents: ["libfoo", "libbar"],
5538 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005539 hidden_api: {
5540 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5541 metadata: "my-bootclasspath-fragment/metadata.csv",
5542 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005543 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5544 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5545 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005546 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 }
5548
5549 java_import {
5550 name: "libfoo",
5551 jars: ["libfoo.jar"],
5552 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005553 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005554 }
5555
5556 java_library {
5557 name: "libfoo",
5558 srcs: ["foo/bar/MyClass.java"],
5559 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005560 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005561 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005562 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 }
Paul Duffin37856732021-02-26 14:24:15 +00005564
5565 java_sdk_library_import {
5566 name: "libbar",
5567 public: {
5568 jars: ["libbar.jar"],
5569 },
5570 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005571 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005572 }
5573
5574 java_sdk_library {
5575 name: "libbar",
5576 srcs: ["foo/bar/MyClass.java"],
5577 unsafe_ignore_missing_latest_api: true,
5578 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005580 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005581 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005582 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 `
5584
Paul Duffin89f570a2021-06-16 01:42:33 +01005585 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005586
Paul Duffin537ea3d2021-05-14 10:38:00 +01005587 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005588 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005589 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5590 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005591 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5592 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005594 })
5595
5596 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005597 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 bp := `
5599 apex {
5600 name: "myapex",
5601 enabled: false,
5602 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005603 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
5611
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005612 bootclasspath_fragment {
5613 name: "my-bootclasspath-fragment",
5614 enabled: false,
5615 contents: ["libfoo", "libbar"],
5616 apex_available: ["myapex"],
5617 hidden_api: {
5618 split_packages: ["*"],
5619 },
5620 }
5621
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005622 prebuilt_apex {
5623 name: "myapex",
5624 arch: {
5625 arm64: {
5626 src: "myapex-arm64.apex",
5627 },
5628 arm: {
5629 src: "myapex-arm.apex",
5630 },
5631 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005632 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5633 }
5634
5635 prebuilt_bootclasspath_fragment {
5636 name: "my-bootclasspath-fragment",
5637 contents: ["libfoo", "libbar"],
5638 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005639 hidden_api: {
5640 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5641 metadata: "my-bootclasspath-fragment/metadata.csv",
5642 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005643 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5644 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5645 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005646 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005647 }
5648
5649 java_import {
5650 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 jars: ["libfoo.jar"],
5652 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005653 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005654 }
5655
5656 java_library {
5657 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005658 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005659 srcs: ["foo/bar/MyClass.java"],
5660 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005661 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005662 }
Paul Duffin37856732021-02-26 14:24:15 +00005663
5664 java_sdk_library_import {
5665 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005666 public: {
5667 jars: ["libbar.jar"],
5668 },
5669 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005670 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005671 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005672 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005673 }
5674
5675 java_sdk_library {
5676 name: "libbar",
5677 srcs: ["foo/bar/MyClass.java"],
5678 unsafe_ignore_missing_latest_api: true,
5679 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005680 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005681 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 `
Cole Fausta963b942024-04-11 17:43:00 -07005683 // This test disables libbar, which causes the ComponentDepsMutator to add
5684 // deps on libbar.stubs and other sub-modules that don't exist. We can
5685 // enable AllowMissingDependencies to work around that, but enabling that
5686 // causes extra checks for missing source files to dex_bootjars, so add those
5687 // to the mock fs as well.
5688 preparer2 := android.GroupFixturePreparers(
5689 preparer,
5690 android.PrepareForTestWithAllowMissingDependencies,
5691 android.FixtureMergeMockFs(map[string][]byte{
5692 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005693 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005694 }),
5695 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005696
Cole Fausta963b942024-04-11 17:43:00 -07005697 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005698
Paul Duffin537ea3d2021-05-14 10:38:00 +01005699 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005700 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005701 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005702 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005703 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005704 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005705 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706 })
Spandan Das3a392012024-01-17 18:26:27 +00005707
Spandan Dasf2c10572024-02-27 04:49:52 +00005708 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005709 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005710 bp := `
5711 // Source
5712 apex {
5713 name: "myapex",
5714 enabled: false,
5715 key: "myapex.key",
5716 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5717 }
5718
5719 apex_key {
5720 name: "myapex.key",
5721 public_key: "testkey.avbpubkey",
5722 private_key: "testkey.pem",
5723 }
5724
5725 // Prebuilt
5726 prebuilt_apex {
5727 name: "myapex.v1",
5728 source_apex_name: "myapex",
5729 arch: {
5730 arm64: {
5731 src: "myapex-arm64.apex",
5732 },
5733 arm: {
5734 src: "myapex-arm.apex",
5735 },
5736 },
5737 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5738 prefer: true,
5739 }
5740 prebuilt_apex {
5741 name: "myapex.v2",
5742 source_apex_name: "myapex",
5743 arch: {
5744 arm64: {
5745 src: "myapex-arm64.apex",
5746 },
5747 arm: {
5748 src: "myapex-arm.apex",
5749 },
5750 },
5751 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5752 prefer: true,
5753 }
5754
5755 prebuilt_bootclasspath_fragment {
5756 name: "my-bootclasspath-fragment",
5757 contents: ["libfoo", "libbar"],
5758 apex_available: ["myapex"],
5759 hidden_api: {
5760 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5761 metadata: "my-bootclasspath-fragment/metadata.csv",
5762 index: "my-bootclasspath-fragment/index.csv",
5763 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5764 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5765 },
5766 prefer: true,
5767 }
5768
5769 java_import {
5770 name: "libfoo",
5771 jars: ["libfoo.jar"],
5772 apex_available: ["myapex"],
5773 prefer: true,
5774 }
5775 java_import {
5776 name: "libbar",
5777 jars: ["libbar.jar"],
5778 apex_available: ["myapex"],
5779 prefer: true,
5780 }
5781 `
5782
Spandan Dasf2c10572024-02-27 04:49:52 +00005783 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005784 })
5785
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005786}
5787
Roland Levillain630846d2019-06-26 12:48:34 +01005788func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005789 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005790 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005791 apex_test {
5792 name: "myapex",
5793 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005794 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005795 tests: [
5796 "mytest",
5797 ],
5798 }
5799
5800 apex_key {
5801 name: "myapex.key",
5802 public_key: "testkey.avbpubkey",
5803 private_key: "testkey.pem",
5804 }
5805
Liz Kammer1c14a212020-05-12 15:26:55 -07005806 filegroup {
5807 name: "fg",
5808 srcs: [
5809 "baz",
5810 "bar/baz"
5811 ],
5812 }
5813
Roland Levillain630846d2019-06-26 12:48:34 +01005814 cc_test {
5815 name: "mytest",
5816 gtest: false,
5817 srcs: ["mytest.cpp"],
5818 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005819 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005820 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005821 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005822 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005823 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005824
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005825 cc_library {
5826 name: "mylib",
5827 srcs: ["mylib.cpp"],
5828 system_shared_libs: [],
5829 stl: "none",
5830 }
5831
Liz Kammer5bd365f2020-05-27 15:15:11 -07005832 filegroup {
5833 name: "fg2",
5834 srcs: [
5835 "testdata/baz"
5836 ],
5837 }
Roland Levillain630846d2019-06-26 12:48:34 +01005838 `)
5839
Jooyung Hana0503a52023-08-23 13:12:50 +09005840 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005841 copyCmds := apexRule.Args["copy_commands"]
5842
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005843 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005844 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005845 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005846
Liz Kammer1c14a212020-05-12 15:26:55 -07005847 //Ensure that test data are copied into apex.
5848 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5849 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5850
Roland Levillainf89cd092019-07-29 16:22:59 +01005851 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005852 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005853 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005854 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005855 prefix := "TARGET_"
5856 var builder strings.Builder
5857 data.Custom(&builder, name, prefix, "", data)
5858 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005859 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005860 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005861}
5862
Jooyung Hand48f3c32019-08-23 11:18:57 +09005863func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005864 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005865 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5866 apex {
5867 name: "myapex",
5868 key: "myapex.key",
5869 native_shared_libs: ["libfoo"],
5870 }
5871
5872 apex_key {
5873 name: "myapex.key",
5874 public_key: "testkey.avbpubkey",
5875 private_key: "testkey.pem",
5876 }
5877
5878 cc_library {
5879 name: "libfoo",
5880 stl: "none",
5881 system_shared_libs: [],
5882 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005883 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005884 }
5885 `)
5886 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5887 apex {
5888 name: "myapex",
5889 key: "myapex.key",
5890 java_libs: ["myjar"],
5891 }
5892
5893 apex_key {
5894 name: "myapex.key",
5895 public_key: "testkey.avbpubkey",
5896 private_key: "testkey.pem",
5897 }
5898
5899 java_library {
5900 name: "myjar",
5901 srcs: ["foo/bar/MyClass.java"],
5902 sdk_version: "none",
5903 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005904 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005905 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005906 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005907 }
5908 `)
5909}
5910
Bill Peckhama41a6962021-01-11 10:58:54 -08005911func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005912 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005913 apex {
5914 name: "myapex",
5915 key: "myapex.key",
5916 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005917 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005918 }
5919
5920 apex_key {
5921 name: "myapex.key",
5922 public_key: "testkey.avbpubkey",
5923 private_key: "testkey.pem",
5924 }
5925
5926 java_import {
5927 name: "myjavaimport",
5928 apex_available: ["myapex"],
5929 jars: ["my.jar"],
5930 compile_dex: true,
5931 }
5932 `)
5933
Jooyung Hana0503a52023-08-23 13:12:50 +09005934 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005935 apexRule := module.Rule("apexRule")
5936 copyCmds := apexRule.Args["copy_commands"]
5937 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5938}
5939
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005940func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005942 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005943 apex {
5944 name: "myapex",
5945 key: "myapex.key",
5946 apps: [
5947 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005948 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005949 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005950 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005951 }
5952
5953 apex_key {
5954 name: "myapex.key",
5955 public_key: "testkey.avbpubkey",
5956 private_key: "testkey.pem",
5957 }
5958
5959 android_app {
5960 name: "AppFoo",
5961 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005962 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005963 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005964 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005965 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005967 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005968 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005969
5970 android_app {
5971 name: "AppFooPriv",
5972 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005973 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005974 system_modules: "none",
5975 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005976 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005977 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005978 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005979 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005980
5981 cc_library_shared {
5982 name: "libjni",
5983 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005984 shared_libs: ["libfoo"],
5985 stl: "none",
5986 system_shared_libs: [],
5987 apex_available: [ "myapex" ],
5988 sdk_version: "current",
5989 }
5990
5991 cc_library_shared {
5992 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005993 stl: "none",
5994 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005995 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005996 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005998 `)
5999
Jooyung Hana0503a52023-08-23 13:12:50 +09006000 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006001 apexRule := module.Rule("apexRule")
6002 copyCmds := apexRule.Args["copy_commands"]
6003
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006004 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6005 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006006 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006007
Colin Crossaede88c2020-08-11 12:17:01 -07006008 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006009 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006010 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006011 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006012 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries including transitive deps are
6014 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006015 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006016 // ... embedded inside APK (jnilibs.zip)
6017 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6018 // ... and not directly inside the APEX
6019 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6020 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006021
6022 apexBundle := module.Module().(*apexBundle)
6023 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6024 var builder strings.Builder
6025 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6026 androidMk := builder.String()
6027 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6028 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6029 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6030 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6031 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6032 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006033}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006034
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006035func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006036 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006037 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6038 for _, id := range invalidBuildIds {
6039 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6040 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6041 variables.BuildId = proptools.StringPtr(id)
6042 })
6043 testApexError(t, message, `apex {
6044 name: "myapex",
6045 key: "myapex.key",
6046 apps: ["AppFooPrebuilt"],
6047 updatable: false,
6048 }
6049
6050 apex_key {
6051 name: "myapex.key",
6052 public_key: "testkey.avbpubkey",
6053 private_key: "testkey.pem",
6054 }
6055
6056 android_app_import {
6057 name: "AppFooPrebuilt",
6058 apk: "PrebuiltAppFoo.apk",
6059 presigned: true,
6060 apex_available: ["myapex"],
6061 }
6062 `, fixture)
6063 }
6064}
6065
Dario Frenicde2a032019-10-27 00:29:22 +01006066func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006067 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006068 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006069 apex {
6070 name: "myapex",
6071 key: "myapex.key",
6072 apps: [
6073 "AppFooPrebuilt",
6074 "AppFooPrivPrebuilt",
6075 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006076 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006077 }
6078
6079 apex_key {
6080 name: "myapex.key",
6081 public_key: "testkey.avbpubkey",
6082 private_key: "testkey.pem",
6083 }
6084
6085 android_app_import {
6086 name: "AppFooPrebuilt",
6087 apk: "PrebuiltAppFoo.apk",
6088 presigned: true,
6089 dex_preopt: {
6090 enabled: false,
6091 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006092 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006093 }
6094
6095 android_app_import {
6096 name: "AppFooPrivPrebuilt",
6097 apk: "PrebuiltAppFooPriv.apk",
6098 privileged: true,
6099 presigned: true,
6100 dex_preopt: {
6101 enabled: false,
6102 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006103 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006104 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006105 }
6106 `)
6107
Jooyung Hana0503a52023-08-23 13:12:50 +09006108 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006109 apexRule := module.Rule("apexRule")
6110 copyCmds := apexRule.Args["copy_commands"]
6111
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006112 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6113 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006114}
6115
6116func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006117 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006118 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 apps: [
6123 "AppFoo",
6124 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006125 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
6133
6134 android_app {
6135 name: "AppFoo",
6136 srcs: ["foo/bar/MyClass.java"],
6137 sdk_version: "none",
6138 system_modules: "none",
6139 apex_available: [ "myapex" ],
6140 }
6141
6142 android_app_import {
6143 name: "AppFoo",
6144 apk: "AppFooPrebuilt.apk",
6145 filename: "AppFooPrebuilt.apk",
6146 presigned: true,
6147 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006148 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006149 }
6150 `, withFiles(map[string][]byte{
6151 "AppFooPrebuilt.apk": nil,
6152 }))
6153
Jooyung Hana0503a52023-08-23 13:12:50 +09006154 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006155 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006156 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006157}
6158
Dario Freni6f3937c2019-12-20 22:58:03 +00006159func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006160 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006161 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006162 apex {
6163 name: "myapex",
6164 key: "myapex.key",
6165 apps: [
6166 "TesterHelpAppFoo",
6167 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 android_test_helper_app {
6178 name: "TesterHelpAppFoo",
6179 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006180 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006181 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006182 }
6183
6184 `)
6185
Jooyung Hana0503a52023-08-23 13:12:50 +09006186 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006187 apexRule := module.Rule("apexRule")
6188 copyCmds := apexRule.Args["copy_commands"]
6189
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006190 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191}
6192
Jooyung Han18020ea2019-11-13 10:50:48 +09006193func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006194 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006195 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006196 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 apex {
6211 name: "otherapex",
6212 key: "myapex.key",
6213 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006214 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006215 }
6216
6217 cc_defaults {
6218 name: "libfoo-defaults",
6219 apex_available: ["otherapex"],
6220 }
6221
6222 cc_library {
6223 name: "libfoo",
6224 defaults: ["libfoo-defaults"],
6225 stl: "none",
6226 system_shared_libs: [],
6227 }`)
6228}
6229
Paul Duffine52e66f2020-03-30 17:54:29 +01006230func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006231 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006232 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006233 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006234 apex {
6235 name: "myapex",
6236 key: "myapex.key",
6237 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006238 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006239 }
6240
6241 apex_key {
6242 name: "myapex.key",
6243 public_key: "testkey.avbpubkey",
6244 private_key: "testkey.pem",
6245 }
6246
6247 apex {
6248 name: "otherapex",
6249 key: "otherapex.key",
6250 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006251 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006252 }
6253
6254 apex_key {
6255 name: "otherapex.key",
6256 public_key: "testkey.avbpubkey",
6257 private_key: "testkey.pem",
6258 }
6259
6260 cc_library {
6261 name: "libfoo",
6262 stl: "none",
6263 system_shared_libs: [],
6264 apex_available: ["otherapex"],
6265 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006266
6267 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6268 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6269 testApex(t, `
6270 apex {
6271 name: "com.sdv.myapex",
6272 key: "myapex.key",
6273 native_shared_libs: ["libfoo"],
6274 updatable: false,
6275 product_specific: true,
6276 }
6277
6278 apex_key {
6279 name: "myapex.key",
6280 public_key: "testkey.avbpubkey",
6281 private_key: "testkey.pem",
6282 }
6283
6284 apex {
6285 name: "com.any.otherapex",
6286 key: "otherapex.key",
6287 native_shared_libs: ["libfoo"],
6288 updatable: false,
6289 }
6290
6291 apex_key {
6292 name: "otherapex.key",
6293 public_key: "testkey.avbpubkey",
6294 private_key: "testkey.pem",
6295 }
6296
6297 cc_library {
6298 name: "libfoo",
6299 stl: "none",
6300 system_shared_libs: [],
6301 apex_available: ["com.any.otherapex"],
6302 product_specific: true,
6303 }`,
6304 android.FixtureMergeMockFs(android.MockFS{
6305 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6306 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6307 }))
6308
6309 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6310 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6311 apex {
6312 name: "com.sdv.myapex",
6313 key: "myapex.key",
6314 native_shared_libs: ["libfoo"],
6315 updatable: false,
6316 }
6317
6318 apex_key {
6319 name: "myapex.key",
6320 public_key: "testkey.avbpubkey",
6321 private_key: "testkey.pem",
6322 }
6323
6324 apex {
6325 name: "com.any.otherapex",
6326 key: "otherapex.key",
6327 native_shared_libs: ["libfoo"],
6328 updatable: false,
6329 }
6330
6331 apex_key {
6332 name: "otherapex.key",
6333 public_key: "testkey.avbpubkey",
6334 private_key: "testkey.pem",
6335 }
6336
6337 cc_library {
6338 name: "libfoo",
6339 stl: "none",
6340 system_shared_libs: [],
6341 apex_available: ["com.any.otherapex"],
6342 }`,
6343 android.FixtureMergeMockFs(android.MockFS{
6344 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6345 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6346 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006347}
Jiyong Park127b40b2019-09-30 16:04:35 +09006348
Paul Duffine52e66f2020-03-30 17:54:29 +01006349func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006350 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006351 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006352 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006353.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006354.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006355.*via tag cc\.dependencyTag.*
6356.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006357.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006358.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006359.*via tag cc\.dependencyTag.*
6360.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006361.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006362.*-> libbaz.*link:shared.*
6363.*via tag cc\.dependencyTag.*
6364.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006365 apex {
6366 name: "myapex",
6367 key: "myapex.key",
6368 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006369 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006370 }
6371
6372 apex_key {
6373 name: "myapex.key",
6374 public_key: "testkey.avbpubkey",
6375 private_key: "testkey.pem",
6376 }
6377
Jiyong Park127b40b2019-09-30 16:04:35 +09006378 cc_library {
6379 name: "libfoo",
6380 stl: "none",
6381 shared_libs: ["libbar"],
6382 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006383 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006384 }
6385
6386 cc_library {
6387 name: "libbar",
6388 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006389 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006390 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006391 apex_available: ["myapex"],
6392 }
6393
6394 cc_library {
6395 name: "libbaz",
6396 stl: "none",
6397 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006398 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006399
6400 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6401 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6402 testApex(t, `
6403 apex {
6404 name: "com.sdv.myapex",
6405 key: "myapex.key",
6406 native_shared_libs: ["libfoo"],
6407 updatable: false,
6408 product_specific: true,
6409 }
6410
6411 apex_key {
6412 name: "myapex.key",
6413 public_key: "testkey.avbpubkey",
6414 private_key: "testkey.pem",
6415 }
6416
6417 cc_library {
6418 name: "libfoo",
6419 stl: "none",
6420 shared_libs: ["libbar"],
6421 system_shared_libs: [],
6422 apex_available: ["com.sdv.myapex"],
6423 product_specific: true,
6424 }
6425
6426 cc_library {
6427 name: "libbar",
6428 stl: "none",
6429 shared_libs: ["libbaz"],
6430 system_shared_libs: [],
6431 apex_available: ["com.sdv.myapex"],
6432 product_specific: true,
6433 }
6434
6435 cc_library {
6436 name: "libbaz",
6437 stl: "none",
6438 system_shared_libs: [],
6439 product_specific: true,
6440 }`,
6441 android.FixtureMergeMockFs(android.MockFS{
6442 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6443 }))
6444
6445 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6446 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6447 apex {
6448 name: "com.sdv.myapex",
6449 key: "myapex.key",
6450 native_shared_libs: ["libfoo"],
6451 updatable: false,
6452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 cc_library {
6461 name: "libfoo",
6462 stl: "none",
6463 shared_libs: ["libbar"],
6464 system_shared_libs: [],
6465 apex_available: ["com.sdv.myapex"],
6466 }
6467
6468 cc_library {
6469 name: "libbar",
6470 stl: "none",
6471 shared_libs: ["libbaz"],
6472 system_shared_libs: [],
6473 apex_available: ["com.sdv.myapex"],
6474 }
6475
6476 cc_library {
6477 name: "libbaz",
6478 stl: "none",
6479 system_shared_libs: [],
6480 }`,
6481 android.FixtureMergeMockFs(android.MockFS{
6482 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6483 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006484}
Jiyong Park127b40b2019-09-30 16:04:35 +09006485
Liz Kammer5f108fa2023-05-11 14:33:17 -04006486func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006487 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006488 testApex(t, `
6489 apex {
6490 name: "myapex",
6491 key: "myapex.key",
6492 native_shared_libs: ["libfoo"],
6493 updatable: false,
6494 }
6495
6496 apex_key {
6497 name: "myapex.key",
6498 public_key: "testkey.avbpubkey",
6499 private_key: "testkey.pem",
6500 }
6501
6502 cc_library {
6503 name: "libfoo",
6504 stl: "none",
6505 static_libs: ["libbar"],
6506 system_shared_libs: [],
6507 apex_available: ["myapex"],
6508 }
6509
6510 cc_library {
6511 name: "libbar",
6512 stl: "none",
6513 shared_libs: ["libbaz"],
6514 system_shared_libs: [],
6515 apex_available: ["myapex"],
6516 }
6517
6518 cc_library {
6519 name: "libbaz",
6520 stl: "none",
6521 system_shared_libs: [],
6522 }`)
6523
6524 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 native_shared_libs: ["libfoo"],
6529 updatable: false,
6530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537
6538 cc_library {
6539 name: "libfoo",
6540 stl: "none",
6541 static_libs: ["libbar"],
6542 system_shared_libs: [],
6543 apex_available: ["myapex"],
6544 }
6545
6546 cc_library {
6547 name: "libbar",
6548 stl: "none",
6549 system_shared_libs: [],
6550 }`)
6551}
6552
Paul Duffine52e66f2020-03-30 17:54:29 +01006553func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006554 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006555 testApexError(t, "\"otherapex\" is not a valid module name", `
6556 apex {
6557 name: "myapex",
6558 key: "myapex.key",
6559 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006560 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 }
6562
6563 apex_key {
6564 name: "myapex.key",
6565 public_key: "testkey.avbpubkey",
6566 private_key: "testkey.pem",
6567 }
6568
6569 cc_library {
6570 name: "libfoo",
6571 stl: "none",
6572 system_shared_libs: [],
6573 apex_available: ["otherapex"],
6574 }`)
6575
Paul Duffine52e66f2020-03-30 17:54:29 +01006576 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006577 apex {
6578 name: "myapex",
6579 key: "myapex.key",
6580 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006581 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006582 }
6583
6584 apex_key {
6585 name: "myapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
6590 cc_library {
6591 name: "libfoo",
6592 stl: "none",
6593 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006594 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006595 apex_available: ["myapex"],
6596 }
6597
6598 cc_library {
6599 name: "libbar",
6600 stl: "none",
6601 system_shared_libs: [],
6602 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006603 }
6604
6605 cc_library {
6606 name: "libbaz",
6607 stl: "none",
6608 system_shared_libs: [],
6609 stubs: {
6610 versions: ["10", "20", "30"],
6611 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006612 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006613}
Jiyong Park127b40b2019-09-30 16:04:35 +09006614
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006615func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006616 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006617 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006618 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006619 testApexError(t, "expected an integer between 0-9; got -1", `
6620 apex {
6621 name: "myapex",
6622 key: "myapex.key",
6623 apex_available_name: "com.android.foo",
6624 variant_version: "-1",
6625 updatable: false,
6626 }
6627 apex_key {
6628 name: "myapex.key",
6629 public_key: "testkey.avbpubkey",
6630 private_key: "testkey.pem",
6631 }
6632 `)
6633 })
6634
6635 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006636 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006637 testApexError(t, "expected an integer between 0-9; got 10", `
6638 apex {
6639 name: "myapex",
6640 key: "myapex.key",
6641 apex_available_name: "com.android.foo",
6642 variant_version: "10",
6643 updatable: false,
6644 }
6645 apex_key {
6646 name: "myapex.key",
6647 public_key: "testkey.avbpubkey",
6648 private_key: "testkey.pem",
6649 }
6650 `)
6651 })
6652}
6653
6654func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006655 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006656 context := android.GroupFixturePreparers(
6657 android.PrepareForIntegrationTestWithAndroid,
6658 PrepareForTestWithApexBuildComponents,
6659 android.FixtureMergeMockFs(android.MockFS{
6660 "system/sepolicy/apex/foo-file_contexts": nil,
6661 "system/sepolicy/apex/bar-file_contexts": nil,
6662 }),
6663 )
6664 result := context.RunTestWithBp(t, `
6665 apex {
6666 name: "foo",
6667 key: "myapex.key",
6668 apex_available_name: "com.android.foo",
6669 variant_version: "0",
6670 updatable: false,
6671 }
6672 apex {
6673 name: "bar",
6674 key: "myapex.key",
6675 apex_available_name: "com.android.foo",
6676 variant_version: "3",
6677 updatable: false,
6678 }
6679 apex_key {
6680 name: "myapex.key",
6681 public_key: "testkey.avbpubkey",
6682 private_key: "testkey.pem",
6683 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006684 override_apex {
6685 name: "myoverrideapex",
6686 base: "bar",
6687 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006688 `)
6689
Jooyung Hana0503a52023-08-23 13:12:50 +09006690 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006691 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006692 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6693 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6694 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6695 }
6696
Jooyung Hana0503a52023-08-23 13:12:50 +09006697 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006698 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006699 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6700 barActualDefaultVersion := barManifestRule.Args["default_version"]
6701 if barActualDefaultVersion != barExpectedDefaultVersion {
6702 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6703 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006704
Spandan Das50801e22024-05-13 18:29:45 +00006705 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006706 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6707 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6708 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6709 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006710}
6711
Sam Delmericoca816532023-06-02 14:09:50 -04006712func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006713 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006714 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006715 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006716 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6717 apex {
6718 name: "myapex_sminus",
6719 key: "myapex.key",
6720 apps: ["AppFoo"],
6721 apex_available_name: "myapex",
6722 updatable: false,
6723 }
6724 apex {
6725 name: "myapex",
6726 key: "myapex.key",
6727 apps: ["AppFoo"],
6728 updatable: false,
6729 }
6730 apex_key {
6731 name: "myapex.key",
6732 public_key: "testkey.avbpubkey",
6733 private_key: "testkey.pem",
6734 }
6735 android_app {
6736 name: "AppFoo",
6737 srcs: ["foo/bar/MyClass.java"],
6738 sdk_version: "none",
6739 system_modules: "none",
6740 apex_available: [ "myapex_sminus" ],
6741 }`,
6742 android.FixtureMergeMockFs(android.MockFS{
6743 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6744 }),
6745 )
6746 })
6747
6748 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006749 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006750 testApex(t, `
6751 apex {
6752 name: "myapex_sminus",
6753 key: "myapex.key",
6754 apps: ["AppFoo"],
6755 apex_available_name: "myapex",
6756 updatable: false,
6757 }
6758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 apps: ["AppFoo"],
6762 updatable: false,
6763 }
6764 apex_key {
6765 name: "myapex.key",
6766 public_key: "testkey.avbpubkey",
6767 private_key: "testkey.pem",
6768 }
6769 android_app {
6770 name: "AppFoo",
6771 srcs: ["foo/bar/MyClass.java"],
6772 sdk_version: "none",
6773 system_modules: "none",
6774 apex_available: [ "myapex" ],
6775 }`,
6776 android.FixtureMergeMockFs(android.MockFS{
6777 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6778 }),
6779 )
6780 })
6781
6782 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006783 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006784 testApex(t, `
6785 override_apex {
6786 name: "myoverrideapex_sminus",
6787 base: "myapex_sminus",
6788 key: "myapex.key",
6789 apps: ["AppFooOverride"],
6790 }
6791 override_apex {
6792 name: "myoverrideapex",
6793 base: "myapex",
6794 key: "myapex.key",
6795 apps: ["AppFooOverride"],
6796 }
6797 apex {
6798 name: "myapex_sminus",
6799 key: "myapex.key",
6800 apps: ["AppFoo"],
6801 apex_available_name: "myapex",
6802 updatable: false,
6803 }
6804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
6807 apps: ["AppFoo"],
6808 updatable: false,
6809 }
6810 apex_key {
6811 name: "myapex.key",
6812 public_key: "testkey.avbpubkey",
6813 private_key: "testkey.pem",
6814 }
6815 android_app {
6816 name: "AppFooOverride",
6817 srcs: ["foo/bar/MyClass.java"],
6818 sdk_version: "none",
6819 system_modules: "none",
6820 apex_available: [ "myapex" ],
6821 }
6822 android_app {
6823 name: "AppFoo",
6824 srcs: ["foo/bar/MyClass.java"],
6825 sdk_version: "none",
6826 system_modules: "none",
6827 apex_available: [ "myapex" ],
6828 }`,
6829 android.FixtureMergeMockFs(android.MockFS{
6830 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6831 }),
6832 )
6833 })
6834}
6835
6836func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006837 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006838 context := android.GroupFixturePreparers(
6839 android.PrepareForIntegrationTestWithAndroid,
6840 PrepareForTestWithApexBuildComponents,
6841 java.PrepareForTestWithDexpreopt,
6842 android.FixtureMergeMockFs(android.MockFS{
6843 "system/sepolicy/apex/myapex-file_contexts": nil,
6844 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6845 }),
6846 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6847 variables.BuildId = proptools.StringPtr("buildid")
6848 }),
6849 )
6850 context.RunTestWithBp(t, `
6851 override_apex {
6852 name: "myoverrideapex_sminus",
6853 base: "myapex_sminus",
6854 }
6855 override_apex {
6856 name: "myoverrideapex",
6857 base: "myapex",
6858 }
6859 apex {
6860 name: "myapex",
6861 key: "myapex.key",
6862 apps: ["AppFoo"],
6863 updatable: false,
6864 }
6865 apex {
6866 name: "myapex_sminus",
6867 apex_available_name: "myapex",
6868 key: "myapex.key",
6869 apps: ["AppFoo_sminus"],
6870 updatable: false,
6871 }
6872 apex_key {
6873 name: "myapex.key",
6874 public_key: "testkey.avbpubkey",
6875 private_key: "testkey.pem",
6876 }
6877 android_app {
6878 name: "AppFoo",
6879 srcs: ["foo/bar/MyClass.java"],
6880 sdk_version: "none",
6881 system_modules: "none",
6882 apex_available: [ "myapex" ],
6883 }
6884 android_app {
6885 name: "AppFoo_sminus",
6886 srcs: ["foo/bar/MyClass.java"],
6887 sdk_version: "none",
6888 min_sdk_version: "29",
6889 system_modules: "none",
6890 apex_available: [ "myapex" ],
6891 }`)
6892}
6893
Jiyong Park89e850a2020-04-07 16:37:39 +09006894func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006896 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006897 apex {
6898 name: "myapex",
6899 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006900 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006901 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006902 }
6903
6904 apex_key {
6905 name: "myapex.key",
6906 public_key: "testkey.avbpubkey",
6907 private_key: "testkey.pem",
6908 }
6909
6910 cc_library {
6911 name: "libfoo",
6912 stl: "none",
6913 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006914 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006915 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006916 }
6917
6918 cc_library {
6919 name: "libfoo2",
6920 stl: "none",
6921 system_shared_libs: [],
6922 shared_libs: ["libbaz"],
6923 apex_available: ["//apex_available:platform"],
6924 }
6925
6926 cc_library {
6927 name: "libbar",
6928 stl: "none",
6929 system_shared_libs: [],
6930 apex_available: ["myapex"],
6931 }
6932
6933 cc_library {
6934 name: "libbaz",
6935 stl: "none",
6936 system_shared_libs: [],
6937 apex_available: ["myapex"],
6938 stubs: {
6939 versions: ["1"],
6940 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006941 }`)
6942
Jiyong Park89e850a2020-04-07 16:37:39 +09006943 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6944 // because it depends on libbar which isn't available to platform
6945 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6946 if libfoo.NotAvailableForPlatform() != true {
6947 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6948 }
6949
6950 // libfoo2 however can be available to platform because it depends on libbaz which provides
6951 // stubs
6952 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6953 if libfoo2.NotAvailableForPlatform() == true {
6954 t.Errorf("%q should be available to platform", libfoo2.String())
6955 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006956}
Jiyong Parka90ca002019-10-07 15:47:24 +09006957
Paul Duffine52e66f2020-03-30 17:54:29 +01006958func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006959 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006960 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006961 apex {
6962 name: "myapex",
6963 key: "myapex.key",
6964 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006965 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006966 }
6967
6968 apex_key {
6969 name: "myapex.key",
6970 public_key: "testkey.avbpubkey",
6971 private_key: "testkey.pem",
6972 }
6973
6974 cc_library {
6975 name: "libfoo",
6976 stl: "none",
6977 system_shared_libs: [],
6978 apex_available: ["myapex"],
6979 static: {
6980 apex_available: ["//apex_available:platform"],
6981 },
6982 }`)
6983
Jiyong Park89e850a2020-04-07 16:37:39 +09006984 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6985 if libfooShared.NotAvailableForPlatform() != true {
6986 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6987 }
6988 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6989 if libfooStatic.NotAvailableForPlatform() != false {
6990 t.Errorf("%q should be available to platform", libfooStatic.String())
6991 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006992}
6993
Jooyung Han9a419e22024-08-16 17:14:21 +09006994func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006995 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006996
6997 for _, tc := range []struct {
6998 name string
6999 apexAvailable string
7000 expectedError string
7001 }{
7002 {
7003 name: "prefix matches correctly",
7004 apexAvailable: "com.foo.*",
7005 },
7006 {
7007 name: "prefix doesn't match",
7008 apexAvailable: "com.bar.*",
7009 expectedError: `Consider .* "com.foo\.\*"`,
7010 },
7011 {
7012 name: "short prefix",
7013 apexAvailable: "com.*",
7014 expectedError: "requires two or more components",
7015 },
7016 {
7017 name: "wildcard not in the end",
7018 apexAvailable: "com.*.foo",
7019 expectedError: "should end with .*",
7020 },
7021 {
7022 name: "wildcard in the middle",
7023 apexAvailable: "com.foo*.*",
7024 expectedError: "not allowed in the middle",
7025 },
7026 {
7027 name: "hint with prefix pattern",
7028 apexAvailable: "//apex_available:platform",
7029 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7030 },
7031 } {
7032 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007033 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007034 errorHandler := android.FixtureExpectsNoErrors
7035 if tc.expectedError != "" {
7036 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7037 }
7038 context := android.GroupFixturePreparers(
7039 prepareForApexTest,
7040 android.FixtureMergeMockFs(android.MockFS{
7041 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7042 }),
7043 ).ExtendWithErrorHandler(errorHandler)
7044
7045 context.RunTestWithBp(t, `
7046 apex {
7047 name: "com.foo.bar",
7048 key: "myapex.key",
7049 native_shared_libs: ["libfoo"],
7050 updatable: false,
7051 }
7052
7053 apex_key {
7054 name: "myapex.key",
7055 public_key: "testkey.avbpubkey",
7056 private_key: "testkey.pem",
7057 }
7058
7059 cc_library {
7060 name: "libfoo",
7061 stl: "none",
7062 system_shared_libs: [],
7063 apex_available: ["`+tc.apexAvailable+`"],
7064 }`)
7065 })
7066 }
7067 testApexError(t, `Consider adding "com.foo" to`, `
7068 apex {
7069 name: "com.foo", // too short for a partner apex
7070 key: "myapex.key",
7071 native_shared_libs: ["libfoo"],
7072 updatable: false,
7073 }
7074
7075 apex_key {
7076 name: "myapex.key",
7077 public_key: "testkey.avbpubkey",
7078 private_key: "testkey.pem",
7079 }
7080
7081 cc_library {
7082 name: "libfoo",
7083 stl: "none",
7084 system_shared_libs: [],
7085 }
7086 `)
7087}
7088
Jooyung Hanb9518072024-11-22 14:05:20 +09007089func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7090 t.Parallel()
7091 ctx := testApex(t, `
7092 apex_test {
7093 name: "myapex",
7094 key: "myapex.key",
7095 skip_validations: {
7096 host_apex_verifier: true,
7097 },
7098 updatable: false,
7099 }
7100 apex_key {
7101 name: "myapex.key",
7102 public_key: "testkey.avbpubkey",
7103 private_key: "testkey.pem",
7104 }
7105 `)
7106
7107 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7108 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7109 t.Error("should not run host_apex_verifier")
7110 }
7111}
7112
7113func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7114 t.Parallel()
7115 ctx := testApex(t, `
7116 apex_test {
7117 name: "myapex",
7118 key: "myapex.key",
7119 updatable: false,
7120 }
7121 apex_key {
7122 name: "myapex.key",
7123 public_key: "testkey.avbpubkey",
7124 private_key: "testkey.pem",
7125 }
7126 `)
7127
7128 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7129 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7130 t.Error("should run host_apex_verifier")
7131 }
7132}
7133
Jiyong Park5d790c32019-11-15 18:40:32 +09007134func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007135 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007136 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007137 apex {
7138 name: "myapex",
7139 key: "myapex.key",
7140 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007141 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007142 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007143 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007144 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007145 }
7146
7147 override_apex {
7148 name: "override_myapex",
7149 base: "myapex",
7150 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007151 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007152 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007153 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007154 compile_multilib: "first",
7155 multilib: {
7156 lib32: {
7157 native_shared_libs: ["mylib32"],
7158 },
7159 lib64: {
7160 native_shared_libs: ["mylib64"],
7161 },
7162 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007163 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007164 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007165 key: "mynewapex.key",
7166 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007167 }
7168
7169 apex_key {
7170 name: "myapex.key",
7171 public_key: "testkey.avbpubkey",
7172 private_key: "testkey.pem",
7173 }
7174
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007175 apex_key {
7176 name: "mynewapex.key",
7177 public_key: "testkey2.avbpubkey",
7178 private_key: "testkey2.pem",
7179 }
7180
7181 android_app_certificate {
7182 name: "myapex.certificate",
7183 certificate: "testkey",
7184 }
7185
Jiyong Park5d790c32019-11-15 18:40:32 +09007186 android_app {
7187 name: "app",
7188 srcs: ["foo/bar/MyClass.java"],
7189 package_name: "foo",
7190 sdk_version: "none",
7191 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007192 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007193 }
7194
7195 override_android_app {
7196 name: "override_app",
7197 base: "app",
7198 package_name: "bar",
7199 }
markchien7c803b82021-08-26 22:10:06 +08007200
7201 bpf {
7202 name: "bpf",
7203 srcs: ["bpf.c"],
7204 }
7205
7206 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007207 name: "overrideBpf",
7208 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007209 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007210
7211 prebuilt_etc {
7212 name: "myetc",
7213 src: "myprebuilt",
7214 }
7215
7216 prebuilt_etc {
7217 name: "override_myetc",
7218 src: "override_myprebuilt",
7219 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007220
7221 cc_library {
7222 name: "mylib32",
7223 apex_available: [ "myapex" ],
7224 }
7225
7226 cc_library {
7227 name: "mylib64",
7228 apex_available: [ "myapex" ],
7229 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007230 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007231
Jooyung Hana0503a52023-08-23 13:12:50 +09007232 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007233 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007234 if originalVariant.GetOverriddenBy() != "" {
7235 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7236 }
7237 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7238 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7239 }
7240
Spandan Das50801e22024-05-13 18:29:45 +00007241 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007242 apexRule := module.Rule("apexRule")
7243 copyCmds := apexRule.Args["copy_commands"]
7244
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007245 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7246 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007247
markchien7c803b82021-08-26 22:10:06 +08007248 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007249 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007250
Daniel Norman5a3ce132021-08-26 15:44:43 -07007251 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7252 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7253
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007254 apexBundle := module.Module().(*apexBundle)
7255 name := apexBundle.Name()
7256 if name != "override_myapex" {
7257 t.Errorf("name should be \"override_myapex\", but was %q", name)
7258 }
7259
Baligh Uddin004d7172020-02-19 21:29:28 -08007260 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7261 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7262 }
7263
Jiyong Park20bacab2020-03-03 11:45:41 +09007264 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007265 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007266 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7267
7268 signApkRule := module.Rule("signapk")
7269 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007270
Colin Crossaa255532020-07-03 13:18:24 -07007271 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007272 var builder strings.Builder
7273 data.Custom(&builder, name, "TARGET_", "", data)
7274 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007275 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7276 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007277 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007278 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007279 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007280 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007281 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007282 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007283}
7284
Albert Martineefabcf2022-03-21 20:11:16 +00007285func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007286 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007287 // Override from 29 to 31
7288 minSdkOverride31 := "31"
7289 ctx := testApex(t, `
7290 apex {
7291 name: "myapex",
7292 key: "myapex.key",
7293 native_shared_libs: ["mylib"],
7294 updatable: true,
7295 min_sdk_version: "29"
7296 }
7297
7298 override_apex {
7299 name: "override_myapex",
7300 base: "myapex",
7301 logging_parent: "com.foo.bar",
7302 package_name: "test.overridden.package"
7303 }
7304
7305 apex_key {
7306 name: "myapex.key",
7307 public_key: "testkey.avbpubkey",
7308 private_key: "testkey.pem",
7309 }
7310
7311 cc_library {
7312 name: "mylib",
7313 srcs: ["mylib.cpp"],
7314 runtime_libs: ["libbar"],
7315 system_shared_libs: [],
7316 stl: "none",
7317 apex_available: [ "myapex" ],
7318 min_sdk_version: "apex_inherit"
7319 }
7320
7321 cc_library {
7322 name: "libbar",
7323 srcs: ["mylib.cpp"],
7324 system_shared_libs: [],
7325 stl: "none",
7326 apex_available: [ "myapex" ],
7327 min_sdk_version: "apex_inherit"
7328 }
7329
7330 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7331
Jooyung Hana0503a52023-08-23 13:12:50 +09007332 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007333 copyCmds := apexRule.Args["copy_commands"]
7334
7335 // Ensure that direct non-stubs dep is always included
7336 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7337
7338 // Ensure that runtime_libs dep in included
7339 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7340
7341 // Ensure libraries target overridden min_sdk_version value
7342 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7343}
7344
7345func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007346 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007347 // Attempt to override from 31 to 29, should be a NOOP
7348 minSdkOverride29 := "29"
7349 ctx := testApex(t, `
7350 apex {
7351 name: "myapex",
7352 key: "myapex.key",
7353 native_shared_libs: ["mylib"],
7354 updatable: true,
7355 min_sdk_version: "31"
7356 }
7357
7358 override_apex {
7359 name: "override_myapex",
7360 base: "myapex",
7361 logging_parent: "com.foo.bar",
7362 package_name: "test.overridden.package"
7363 }
7364
7365 apex_key {
7366 name: "myapex.key",
7367 public_key: "testkey.avbpubkey",
7368 private_key: "testkey.pem",
7369 }
7370
7371 cc_library {
7372 name: "mylib",
7373 srcs: ["mylib.cpp"],
7374 runtime_libs: ["libbar"],
7375 system_shared_libs: [],
7376 stl: "none",
7377 apex_available: [ "myapex" ],
7378 min_sdk_version: "apex_inherit"
7379 }
7380
7381 cc_library {
7382 name: "libbar",
7383 srcs: ["mylib.cpp"],
7384 system_shared_libs: [],
7385 stl: "none",
7386 apex_available: [ "myapex" ],
7387 min_sdk_version: "apex_inherit"
7388 }
7389
7390 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7391
Jooyung Hana0503a52023-08-23 13:12:50 +09007392 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007393 copyCmds := apexRule.Args["copy_commands"]
7394
7395 // Ensure that direct non-stubs dep is always included
7396 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7397
7398 // Ensure that runtime_libs dep in included
7399 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7400
7401 // Ensure libraries target the original min_sdk_version value rather than the overridden
7402 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7403}
7404
Jooyung Han214bf372019-11-12 13:03:50 +09007405func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007406 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007407 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007408 apex {
7409 name: "myapex",
7410 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007411 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007412 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007413 }
7414
7415 apex_key {
7416 name: "myapex.key",
7417 public_key: "testkey.avbpubkey",
7418 private_key: "testkey.pem",
7419 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007420
7421 cc_library {
7422 name: "mylib",
7423 srcs: ["mylib.cpp"],
7424 stl: "libc++",
7425 system_shared_libs: [],
7426 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007427 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007428 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007429 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007430
Jooyung Hana0503a52023-08-23 13:12:50 +09007431 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007432 args := module.Rule("apexRule").Args
7433 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007434
7435 // The copies of the libraries in the apex should have one more dependency than
7436 // the ones outside the apex, namely the unwinder. Ideally we should check
7437 // the dependency names directly here but for some reason the names are blank in
7438 // this test.
7439 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007440 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007441 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7442 if len(apexImplicits) != len(nonApexImplicits)+1 {
7443 t.Errorf("%q missing unwinder dep", lib)
7444 }
7445 }
Jooyung Han214bf372019-11-12 13:03:50 +09007446}
7447
Paul Duffine05480a2021-03-08 15:07:14 +00007448var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007449 "api/current.txt": nil,
7450 "api/removed.txt": nil,
7451 "api/system-current.txt": nil,
7452 "api/system-removed.txt": nil,
7453 "api/test-current.txt": nil,
7454 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007455
Anton Hanssondff2c782020-12-21 17:10:01 +00007456 "100/public/api/foo.txt": nil,
7457 "100/public/api/foo-removed.txt": nil,
7458 "100/system/api/foo.txt": nil,
7459 "100/system/api/foo-removed.txt": nil,
7460
Paul Duffineedc5d52020-06-12 17:46:39 +01007461 // For java_sdk_library_import
7462 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007463}
7464
Jooyung Han58f26ab2019-12-18 15:34:32 +09007465func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007466 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007467 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007468 apex {
7469 name: "myapex",
7470 key: "myapex.key",
7471 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007472 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007473 }
7474
7475 apex_key {
7476 name: "myapex.key",
7477 public_key: "testkey.avbpubkey",
7478 private_key: "testkey.pem",
7479 }
7480
7481 java_sdk_library {
7482 name: "foo",
7483 srcs: ["a.java"],
7484 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007485 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007486 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007487
7488 prebuilt_apis {
7489 name: "sdk",
7490 api_dirs: ["100"],
7491 }
Paul Duffin9b879592020-05-26 13:21:35 +01007492 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007493
7494 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007495 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007496 "javalib/foo.jar",
7497 "etc/permissions/foo.xml",
7498 })
7499 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007500 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7501 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7502 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007503}
7504
Spandan Das3ee19692024-06-19 04:47:40 +00007505func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007506 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007507 ctx := testApex(t, `
7508 override_apex {
7509 name: "mycompanyapex",
7510 base: "myapex",
7511 }
7512 apex {
7513 name: "myapex",
7514 key: "myapex.key",
7515 java_libs: ["foo"],
7516 updatable: false,
7517 }
7518
7519 apex_key {
7520 name: "myapex.key",
7521 public_key: "testkey.avbpubkey",
7522 private_key: "testkey.pem",
7523 }
7524
7525 java_sdk_library {
7526 name: "foo",
7527 srcs: ["a.java"],
7528 api_packages: ["foo"],
7529 apex_available: [ "myapex" ],
7530 }
7531
7532 prebuilt_apis {
7533 name: "sdk",
7534 api_dirs: ["100"],
7535 }
7536 `, withFiles(filesForSdkLibrary))
7537
7538 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7539 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7540 // (com.android.foo), the filepath should not contain override apex name.
7541 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7542 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7543 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7544}
7545
Paul Duffin9b879592020-05-26 13:21:35 +01007546func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007547 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007548 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007549 apex {
7550 name: "myapex",
7551 key: "myapex.key",
7552 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007553 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007554 }
7555
7556 apex_key {
7557 name: "myapex.key",
7558 public_key: "testkey.avbpubkey",
7559 private_key: "testkey.pem",
7560 }
7561
7562 java_sdk_library {
7563 name: "foo",
7564 srcs: ["a.java"],
7565 api_packages: ["foo"],
7566 apex_available: ["myapex"],
7567 sdk_version: "none",
7568 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007569 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007570 }
7571
7572 java_library {
7573 name: "bar",
7574 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007575 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007576 apex_available: ["myapex"],
7577 sdk_version: "none",
7578 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007579 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007580 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007581
7582 prebuilt_apis {
7583 name: "sdk",
7584 api_dirs: ["100"],
7585 }
Paul Duffin9b879592020-05-26 13:21:35 +01007586 `, withFiles(filesForSdkLibrary))
7587
7588 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007589 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007590 "javalib/bar.jar",
7591 "javalib/foo.jar",
7592 "etc/permissions/foo.xml",
7593 })
7594
7595 // The bar library should depend on the implementation jar.
7596 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007597 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007598 t.Errorf("expected %q, found %#q", expected, actual)
7599 }
7600}
7601
7602func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007603 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007604 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007605 apex {
7606 name: "myapex",
7607 key: "myapex.key",
7608 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007609 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007610 }
7611
7612 apex_key {
7613 name: "myapex.key",
7614 public_key: "testkey.avbpubkey",
7615 private_key: "testkey.pem",
7616 }
7617
7618 java_sdk_library {
7619 name: "foo",
7620 srcs: ["a.java"],
7621 api_packages: ["foo"],
7622 apex_available: ["myapex"],
7623 sdk_version: "none",
7624 system_modules: "none",
7625 }
7626
7627 java_library {
7628 name: "bar",
7629 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007630 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007631 sdk_version: "none",
7632 system_modules: "none",
7633 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007634
7635 prebuilt_apis {
7636 name: "sdk",
7637 api_dirs: ["100"],
7638 }
Paul Duffin9b879592020-05-26 13:21:35 +01007639 `, withFiles(filesForSdkLibrary))
7640
7641 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007642 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007643 "javalib/foo.jar",
7644 "etc/permissions/foo.xml",
7645 })
7646
7647 // The bar library should depend on the stubs jar.
7648 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007649 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007650 t.Errorf("expected %q, found %#q", expected, actual)
7651 }
7652}
7653
Paul Duffineedc5d52020-06-12 17:46:39 +01007654func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007655 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007656 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007657 prebuilt_apis {
7658 name: "sdk",
7659 api_dirs: ["100"],
7660 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007661 withFiles(map[string][]byte{
7662 "apex/a.java": nil,
7663 "apex/apex_manifest.json": nil,
7664 "apex/Android.bp": []byte(`
7665 package {
7666 default_visibility: ["//visibility:private"],
7667 }
7668
7669 apex {
7670 name: "myapex",
7671 key: "myapex.key",
7672 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007673 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007674 }
7675
7676 apex_key {
7677 name: "myapex.key",
7678 public_key: "testkey.avbpubkey",
7679 private_key: "testkey.pem",
7680 }
7681
7682 java_library {
7683 name: "bar",
7684 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007685 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007686 apex_available: ["myapex"],
7687 sdk_version: "none",
7688 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007689 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 }
7691`),
7692 "source/a.java": nil,
7693 "source/api/current.txt": nil,
7694 "source/api/removed.txt": nil,
7695 "source/Android.bp": []byte(`
7696 package {
7697 default_visibility: ["//visibility:private"],
7698 }
7699
7700 java_sdk_library {
7701 name: "foo",
7702 visibility: ["//apex"],
7703 srcs: ["a.java"],
7704 api_packages: ["foo"],
7705 apex_available: ["myapex"],
7706 sdk_version: "none",
7707 system_modules: "none",
7708 public: {
7709 enabled: true,
7710 },
Colin Crosse4f34882024-11-14 12:26:00 -08007711 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007712 }
7713`),
7714 "prebuilt/a.jar": nil,
7715 "prebuilt/Android.bp": []byte(`
7716 package {
7717 default_visibility: ["//visibility:private"],
7718 }
7719
7720 java_sdk_library_import {
7721 name: "foo",
7722 visibility: ["//apex", "//source"],
7723 apex_available: ["myapex"],
7724 prefer: true,
7725 public: {
7726 jars: ["a.jar"],
7727 },
Colin Crosse4f34882024-11-14 12:26:00 -08007728 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007729 }
7730`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007731 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007732 )
7733
7734 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007735 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007736 "javalib/bar.jar",
7737 "javalib/foo.jar",
7738 "etc/permissions/foo.xml",
7739 })
7740
7741 // The bar library should depend on the implementation jar.
7742 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007743 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007744 t.Errorf("expected %q, found %#q", expected, actual)
7745 }
7746}
7747
7748func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007749 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007750 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7751 apex {
7752 name: "myapex",
7753 key: "myapex.key",
7754 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007755 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007756 }
7757
7758 apex_key {
7759 name: "myapex.key",
7760 public_key: "testkey.avbpubkey",
7761 private_key: "testkey.pem",
7762 }
7763
7764 java_sdk_library_import {
7765 name: "foo",
7766 apex_available: ["myapex"],
7767 prefer: true,
7768 public: {
7769 jars: ["a.jar"],
7770 },
7771 }
7772
7773 `, withFiles(filesForSdkLibrary))
7774}
7775
atrost6e126252020-01-27 17:01:16 +00007776func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007777 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007778 result := android.GroupFixturePreparers(
7779 prepareForApexTest,
7780 java.PrepareForTestWithPlatformCompatConfig,
7781 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007782 apex {
7783 name: "myapex",
7784 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007785 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007786 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 platform_compat_config {
7797 name: "myjar-platform-compat-config",
7798 src: ":myjar",
7799 }
7800
7801 java_library {
7802 name: "myjar",
7803 srcs: ["foo/bar/MyClass.java"],
7804 sdk_version: "none",
7805 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007806 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007807 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007808 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007809
7810 // Make sure that a preferred prebuilt does not affect the apex contents.
7811 prebuilt_platform_compat_config {
7812 name: "myjar-platform-compat-config",
7813 metadata: "compat-config/metadata.xml",
7814 prefer: true,
7815 }
atrost6e126252020-01-27 17:01:16 +00007816 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007817 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007818 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007819 "etc/compatconfig/myjar-platform-compat-config.xml",
7820 "javalib/myjar.jar",
7821 })
7822}
7823
Jooyung Han862c0d62022-12-21 10:15:37 +09007824func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007825 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007826 android.GroupFixturePreparers(
7827 android.PrepareForTestWithAndroidBuildComponents,
7828 PrepareForTestWithApexBuildComponents,
7829 prepareForTestWithMyapex,
7830 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7831 ).
7832 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7833 RunTestWithBp(t, `
7834 apex {
7835 name: "myapex",
7836 key: "myapex.key",
7837 prebuilts: ["foo", "bar"],
7838 updatable: false,
7839 }
7840
7841 apex_key {
7842 name: "myapex.key",
7843 public_key: "testkey.avbpubkey",
7844 private_key: "testkey.pem",
7845 }
7846
7847 prebuilt_etc {
7848 name: "foo",
7849 src: "myprebuilt",
7850 filename_from_src: true,
7851 }
7852
7853 prebuilt_etc {
7854 name: "bar",
7855 src: "myprebuilt",
7856 filename_from_src: true,
7857 }
7858 `)
7859}
7860
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007861func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007862 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007863 bp := `
7864 apex {
7865 name: "myapex",
7866 key: "myapex.key",
7867 native_shared_libs: ["libfoo"],
7868 updatable: false,
7869 unwanted_transitive_deps: ["libbar"],
7870 }
7871
7872 apex_key {
7873 name: "myapex.key",
7874 public_key: "testkey.avbpubkey",
7875 private_key: "testkey.pem",
7876 }
7877
7878 cc_library {
7879 name: "libfoo",
7880 srcs: ["foo.cpp"],
7881 shared_libs: ["libbar"],
7882 apex_available: ["myapex"],
7883 }
7884
7885 cc_library {
7886 name: "libbar",
7887 srcs: ["bar.cpp"],
7888 apex_available: ["myapex"],
7889 }`
7890 ctx := testApex(t, bp)
7891 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7892 "*/libc++.so",
7893 "*/libfoo.so",
7894 // not libbar.so
7895 })
7896}
7897
Jiyong Park479321d2019-12-16 11:47:12 +09007898func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007899 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007900 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7901 apex {
7902 name: "myapex",
7903 key: "myapex.key",
7904 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007905 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007906 }
7907
7908 apex_key {
7909 name: "myapex.key",
7910 public_key: "testkey.avbpubkey",
7911 private_key: "testkey.pem",
7912 }
7913
7914 java_library {
7915 name: "myjar",
7916 srcs: ["foo/bar/MyClass.java"],
7917 sdk_version: "none",
7918 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007919 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007920 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007921 }
7922 `)
7923}
7924
Jiyong Park7cd10e32020-01-14 09:22:18 +09007925func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007926 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007927 bp := `
7928 apex {
7929 name: "myapex",
7930 key: "myapex.key",
7931 native_shared_libs: ["mylib"],
7932 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007933 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007934 }
7935
Jiyong Park9d677202020-02-19 16:29:35 +09007936 apex {
7937 name: "myapex.updatable",
7938 key: "myapex.key",
7939 native_shared_libs: ["mylib"],
7940 java_libs: ["myjar"],
7941 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007942 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007943 }
7944
Jiyong Park7cd10e32020-01-14 09:22:18 +09007945 apex_key {
7946 name: "myapex.key",
7947 public_key: "testkey.avbpubkey",
7948 private_key: "testkey.pem",
7949 }
7950
7951 cc_library {
7952 name: "mylib",
7953 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007954 shared_libs: [
7955 "myotherlib",
7956 "myotherlib_ext",
7957 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007958 system_shared_libs: [],
7959 stl: "none",
7960 apex_available: [
7961 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007962 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007963 "//apex_available:platform",
7964 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007965 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007966 }
7967
7968 cc_library {
7969 name: "myotherlib",
7970 srcs: ["mylib.cpp"],
7971 system_shared_libs: [],
7972 stl: "none",
7973 apex_available: [
7974 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007975 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007976 "//apex_available:platform",
7977 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007978 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007979 }
7980
Jiyong Parkce243632023-02-17 18:22:25 +09007981 cc_library {
7982 name: "myotherlib_ext",
7983 srcs: ["mylib.cpp"],
7984 system_shared_libs: [],
7985 system_ext_specific: true,
7986 stl: "none",
7987 apex_available: [
7988 "myapex",
7989 "myapex.updatable",
7990 "//apex_available:platform",
7991 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007992 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007993 }
7994
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 java_library {
7996 name: "myjar",
7997 srcs: ["foo/bar/MyClass.java"],
7998 sdk_version: "none",
7999 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008000 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008001 apex_available: [
8002 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008003 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008004 "//apex_available:platform",
8005 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008006 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008007 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008008 }
8009
8010 java_library {
8011 name: "myotherjar",
8012 srcs: ["foo/bar/MyClass.java"],
8013 sdk_version: "none",
8014 system_modules: "none",
8015 apex_available: [
8016 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008017 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008018 "//apex_available:platform",
8019 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008020 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008021 }
8022 `
8023
8024 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8025 for _, f := range files {
8026 if f.path == file {
8027 if f.isLink {
8028 t.Errorf("%q is not a real file", file)
8029 }
8030 return
8031 }
8032 }
8033 t.Errorf("%q is not found", file)
8034 }
8035
Jiyong Parkce243632023-02-17 18:22:25 +09008036 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008037 for _, f := range files {
8038 if f.path == file {
8039 if !f.isLink {
8040 t.Errorf("%q is not a symlink", file)
8041 }
Jiyong Parkce243632023-02-17 18:22:25 +09008042 if f.src != target {
8043 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8044 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008045 return
8046 }
8047 }
8048 t.Errorf("%q is not found", file)
8049 }
8050
Jiyong Park9d677202020-02-19 16:29:35 +09008051 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8052 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008053 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008054 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008055 ensureRealfileExists(t, files, "javalib/myjar.jar")
8056 ensureRealfileExists(t, files, "lib64/mylib.so")
8057 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008058 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008059
Jooyung Hana0503a52023-08-23 13:12:50 +09008060 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008061 ensureRealfileExists(t, files, "javalib/myjar.jar")
8062 ensureRealfileExists(t, files, "lib64/mylib.so")
8063 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008064 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008065
8066 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008067 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008068 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008069 ensureRealfileExists(t, files, "javalib/myjar.jar")
8070 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008071 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8072 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008073
Jooyung Hana0503a52023-08-23 13:12:50 +09008074 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008075 ensureRealfileExists(t, files, "javalib/myjar.jar")
8076 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008077 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8078 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008079}
8080
Yo Chiange8128052020-07-23 20:09:18 +08008081func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008082 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008083 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008084 apex {
8085 name: "myapex",
8086 key: "myapex.key",
8087 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008088 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008089 }
8090
8091 apex_key {
8092 name: "myapex.key",
8093 public_key: "testkey.avbpubkey",
8094 private_key: "testkey.pem",
8095 }
8096
8097 cc_library_shared {
8098 name: "mylib",
8099 srcs: ["mylib.cpp"],
8100 shared_libs: ["myotherlib"],
8101 system_shared_libs: [],
8102 stl: "none",
8103 apex_available: [
8104 "myapex",
8105 "//apex_available:platform",
8106 ],
8107 }
8108
8109 cc_prebuilt_library_shared {
8110 name: "myotherlib",
8111 srcs: ["prebuilt.so"],
8112 system_shared_libs: [],
8113 stl: "none",
8114 apex_available: [
8115 "myapex",
8116 "//apex_available:platform",
8117 ],
8118 }
8119 `)
8120
Jooyung Hana0503a52023-08-23 13:12:50 +09008121 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008122 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008123 var builder strings.Builder
8124 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8125 androidMk := builder.String()
8126 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008127 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008128 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8129 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8130 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008131 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008132}
8133
Jooyung Han643adc42020-02-27 13:50:06 +09008134func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008135 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008136 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008137 apex {
8138 name: "myapex",
8139 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008140 binaries: ["mybin"],
8141 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008142 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008143 }
8144
8145 apex_key {
8146 name: "myapex.key",
8147 public_key: "testkey.avbpubkey",
8148 private_key: "testkey.pem",
8149 }
8150
8151 cc_library {
8152 name: "mylib",
8153 srcs: ["mylib.cpp"],
8154 shared_libs: ["mylib2"],
8155 system_shared_libs: [],
8156 stl: "none",
8157 apex_available: [ "myapex" ],
8158 }
8159
8160 cc_library {
8161 name: "mylib2",
8162 srcs: ["mylib.cpp"],
8163 system_shared_libs: [],
8164 stl: "none",
8165 apex_available: [ "myapex" ],
8166 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008167
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008168 // Used as both a JNI library and a regular shared library.
8169 cc_library {
8170 name: "mylib3",
8171 srcs: ["mylib.cpp"],
8172 system_shared_libs: [],
8173 stl: "none",
8174 apex_available: [ "myapex" ],
8175 }
8176
8177 cc_binary {
8178 name: "mybin",
8179 srcs: ["mybin.cpp"],
8180 shared_libs: ["mylib3"],
8181 system_shared_libs: [],
8182 stl: "none",
8183 apex_available: [ "myapex" ],
8184 }
8185
Jiyong Park34d5c332022-02-24 18:02:44 +09008186 rust_ffi_shared {
8187 name: "libfoo.rust",
8188 crate_name: "foo",
8189 srcs: ["foo.rs"],
8190 shared_libs: ["libfoo.shared_from_rust"],
8191 prefer_rlib: true,
8192 apex_available: ["myapex"],
8193 }
8194
8195 cc_library_shared {
8196 name: "libfoo.shared_from_rust",
8197 srcs: ["mylib.cpp"],
8198 system_shared_libs: [],
8199 stl: "none",
8200 stubs: {
8201 versions: ["10", "11", "12"],
8202 },
8203 }
8204
Jooyung Han643adc42020-02-27 13:50:06 +09008205 `)
8206
Jooyung Hana0503a52023-08-23 13:12:50 +09008207 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008208 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008209 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008210 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008211 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008212 "lib64/mylib.so",
8213 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008214 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008215 "lib64/libfoo.rust.so",
8216 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8217 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008218 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008219
8220 // b/220397949
8221 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008222}
8223
Jooyung Han49f67012020-04-17 13:43:10 +09008224func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008225 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008226 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008227 apex {
8228 name: "myapex",
8229 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008230 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008231 }
8232 apex_key {
8233 name: "myapex.key",
8234 public_key: "testkey.avbpubkey",
8235 private_key: "testkey.pem",
8236 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008237 `,
8238 android.FixtureModifyConfig(func(config android.Config) {
8239 delete(config.Targets, android.Android)
8240 config.AndroidCommonTarget = android.Target{}
8241 }),
8242 )
Jooyung Han49f67012020-04-17 13:43:10 +09008243
8244 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8245 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8246 }
8247}
8248
Jiyong Parkbd159612020-02-28 15:22:21 +09008249func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008250 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008251 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008252 apex {
8253 name: "myapex",
8254 key: "myapex.key",
8255 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008256 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008257 }
8258
8259 apex_key {
8260 name: "myapex.key",
8261 public_key: "testkey.avbpubkey",
8262 private_key: "testkey.pem",
8263 }
8264
8265 android_app {
8266 name: "AppFoo",
8267 srcs: ["foo/bar/MyClass.java"],
8268 sdk_version: "none",
8269 system_modules: "none",
8270 apex_available: [ "myapex" ],
8271 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008272 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008273
Jooyung Hana0503a52023-08-23 13:12:50 +09008274 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008275 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008276
8277 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008278 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 +09008279}
8280
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008281func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008282 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008283 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008284 apex {
8285 name: "myapex",
8286 key: "myapex.key",
8287 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008288 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008289 }
8290
8291 apex_key {
8292 name: "myapex.key",
8293 public_key: "testkey.avbpubkey",
8294 private_key: "testkey.pem",
8295 }
8296
8297 android_app_set {
8298 name: "AppSet",
8299 set: "AppSet.apks",
8300 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008301 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008302 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008303 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008304 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8305 s := mod.Rule("apexRule").Args["copy_commands"]
8306 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008307 if len(copyCmds) != 4 {
8308 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008309 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008310 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8311 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008312 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8313 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008314
8315 // Ensure that canned_fs_config has an entry for the app set zip file
8316 generateFsRule := mod.Rule("generateFsConfig")
8317 cmd := generateFsRule.RuleParams.Command
8318 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008319}
8320
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008321func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008322 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008323 apex_set {
8324 name: "myapex",
8325 filename: "foo_v2.apex",
8326 sanitized: {
8327 none: { set: "myapex.apks", },
8328 hwaddress: { set: "myapex.hwasan.apks", },
8329 },
Paul Duffin24704672021-04-06 16:09:30 +01008330 }
8331 `
8332 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008333
Paul Duffin24704672021-04-06 16:09:30 +01008334 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008335 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008336
Spandan Das9d6e2092024-09-21 02:50:00 +00008337 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008338 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008339
Paul Duffin24704672021-04-06 16:09:30 +01008340 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8341
8342 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008343 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8344 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008345
8346 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008347}
8348
Pranav Guptaeba03b02022-09-27 00:27:08 +00008349func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008350 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008351 ctx := testApex(t, `
8352 apex_set {
8353 name: "myapex",
8354 set: ":myapex_apks_file",
8355 }
8356
8357 filegroup {
8358 name: "myapex_apks_file",
8359 srcs: ["myapex.apks"],
8360 }
8361 `)
8362
Spandan Das9d6e2092024-09-21 02:50:00 +00008363 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008364
8365 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008366 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008367 extractedApex := m.Output(extractorOutput)
8368
8369 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8370}
8371
Paul Duffin89f570a2021-06-16 01:42:33 +01008372func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008373 t.Helper()
8374
Paul Duffin55607122021-03-30 23:32:51 +01008375 fs := android.MockFS{
8376 "a.java": nil,
8377 "a.jar": nil,
8378 "apex_manifest.json": nil,
8379 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008380 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008381 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8382 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8383 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008384 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008385 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008386
Paul Duffin55607122021-03-30 23:32:51 +01008387 errorHandler := android.FixtureExpectsNoErrors
8388 if errmsg != "" {
8389 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008390 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008391
Paul Duffin55607122021-03-30 23:32:51 +01008392 result := android.GroupFixturePreparers(
8393 cc.PrepareForTestWithCcDefaultModules,
8394 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008395 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008396 java.PrepareForTestWithJavaSdkLibraryFiles,
8397 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008398 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008399 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008400 android.FixtureModifyMockFS(func(fs android.MockFS) {
8401 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8402 insert := ""
8403 for _, fragment := range fragments {
8404 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8405 }
8406 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8407 platform_bootclasspath {
8408 name: "platform-bootclasspath",
8409 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008410 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008411 %s
8412 ],
8413 }
8414 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008415 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008416 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008417 // Dexpreopt for boot jars requires the ART boot image profile.
8418 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8419 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008420 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008421 ).
8422 ExtendWithErrorHandler(errorHandler).
8423 RunTestWithBp(t, bp)
8424
8425 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008426}
8427
Jooyung Han548640b2020-04-27 12:10:30 +09008428func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008429 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008430 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8431 apex {
8432 name: "myapex",
8433 key: "myapex.key",
8434 updatable: true,
8435 }
8436
8437 apex_key {
8438 name: "myapex.key",
8439 public_key: "testkey.avbpubkey",
8440 private_key: "testkey.pem",
8441 }
8442 `)
8443}
8444
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008445func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008446 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008447 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8448 apex {
8449 name: "myapex",
8450 key: "myapex.key",
8451 }
8452
8453 apex_key {
8454 name: "myapex.key",
8455 public_key: "testkey.avbpubkey",
8456 private_key: "testkey.pem",
8457 }
8458 `)
8459}
8460
satayevb98371c2021-06-15 16:49:50 +01008461func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008462 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008463 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8464 apex {
8465 name: "myapex",
8466 key: "myapex.key",
8467 systemserverclasspath_fragments: [
8468 "mysystemserverclasspathfragment",
8469 ],
8470 min_sdk_version: "29",
8471 updatable: true,
8472 }
8473
8474 apex_key {
8475 name: "myapex.key",
8476 public_key: "testkey.avbpubkey",
8477 private_key: "testkey.pem",
8478 }
8479
8480 java_library {
8481 name: "foo",
8482 srcs: ["b.java"],
8483 min_sdk_version: "29",
8484 installable: true,
8485 apex_available: [
8486 "myapex",
8487 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008488 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008489 }
8490
8491 systemserverclasspath_fragment {
8492 name: "mysystemserverclasspathfragment",
8493 generate_classpaths_proto: false,
8494 contents: [
8495 "foo",
8496 ],
8497 apex_available: [
8498 "myapex",
8499 ],
8500 }
satayevabcd5972021-08-06 17:49:46 +01008501 `,
8502 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8503 )
satayevb98371c2021-06-15 16:49:50 +01008504}
8505
Paul Duffin064b70c2020-11-02 17:32:38 +00008506func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008507 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008508 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008509 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008510 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008511 fragment := java.ApexVariantReference{
8512 Apex: proptools.StringPtr("myapex"),
8513 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8514 }
8515
Paul Duffin064b70c2020-11-02 17:32:38 +00008516 testDexpreoptWithApexes(t, `
8517 prebuilt_apex {
8518 name: "myapex" ,
8519 arch: {
8520 arm64: {
8521 src: "myapex-arm64.apex",
8522 },
8523 arm: {
8524 src: "myapex-arm.apex",
8525 },
8526 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008527 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8528 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008529
Paul Duffin89f570a2021-06-16 01:42:33 +01008530 prebuilt_bootclasspath_fragment {
8531 name: "my-bootclasspath-fragment",
8532 contents: ["libfoo"],
8533 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008534 hidden_api: {
8535 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8536 metadata: "my-bootclasspath-fragment/metadata.csv",
8537 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008538 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8539 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8540 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008541 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008542 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008543
Spandan Das52c01a12024-09-20 01:09:48 +00008544 java_sdk_library_import {
8545 name: "libfoo",
8546 prefer: true,
8547 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008548 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008549 },
8550 apex_available: ["myapex"],
8551 shared_library: false,
8552 permitted_packages: ["libfoo"],
8553 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008554 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008555 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008556}
8557
Spandan Dasf14e2542021-11-12 00:01:37 +00008558func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008559 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008560 bp += `
8561 apex_key {
8562 name: "myapex.key",
8563 public_key: "testkey.avbpubkey",
8564 private_key: "testkey.pem",
8565 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008566 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008567 "lib1/src/A.java": nil,
8568 "lib2/src/B.java": nil,
8569 "system/sepolicy/apex/myapex-file_contexts": nil,
8570 }
8571
Paul Duffin45338f02021-03-30 23:07:52 +01008572 errorHandler := android.FixtureExpectsNoErrors
8573 if errmsg != "" {
8574 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008575 }
Colin Crossae8600b2020-10-29 17:09:13 -07008576
Paul Duffin45338f02021-03-30 23:07:52 +01008577 android.GroupFixturePreparers(
8578 android.PrepareForTestWithAndroidBuildComponents,
8579 java.PrepareForTestWithJavaBuildComponents,
8580 PrepareForTestWithApexBuildComponents,
8581 android.PrepareForTestWithNeverallowRules(rules),
8582 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008583 apexBootJars := make([]string, 0, len(bootJars))
8584 for _, apexBootJar := range bootJars {
8585 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008586 }
satayevd604b212021-07-21 14:23:52 +01008587 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008588 }),
8589 fs.AddToFixture(),
8590 ).
8591 ExtendWithErrorHandler(errorHandler).
8592 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008593}
8594
8595func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008596 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008597 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008598 name string
8599 expectedError string
8600 bp string
8601 bootJars []string
8602 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008603 }{
8604
8605 {
8606 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8607 expectedError: "",
8608 bp: `
8609 java_library {
8610 name: "bcp_lib1",
8611 srcs: ["lib1/src/*.java"],
8612 permitted_packages: ["foo.bar"],
8613 apex_available: ["myapex"],
8614 sdk_version: "none",
8615 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008616 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008617 }
8618 java_library {
8619 name: "nonbcp_lib2",
8620 srcs: ["lib2/src/*.java"],
8621 apex_available: ["myapex"],
8622 permitted_packages: ["a.b"],
8623 sdk_version: "none",
8624 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008625 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008626 }
8627 apex {
8628 name: "myapex",
8629 key: "myapex.key",
8630 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008631 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008632 }`,
8633 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008634 bcpPermittedPackages: map[string][]string{
8635 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008636 "foo.bar",
8637 },
8638 },
8639 },
8640 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008641 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008642 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 +01008643 bp: `
8644 java_library {
8645 name: "bcp_lib1",
8646 srcs: ["lib1/src/*.java"],
8647 apex_available: ["myapex"],
8648 permitted_packages: ["foo.bar"],
8649 sdk_version: "none",
8650 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008651 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008652 }
8653 java_library {
8654 name: "bcp_lib2",
8655 srcs: ["lib2/src/*.java"],
8656 apex_available: ["myapex"],
8657 permitted_packages: ["foo.bar", "bar.baz"],
8658 sdk_version: "none",
8659 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008660 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008661 }
8662 apex {
8663 name: "myapex",
8664 key: "myapex.key",
8665 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008666 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008667 }
8668 `,
8669 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008670 bcpPermittedPackages: map[string][]string{
8671 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008672 "foo.bar",
8673 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008674 "bcp_lib2": []string{
8675 "foo.bar",
8676 },
8677 },
8678 },
8679 {
8680 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8681 expectedError: "",
8682 bp: `
8683 java_library {
8684 name: "bcp_lib_restricted",
8685 srcs: ["lib1/src/*.java"],
8686 apex_available: ["myapex"],
8687 permitted_packages: ["foo.bar"],
8688 sdk_version: "none",
8689 min_sdk_version: "29",
8690 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008691 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008692 }
8693 java_library {
8694 name: "bcp_lib_unrestricted",
8695 srcs: ["lib2/src/*.java"],
8696 apex_available: ["myapex"],
8697 permitted_packages: ["foo.bar", "bar.baz"],
8698 sdk_version: "none",
8699 min_sdk_version: "29",
8700 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008701 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008702 }
8703 apex {
8704 name: "myapex",
8705 key: "myapex.key",
8706 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8707 updatable: true,
8708 min_sdk_version: "29",
8709 }
8710 `,
8711 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8712 bcpPermittedPackages: map[string][]string{
8713 "bcp_lib1_non_updateable": []string{
8714 "foo.bar",
8715 },
8716 // 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 +01008717 },
8718 },
8719 }
8720 for _, tc := range testcases {
8721 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008722 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008723 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8724 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008725 })
8726 }
8727}
8728
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008729// TODO(jungjw): Move this to proptools
8730func intPtr(i int) *int {
8731 return &i
8732}
8733
8734func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008735 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008736 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008737 apex_set {
8738 name: "myapex",
8739 set: "myapex.apks",
8740 filename: "foo_v2.apex",
8741 overrides: ["foo"],
8742 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008743 `,
8744 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8745 variables.Platform_sdk_version = intPtr(30)
8746 }),
8747 android.FixtureModifyConfig(func(config android.Config) {
8748 config.Targets[android.Android] = []android.Target{
8749 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8750 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8751 }
8752 }),
8753 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008754
Spandan Das9d6e2092024-09-21 02:50:00 +00008755 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008756
8757 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008758 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008759 actual := extractedApex.Args["abis"]
8760 expected := "ARMEABI_V7A,ARM64_V8A"
8761 if actual != expected {
8762 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8763 }
8764 actual = extractedApex.Args["sdk-version"]
8765 expected = "30"
8766 if actual != expected {
8767 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8768 }
8769
Paul Duffin6717d882021-06-15 19:09:41 +01008770 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008771 a := m.Module().(*ApexSet)
8772 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008773 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008774 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8775 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8776 }
8777}
8778
Anton Hansson805e0a52022-11-25 14:06:46 +00008779func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008780 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008781 ctx := testApex(t, `
8782 apex_set {
8783 name: "myapex",
8784 set: "myapex.apks",
8785 filename: "foo_v2.apex",
8786 overrides: ["foo"],
8787 }
8788 `,
8789 android.FixtureModifyConfig(func(config android.Config) {
8790 config.Targets[android.Android] = []android.Target{
8791 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8792 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8793 }
8794 }),
8795 )
8796
Spandan Das9d6e2092024-09-21 02:50:00 +00008797 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008798
8799 // Check extract_apks tool parameters. No native bridge arch expected
8800 extractedApex := m.Output("extracted/myapex.apks")
8801 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8802}
8803
Jiyong Park7d95a512020-05-10 15:16:24 +09008804func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008805 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008806 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8807 apex {
8808 name: "myapex",
8809 key: "myapex.key",
8810 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008811 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008812 }
8813
8814 apex_key {
8815 name: "myapex.key",
8816 public_key: "testkey.avbpubkey",
8817 private_key: "testkey.pem",
8818 }
8819
8820 cc_library {
8821 name: "mylib",
8822 srcs: ["mylib.cpp"],
8823 static_libs: ["otherlib"],
8824 system_shared_libs: [],
8825 stl: "none",
8826 apex_available: [ "myapex" ],
8827 }
8828
8829 cc_library {
8830 name: "otherlib",
8831 srcs: ["mylib.cpp"],
8832 system_shared_libs: [],
8833 stl: "none",
8834 stubs: {
8835 versions: ["1", "2", "3"],
8836 },
8837 apex_available: [ "myapex" ],
8838 }
8839 `)
8840}
8841
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008842func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008843 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008844 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008845 apex {
8846 name: "myapex",
8847 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008848 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008849 custom_sign_tool: "sign_myapex",
8850 }
8851
8852 apex_key {
8853 name: "myapex.key",
8854 public_key: "testkey.avbpubkey",
8855 private_key: "testkey.pem",
8856 }
8857 `)
8858
Jooyung Han286957d2023-10-30 16:17:56 +09008859 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008860 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008861 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 +09008862}
8863
8864func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008865 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008866 ctx := testApex(t, `
8867 apex {
8868 name: "myapex",
8869 key: "myapex.key",
8870 updatable: false,
8871 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008872 }
8873
8874 apex_key {
8875 name: "myapex.key",
8876 public_key: "testkey.avbpubkey",
8877 private_key: "testkey.pem",
8878 }
8879
8880 prebuilt_apex {
8881 name: "myapex",
8882 prefer: true,
8883 arch: {
8884 arm64: {
8885 src: "myapex-arm64.apex",
8886 },
8887 arm: {
8888 src: "myapex-arm.apex",
8889 },
8890 },
8891 }
8892
8893 apex_set {
8894 name: "myapex_set",
8895 set: "myapex.apks",
8896 filename: "myapex_set.apex",
8897 overrides: ["myapex"],
8898 }
8899 `)
8900
Colin Crossf61d03d2023-11-02 16:56:39 -07008901 content := android.ContentFromFileRuleForTests(t, ctx,
8902 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008903 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 -07008904 content = android.ContentFromFileRuleForTests(t, ctx,
8905 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008906 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 +09008907}
8908
Jooyung Han938b5932020-06-20 12:47:47 +09008909func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008910 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008911 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008912 apex {
8913 name: "myapex",
8914 key: "myapex.key",
8915 apps: ["app"],
8916 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008917 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008918 }
8919
8920 apex_key {
8921 name: "myapex.key",
8922 public_key: "testkey.avbpubkey",
8923 private_key: "testkey.pem",
8924 }
8925
8926 android_app {
8927 name: "app",
8928 srcs: ["foo/bar/MyClass.java"],
8929 package_name: "foo",
8930 sdk_version: "none",
8931 system_modules: "none",
8932 apex_available: [ "myapex" ],
8933 }
8934 `, withFiles(map[string][]byte{
8935 "sub/Android.bp": []byte(`
8936 override_apex {
8937 name: "override_myapex",
8938 base: "myapex",
8939 apps: ["override_app"],
8940 allowed_files: ":allowed",
8941 }
8942 // Overridable "path" property should be referenced indirectly
8943 filegroup {
8944 name: "allowed",
8945 srcs: ["allowed.txt"],
8946 }
8947 override_android_app {
8948 name: "override_app",
8949 base: "app",
8950 package_name: "bar",
8951 }
8952 `),
8953 }))
8954
Jooyung Hana0503a52023-08-23 13:12:50 +09008955 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008956 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8957 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8958 }
8959
Spandan Das50801e22024-05-13 18:29:45 +00008960 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008961 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8962 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8963 }
8964}
8965
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008966func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008967 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008968 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008969 apex {
8970 name: "myapex",
8971 key: "myapex.key",
8972 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008973 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008974 }
8975
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981
8982 cc_library {
8983 name: "mylib",
8984 srcs: ["mylib.cpp"],
8985 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008986 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008987 },
8988 apex_available: ["myapex"],
8989 }
8990
8991 cc_prebuilt_library_shared {
8992 name: "mylib",
8993 prefer: false,
8994 srcs: ["prebuilt.so"],
8995 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008996 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008997 },
8998 apex_available: ["myapex"],
8999 }
9000 `)
9001}
9002
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009003func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009004 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009005 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009006 apex {
9007 name: "myapex",
9008 key: "myapex.key",
9009 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009010 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009011 }
9012 apex_key {
9013 name: "myapex.key",
9014 public_key: "testkey.avbpubkey",
9015 private_key: "testkey.pem",
9016 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009017 `,
9018 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9019 variables.CompressedApex = proptools.BoolPtr(true)
9020 }),
9021 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009022
Jooyung Hana0503a52023-08-23 13:12:50 +09009023 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009024 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9025
Jooyung Hana0503a52023-08-23 13:12:50 +09009026 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009027 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9028
9029 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009030 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009031 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9032
9033 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009034 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009035 var builder strings.Builder
9036 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9037 androidMk := builder.String()
9038 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9039}
9040
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009041func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9042 t.Parallel()
9043 ctx := testApex(t, `
9044 apex {
9045 name: "myapex",
9046 key: "myapex.key",
9047 compressible: true,
9048 updatable: false,
9049 payload_fs_type: "erofs",
9050 }
9051 apex_key {
9052 name: "myapex.key",
9053 public_key: "testkey.avbpubkey",
9054 private_key: "testkey.pem",
9055 }
9056 `,
9057 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9058 variables.CompressedApex = proptools.BoolPtr(true)
9059 }),
9060 )
9061
9062 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9063 if compressRule.Rule != nil {
9064 t.Error("erofs apex should not be compressed")
9065 }
9066}
9067
Jooyung Han26ec8482024-07-31 15:04:05 +09009068func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009069 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009070 for _, compressionEnabled := range []bool{true, false} {
9071 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009072 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009073 ctx := testApex(t, `
9074 apex_set {
9075 name: "com.company.android.myapex",
9076 apex_name: "com.android.myapex",
9077 set: "company-myapex.apks",
9078 }
9079 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9080 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9081 }),
9082 )
9083
9084 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9085 if compressionEnabled {
9086 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9087 } else {
9088 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9089 }
9090 })
9091 }
9092}
9093
Martin Stjernholm2856c662020-12-02 15:03:42 +00009094func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009095 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009096 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009097 apex {
9098 name: "myapex",
9099 key: "myapex.key",
9100 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009101 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009102 }
9103
9104 apex_key {
9105 name: "myapex.key",
9106 public_key: "testkey.avbpubkey",
9107 private_key: "testkey.pem",
9108 }
9109
9110 cc_library {
9111 name: "mylib",
9112 srcs: ["mylib.cpp"],
9113 apex_available: ["myapex"],
9114 shared_libs: ["otherlib"],
9115 system_shared_libs: [],
9116 }
9117
9118 cc_library {
9119 name: "otherlib",
9120 srcs: ["mylib.cpp"],
9121 stubs: {
9122 versions: ["current"],
9123 },
9124 }
9125
9126 cc_prebuilt_library_shared {
9127 name: "otherlib",
9128 prefer: true,
9129 srcs: ["prebuilt.so"],
9130 stubs: {
9131 versions: ["current"],
9132 },
9133 }
9134 `)
9135
Jooyung Hana0503a52023-08-23 13:12:50 +09009136 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009137 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009138 var builder strings.Builder
9139 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9140 androidMk := builder.String()
9141
9142 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9143 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009144 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009145}
9146
Jiyong Parke3867542020-12-03 17:28:25 +09009147func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009148 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009149 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009150 apex {
9151 name: "myapex",
9152 key: "myapex.key",
9153 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009154 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009155 }
9156
9157 apex_key {
9158 name: "myapex.key",
9159 public_key: "testkey.avbpubkey",
9160 private_key: "testkey.pem",
9161 }
9162
9163 cc_library {
9164 name: "mylib",
9165 srcs: ["mylib.cpp"],
9166 system_shared_libs: [],
9167 stl: "none",
9168 apex_available: ["myapex"],
9169 shared_libs: ["mylib2"],
9170 target: {
9171 apex: {
9172 exclude_shared_libs: ["mylib2"],
9173 },
9174 },
9175 }
9176
9177 cc_library {
9178 name: "mylib2",
9179 srcs: ["mylib.cpp"],
9180 system_shared_libs: [],
9181 stl: "none",
9182 }
9183 `)
9184
9185 // Check if mylib is linked to mylib2 for the non-apex target
9186 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9187 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9188
9189 // Make sure that the link doesn't occur for the apex target
9190 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9191 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9192
9193 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009194 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009195 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9196}
9197
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009198func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009199 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009200 bpBase := `
9201 apex {
9202 name: "myapex",
9203 key: "myapex.key",
9204 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009205 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009206 }
9207 apex_key {
9208 name: "myapex.key",
9209 public_key: "testkey.avbpubkey",
9210 private_key: "testkey.pem",
9211 }
9212 cc_library {
9213 name: "mylib",
9214 srcs: ["mylib.cpp"],
9215 apex_available: ["myapex"],
9216 shared_libs: ["stublib"],
9217 system_shared_libs: [],
9218 }
9219 apex {
9220 name: "otherapex",
9221 enabled: %s,
9222 key: "myapex.key",
9223 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009224 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009225 }
9226 `
9227
9228 stublibSourceBp := `
9229 cc_library {
9230 name: "stublib",
9231 srcs: ["mylib.cpp"],
9232 apex_available: ["otherapex"],
9233 system_shared_libs: [],
9234 stl: "none",
9235 stubs: {
9236 versions: ["1"],
9237 },
9238 }
9239 `
9240
9241 stublibPrebuiltBp := `
9242 cc_prebuilt_library_shared {
9243 name: "stublib",
9244 srcs: ["prebuilt.so"],
9245 apex_available: ["otherapex"],
9246 stubs: {
9247 versions: ["1"],
9248 },
9249 %s
9250 }
9251 `
9252
9253 tests := []struct {
9254 name string
9255 stublibBp string
9256 usePrebuilt bool
9257 modNames []string // Modules to collect AndroidMkEntries for
9258 otherApexEnabled []string
9259 }{
9260 {
9261 name: "only_source",
9262 stublibBp: stublibSourceBp,
9263 usePrebuilt: false,
9264 modNames: []string{"stublib"},
9265 otherApexEnabled: []string{"true", "false"},
9266 },
9267 {
9268 name: "source_preferred",
9269 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9270 usePrebuilt: false,
9271 modNames: []string{"stublib", "prebuilt_stublib"},
9272 otherApexEnabled: []string{"true", "false"},
9273 },
9274 {
9275 name: "prebuilt_preferred",
9276 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9277 usePrebuilt: true,
9278 modNames: []string{"stublib", "prebuilt_stublib"},
9279 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9280 },
9281 {
9282 name: "only_prebuilt",
9283 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9284 usePrebuilt: true,
9285 modNames: []string{"stublib"},
9286 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9287 },
9288 }
9289
9290 for _, test := range tests {
9291 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009292 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009293 for _, otherApexEnabled := range test.otherApexEnabled {
9294 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009295 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009296 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009297
9298 type modAndMkEntries struct {
9299 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009300 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009301 }
9302 entries := []*modAndMkEntries{}
9303
9304 // Gather shared lib modules that are installable
9305 for _, modName := range test.modNames {
9306 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9307 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9308 continue
9309 }
9310 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009311 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009312 continue
9313 }
Yu Liue70976d2024-10-15 20:45:35 +00009314 info := android.AndroidMkInfoForTest(t, ctx, mod)
9315 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9316 ents = append(ents, info.ExtraInfo...)
9317 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009318 if ent.Disabled {
9319 continue
9320 }
9321 entries = append(entries, &modAndMkEntries{
9322 mod: mod,
9323 mkEntries: ent,
9324 })
9325 }
9326 }
9327 }
9328
9329 var entry *modAndMkEntries = nil
9330 for _, ent := range entries {
9331 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9332 if entry != nil {
9333 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9334 } else {
9335 entry = ent
9336 }
9337 }
9338 }
9339
9340 if entry == nil {
9341 t.Errorf("AndroidMk entry for \"stublib\" missing")
9342 } else {
9343 isPrebuilt := entry.mod.Prebuilt() != nil
9344 if isPrebuilt != test.usePrebuilt {
9345 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9346 }
9347 if !entry.mod.IsStubs() {
9348 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9349 }
9350 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9351 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9352 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009353 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009354 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009355 if !android.InList(expected, cflags) {
9356 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9357 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009358 }
9359 })
9360 }
9361 })
9362 }
9363}
9364
Colin Crossc33e5212021-05-25 18:16:02 -07009365func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009366 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009367 bp := `
9368 apex {
9369 name: "myapex",
9370 key: "myapex.key",
9371 java_libs: ["mylib"],
9372 bootclasspath_fragments: ["mybootclasspathfragment"],
9373 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9374 updatable: false,
9375 }
9376
9377 apex_key {
9378 name: "myapex.key",
9379 public_key: "testkey.avbpubkey",
9380 private_key: "testkey.pem",
9381 }
9382
9383 java_library {
9384 name: "mylib",
9385 srcs: ["mylib.java"],
9386 apex_available: ["myapex"],
9387 compile_dex: true,
9388 }
9389
9390 bootclasspath_fragment {
9391 name: "mybootclasspathfragment",
9392 contents: ["mybootclasspathlib"],
9393 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009394 hidden_api: {
9395 split_packages: ["*"],
9396 },
Colin Crossc33e5212021-05-25 18:16:02 -07009397 }
9398
9399 java_library {
9400 name: "mybootclasspathlib",
9401 srcs: ["mybootclasspathlib.java"],
9402 apex_available: ["myapex"],
9403 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009404 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009405 }
9406
9407 systemserverclasspath_fragment {
9408 name: "mysystemserverclasspathfragment",
9409 contents: ["mysystemserverclasspathlib"],
9410 apex_available: ["myapex"],
9411 }
9412
9413 java_library {
9414 name: "mysystemserverclasspathlib",
9415 srcs: ["mysystemserverclasspathlib.java"],
9416 apex_available: ["myapex"],
9417 compile_dex: true,
9418 }
9419 `
9420
9421 result := android.GroupFixturePreparers(
9422 PrepareForTestWithApexBuildComponents,
9423 prepareForTestWithMyapex,
9424 java.PrepareForTestWithJavaDefaultModules,
9425 android.PrepareForTestWithAndroidBuildComponents,
9426 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009427 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9428 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009429 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009430 ).RunTest(t)
9431
9432 // Make sure jacoco ran on both mylib and mybootclasspathlib
9433 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9434 t.Errorf("Failed to find jacoco rule for mylib")
9435 }
9436 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9437 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9438 }
9439 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9440 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9441 }
9442}
9443
Jiyong Park192600a2021-08-03 07:52:17 +00009444func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009445 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009446 testApexError(t, `executable mybin is static`, `
9447 apex {
9448 name: "myapex",
9449 key: "myapex.key",
9450 binaries: ["mybin"],
9451 min_sdk_version: "29",
9452 }
9453
9454 apex_key {
9455 name: "myapex.key",
9456 public_key: "testkey.avbpubkey",
9457 private_key: "testkey.pem",
9458 }
9459
9460 cc_binary {
9461 name: "mybin",
9462 srcs: ["mylib.cpp"],
9463 relative_install_path: "foo/bar",
9464 static_executable: true,
9465 system_shared_libs: [],
9466 stl: "none",
9467 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009468 min_sdk_version: "29",
9469 }
9470 `)
9471
9472 testApexError(t, `executable mybin.rust is static`, `
9473 apex {
9474 name: "myapex",
9475 key: "myapex.key",
9476 binaries: ["mybin.rust"],
9477 min_sdk_version: "29",
9478 }
9479
9480 apex_key {
9481 name: "myapex.key",
9482 public_key: "testkey.avbpubkey",
9483 private_key: "testkey.pem",
9484 }
9485
9486 rust_binary {
9487 name: "mybin.rust",
9488 srcs: ["foo.rs"],
9489 static_executable: true,
9490 apex_available: ["myapex"],
9491 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009492 }
9493 `)
9494}
9495
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009496func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009497 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009498 ctx := testApex(t, `
9499 apex {
9500 name: "myapex",
9501 key: "myapex.key",
9502 updatable: false,
9503 java_libs: ["foo"],
9504 }
9505
9506 apex_key {
9507 name: "myapex.key",
9508 public_key: "testkey.avbpubkey",
9509 private_key: "testkey.pem",
9510 }
9511
9512 java_library {
9513 name: "foo",
9514 srcs: ["foo.java"],
9515 apex_available: ["myapex"],
9516 installable: true,
9517 }
9518 `,
9519 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9520 )
9521
Jooyung Hana0503a52023-08-23 13:12:50 +09009522 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009523 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9524 var builder strings.Builder
9525 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9526 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009527 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 +00009528}
9529
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009530func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009531 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009532 ctx := testApex(t, `
9533 apex {
9534 name: "myapex",
9535 key: "myapex.key",
9536 updatable: false,
9537 java_libs: ["foo"],
9538 required: ["otherapex"],
9539 }
9540
9541 apex {
9542 name: "otherapex",
9543 key: "myapex.key",
9544 updatable: false,
9545 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009546 }
9547
9548 apex_key {
9549 name: "myapex.key",
9550 public_key: "testkey.avbpubkey",
9551 private_key: "testkey.pem",
9552 }
9553
9554 java_library {
9555 name: "foo",
9556 srcs: ["foo.java"],
9557 apex_available: ["myapex", "otherapex"],
9558 installable: true,
9559 }
9560 `)
9561
Jooyung Hana0503a52023-08-23 13:12:50 +09009562 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009563 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9564 var builder strings.Builder
9565 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9566 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009567 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009568}
9569
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009570func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009571 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009572 ctx := testApex(t, `
9573 apex {
9574 name: "myapex",
9575 key: "myapex.key",
9576 updatable: false,
9577 }
9578
9579 apex_key {
9580 name: "myapex.key",
9581 public_key: "testkey.avbpubkey",
9582 private_key: "testkey.pem",
9583 }
9584 `)
9585
Jooyung Hana0503a52023-08-23 13:12:50 +09009586 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009587 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009588 data := android.AndroidMkDataForTest(t, ctx, bundle)
9589 var builder strings.Builder
9590 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9591 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009592 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009593}
9594
Jooyung Hana6d36672022-02-24 13:58:07 +09009595func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009596 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009597 for _, tc := range []struct {
9598 name string
9599 ref string
9600 expected_data []string
9601 }{
9602 {
9603 name: "test_using_output",
9604 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009605 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009606 },
9607 {
9608 name: "test_using_apex",
9609 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009610 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009611 },
9612 } {
9613 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009614 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009615 ctx := testApex(t, `
9616 apex {
9617 name: "myapex",
9618 key: "myapex.key",
9619 compressible: true,
9620 updatable: false,
9621 }
9622
9623 apex_key {
9624 name: "myapex.key",
9625 public_key: "testkey.avbpubkey",
9626 private_key: "testkey.pem",
9627 }
9628
9629 java_test {
9630 name: "`+tc.name+`",
9631 srcs: ["a.java"],
9632 data: ["`+tc.ref+`"],
9633 }
9634 `,
9635 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9636 variables.CompressedApex = proptools.BoolPtr(true)
9637 }))
9638 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9639 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9640 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9641 })
9642 }
9643}
9644
satayev758968a2021-12-06 11:42:40 +00009645func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009646 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009647 preparer := android.GroupFixturePreparers(
9648 PrepareForTestWithApexBuildComponents,
9649 prepareForTestWithMyapex,
9650 java.PrepareForTestWithJavaSdkLibraryFiles,
9651 java.PrepareForTestWithJavaDefaultModules,
9652 android.PrepareForTestWithAndroidBuildComponents,
9653 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9654 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9655 )
9656
9657 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9658 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009659 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009660 preparer.RunTestWithBp(t, `
9661 apex {
9662 name: "myapex",
9663 key: "myapex.key",
9664 bootclasspath_fragments: ["mybootclasspathfragment"],
9665 min_sdk_version: "30",
9666 updatable: false,
9667 }
9668
9669 apex_key {
9670 name: "myapex.key",
9671 public_key: "testkey.avbpubkey",
9672 private_key: "testkey.pem",
9673 }
9674
9675 bootclasspath_fragment {
9676 name: "mybootclasspathfragment",
9677 contents: ["mybootclasspathlib"],
9678 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009679 hidden_api: {
9680 split_packages: ["*"],
9681 },
satayev758968a2021-12-06 11:42:40 +00009682 }
9683
9684 java_sdk_library {
9685 name: "mybootclasspathlib",
9686 srcs: ["mybootclasspathlib.java"],
9687 apex_available: ["myapex"],
9688 compile_dex: true,
9689 unsafe_ignore_missing_latest_api: true,
9690 min_sdk_version: "31",
9691 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009692 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009693 }
9694
9695 java_library {
9696 name: "util",
9697 srcs: ["a.java"],
9698 apex_available: ["myapex"],
9699 min_sdk_version: "31",
9700 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009701 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009702 }
9703
9704 java_library {
9705 name: "another_util",
9706 srcs: ["a.java"],
9707 min_sdk_version: "31",
9708 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009709 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009710 }
9711 `)
9712 })
9713
9714 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9715 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009716 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009717 preparer.RunTestWithBp(t, `
9718 apex {
9719 name: "myapex",
9720 key: "myapex.key",
9721 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9722 min_sdk_version: "30",
9723 updatable: false,
9724 }
9725
9726 apex_key {
9727 name: "myapex.key",
9728 public_key: "testkey.avbpubkey",
9729 private_key: "testkey.pem",
9730 }
9731
9732 systemserverclasspath_fragment {
9733 name: "mysystemserverclasspathfragment",
9734 contents: ["mysystemserverclasspathlib"],
9735 apex_available: ["myapex"],
9736 }
9737
9738 java_sdk_library {
9739 name: "mysystemserverclasspathlib",
9740 srcs: ["mysystemserverclasspathlib.java"],
9741 apex_available: ["myapex"],
9742 compile_dex: true,
9743 min_sdk_version: "32",
9744 unsafe_ignore_missing_latest_api: true,
9745 static_libs: ["util"],
9746 }
9747
9748 java_library {
9749 name: "util",
9750 srcs: ["a.java"],
9751 apex_available: ["myapex"],
9752 min_sdk_version: "31",
9753 static_libs: ["another_util"],
9754 }
9755
9756 java_library {
9757 name: "another_util",
9758 srcs: ["a.java"],
9759 min_sdk_version: "31",
9760 apex_available: ["myapex"],
9761 }
9762 `)
9763 })
9764
9765 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009766 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009767 preparer.
satayev758968a2021-12-06 11:42:40 +00009768 RunTestWithBp(t, `
9769 apex {
9770 name: "myapex",
9771 key: "myapex.key",
9772 bootclasspath_fragments: ["mybootclasspathfragment"],
9773 min_sdk_version: "30",
9774 updatable: false,
9775 }
9776
9777 apex_key {
9778 name: "myapex.key",
9779 public_key: "testkey.avbpubkey",
9780 private_key: "testkey.pem",
9781 }
9782
9783 bootclasspath_fragment {
9784 name: "mybootclasspathfragment",
9785 contents: ["mybootclasspathlib"],
9786 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009787 hidden_api: {
9788 split_packages: ["*"],
9789 },
satayev758968a2021-12-06 11:42:40 +00009790 }
9791
9792 java_sdk_library {
9793 name: "mybootclasspathlib",
9794 srcs: ["mybootclasspathlib.java"],
9795 apex_available: ["myapex"],
9796 compile_dex: true,
9797 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009798 sdk_version: "current",
9799 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009800 }
9801 `)
9802 })
9803
9804 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009805 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009806 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9807 RunTestWithBp(t, `
9808 apex {
9809 name: "myapex",
9810 key: "myapex.key",
9811 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9812 min_sdk_version: "30",
9813 updatable: false,
9814 }
9815
9816 apex_key {
9817 name: "myapex.key",
9818 public_key: "testkey.avbpubkey",
9819 private_key: "testkey.pem",
9820 }
9821
9822 systemserverclasspath_fragment {
9823 name: "mysystemserverclasspathfragment",
9824 contents: ["mysystemserverclasspathlib"],
9825 apex_available: ["myapex"],
9826 }
9827
9828 java_sdk_library {
9829 name: "mysystemserverclasspathlib",
9830 srcs: ["mysystemserverclasspathlib.java"],
9831 apex_available: ["myapex"],
9832 compile_dex: true,
9833 unsafe_ignore_missing_latest_api: true,
9834 }
9835 `)
9836 })
9837}
9838
Jiakai Zhang6decef92022-01-12 17:56:19 +00009839// Verifies that the APEX depends on all the Make modules in the list.
9840func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9841 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9842 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009843 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009844 }
9845}
9846
9847// Verifies that the APEX does not depend on any of the Make modules in the list.
9848func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9849 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9850 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009851 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009852 }
9853}
9854
Cole Faust24e25c02024-01-19 14:12:17 -08009855func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009856 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009857 bpTemplate := `
9858 apex {
9859 name: "myapex",
9860 key: "myapex.key",
9861 java_libs: ["myjavalib"],
9862 updatable: %v,
9863 min_sdk_version: "29",
9864 }
9865 apex_key {
9866 name: "myapex.key",
9867 }
9868 java_library {
9869 name: "myjavalib",
9870 srcs: ["MyClass.java"],
9871 apex_available: [ "myapex" ],
9872 lint: {
9873 strict_updatability_linting: %v,
9874 %s
9875 },
9876 sdk_version: "current",
9877 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009878 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009879 }
9880 `
9881 fs := android.MockFS{
9882 "lint-baseline.xml": nil,
9883 }
9884
9885 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009886 testCaseName string
9887 apexUpdatable bool
9888 javaStrictUpdtabilityLint bool
9889 lintFileExists bool
9890 disallowedFlagExpectedOnApex bool
9891 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009892 }{
9893 {
Colin Cross87427352024-09-25 15:41:19 -07009894 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9895 apexUpdatable: true,
9896 javaStrictUpdtabilityLint: true,
9897 lintFileExists: false,
9898 disallowedFlagExpectedOnApex: false,
9899 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009900 },
9901 {
Colin Cross87427352024-09-25 15:41:19 -07009902 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9903 apexUpdatable: false,
9904 javaStrictUpdtabilityLint: false,
9905 lintFileExists: true,
9906 disallowedFlagExpectedOnApex: false,
9907 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009908 },
9909 {
Colin Cross87427352024-09-25 15:41:19 -07009910 testCaseName: "non-updatable apex respects strict updatability of javalib",
9911 apexUpdatable: false,
9912 javaStrictUpdtabilityLint: true,
9913 lintFileExists: true,
9914 disallowedFlagExpectedOnApex: false,
9915 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009916 },
9917 {
Colin Cross87427352024-09-25 15:41:19 -07009918 testCaseName: "updatable apex checks strict updatability of javalib",
9919 apexUpdatable: true,
9920 javaStrictUpdtabilityLint: false,
9921 lintFileExists: true,
9922 disallowedFlagExpectedOnApex: true,
9923 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009924 },
9925 }
9926
9927 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009928 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009929 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009930 fixtures := []android.FixturePreparer{}
9931 baselineProperty := ""
9932 if testCase.lintFileExists {
9933 fixtures = append(fixtures, fs.AddToFixture())
9934 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9935 }
9936 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009937
Colin Cross87427352024-09-25 15:41:19 -07009938 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009939
Colin Cross87427352024-09-25 15:41:19 -07009940 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9941 if expectStrictUpdatability {
9942 if m.Rule == nil {
9943 t.Errorf("expected strict updatability check rule on %s", name)
9944 } else {
9945 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9946 m.RuleParams.Command, "--disallowed_issues NewApi")
9947 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9948 m.Inputs.Strings(), "lint-baseline.xml")
9949 }
9950 } else {
9951 if m.Rule != nil {
9952 t.Errorf("expected no strict updatability check rule on %s", name)
9953 }
9954 }
9955 }
9956
9957 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9958 apex := result.ModuleForTests("myapex", "android_common_myapex")
9959 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9960 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9961
9962 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9963 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9964 })
Cole Faust24e25c02024-01-19 14:12:17 -08009965 }
9966}
9967
Cole Faust24e25c02024-01-19 14:12:17 -08009968// checks transtive deps of an apex coming from bootclasspath_fragment
9969func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009970 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009971 bp := `
9972 apex {
9973 name: "myapex",
9974 key: "myapex.key",
9975 bootclasspath_fragments: ["mybootclasspathfragment"],
9976 updatable: true,
9977 min_sdk_version: "29",
9978 }
9979 apex_key {
9980 name: "myapex.key",
9981 }
9982 bootclasspath_fragment {
9983 name: "mybootclasspathfragment",
9984 contents: ["myjavalib"],
9985 apex_available: ["myapex"],
9986 hidden_api: {
9987 split_packages: ["*"],
9988 },
9989 }
9990 java_library {
9991 name: "myjavalib",
9992 srcs: ["MyClass.java"],
9993 apex_available: [ "myapex" ],
9994 sdk_version: "current",
9995 min_sdk_version: "29",
9996 compile_dex: true,
9997 lint: {
9998 baseline_filename: "lint-baseline.xml",
9999 }
10000 }
10001 `
10002 fs := android.MockFS{
10003 "lint-baseline.xml": nil,
10004 }
10005
10006 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010007 apex := result.ModuleForTests("myapex", "android_common_myapex")
10008 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10009 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10010 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10011 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10012 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010013}
Spandan Das66773252022-01-15 00:23:18 +000010014
Jihoon Kang784c0052024-06-25 22:15:39 +000010015func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010016 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010017 bp := `
10018 apex {
10019 name: "myapex",
10020 key: "myapex.key",
10021 bootclasspath_fragments: ["mybootclasspathfragment"],
10022 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010023 java_libs: [
10024 "jacocoagent",
10025 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010026 }
10027 apex_key {
10028 name: "myapex.key",
10029 }
10030 bootclasspath_fragment {
10031 name: "mybootclasspathfragment",
10032 contents: ["foo"],
10033 apex_available: ["myapex"],
10034 hidden_api: {
10035 split_packages: ["*"],
10036 },
10037 }
10038 java_sdk_library {
10039 name: "foo",
10040 srcs: ["MyClass.java"],
10041 apex_available: [ "myapex" ],
10042 sdk_version: "current",
10043 min_sdk_version: "29",
10044 compile_dex: true,
10045 }
10046 `
10047 fs := android.MockFS{
10048 "lint-baseline.xml": nil,
10049 }
10050
10051 result := android.GroupFixturePreparers(
10052 prepareForApexTest,
10053 java.PrepareForTestWithJavaSdkLibraryFiles,
10054 java.PrepareForTestWithJacocoInstrumentation,
10055 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010056 android.FixtureMergeMockFs(fs),
10057 ).RunTestWithBp(t, bp)
10058
10059 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10060 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10061 android.AssertStringDoesContain(t,
10062 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10063 lintReportInputs, "foo.impl")
10064}
10065
Spandan Das42e89502022-05-06 22:12:55 +000010066// updatable apexes should propagate updatable=true to its apps
10067func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010068 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010069 bp := `
10070 apex {
10071 name: "myapex",
10072 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010073 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010074 apps: [
10075 "myapp",
10076 ],
10077 min_sdk_version: "30",
10078 }
10079 apex_key {
10080 name: "myapex.key",
10081 }
10082 android_app {
10083 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010084 apex_available: [
10085 "myapex",
10086 ],
10087 sdk_version: "current",
10088 min_sdk_version: "30",
10089 }
10090 `
Colin Cross99939e92024-10-01 16:02:46 -070010091 _ = android.GroupFixturePreparers(
10092 prepareForApexTest,
10093 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10094 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010095}
10096
Jingwen Chendea7a642023-03-28 11:30:50 +000010097func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010098 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010099 ctx := testApex(t, `
10100 apex {
10101 name: "myapex",
10102 key: "myapex.key",
10103 updatable: false,
10104 }
10105
10106 apex_key {
10107 name: "myapex.key",
10108 public_key: "testkey.avbpubkey",
10109 private_key: "testkey.pem",
10110 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010111 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010112 generateFsRule := mod.Rule("generateFsConfig")
10113 cmd := generateFsRule.RuleParams.Command
10114
10115 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10116}
10117
10118func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010119 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010120 ctx := testApex(t, `
10121 apex {
10122 name: "myapex",
10123 key: "myapex.key",
10124 canned_fs_config: "my_config",
10125 updatable: false,
10126 }
10127
10128 apex_key {
10129 name: "myapex.key",
10130 public_key: "testkey.avbpubkey",
10131 private_key: "testkey.pem",
10132 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010133 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010134 generateFsRule := mod.Rule("generateFsConfig")
10135 cmd := generateFsRule.RuleParams.Command
10136
10137 // Ensure that canned_fs_config has "cat my_config" at the end
10138 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10139}
Spandan Das20fce2d2023-04-12 17:21:39 +000010140
10141func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010142 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010143 testCases := []struct {
10144 desc string
10145 hasStubs bool
10146 apexAvailable string
10147 expectedError string
10148 }{
10149 {
10150 desc: "non-stub library can have multiple apex_available",
10151 hasStubs: false,
10152 apexAvailable: `["myapex", "otherapex"]`,
10153 },
10154 {
10155 desc: "stub library should not be available to anyapex",
10156 hasStubs: true,
10157 apexAvailable: `["//apex_available:anyapex"]`,
10158 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10159 },
10160 {
10161 desc: "stub library should not be available to multiple apexes",
10162 hasStubs: true,
10163 apexAvailable: `["myapex", "otherapex"]`,
10164 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10165 },
10166 {
10167 desc: "stub library can be available to a core apex and a test apex",
10168 hasStubs: true,
10169 apexAvailable: `["myapex", "test_myapex"]`,
10170 },
10171 }
10172 bpTemplate := `
10173 cc_library {
10174 name: "libfoo",
10175 %v
10176 apex_available: %v,
10177 }
10178 apex {
10179 name: "myapex",
10180 key: "apex.key",
10181 updatable: false,
10182 native_shared_libs: ["libfoo"],
10183 }
10184 apex {
10185 name: "otherapex",
10186 key: "apex.key",
10187 updatable: false,
10188 }
10189 apex_test {
10190 name: "test_myapex",
10191 key: "apex.key",
10192 updatable: false,
10193 native_shared_libs: ["libfoo"],
10194 }
10195 apex_key {
10196 name: "apex.key",
10197 }
10198 `
10199 for _, tc := range testCases {
10200 stubs := ""
10201 if tc.hasStubs {
10202 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10203 }
10204 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10205 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10206 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10207 })
10208 if tc.expectedError == "" {
10209 testApex(t, bp, mockFsFixturePreparer)
10210 } else {
10211 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10212 }
10213 }
10214}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010215
10216func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010217 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010218 context := android.GroupFixturePreparers(
10219 android.PrepareForIntegrationTestWithAndroid,
10220 cc.PrepareForIntegrationTestWithCc,
10221 PrepareForTestWithApexBuildComponents,
10222 prepareForTestWithMyapex,
10223 filesystem.PrepareForTestWithFilesystemBuildComponents,
10224 )
10225 result := context.RunTestWithBp(t, `
10226 android_system_image {
10227 name: "myfilesystem",
10228 deps: [
10229 "libfoo",
10230 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010231 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010232 gen_linker_config: true,
10233 linker_config_srcs: ["linker.config.json"],
10234 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010235 }
10236
10237 cc_library {
10238 name: "libfoo",
10239 shared_libs: [
10240 "libbar",
10241 ],
10242 stl: "none",
10243 }
10244
10245 cc_library {
10246 name: "libbar",
10247 stl: "none",
10248 apex_available: ["myapex"],
10249 }
10250
10251 apex {
10252 name: "myapex",
10253 native_shared_libs: ["libbar"],
10254 key: "myapex.key",
10255 updatable: false,
10256 }
10257
10258 apex_key {
10259 name: "myapex.key",
10260 public_key: "testkey.avbpubkey",
10261 private_key: "testkey.pem",
10262 }
10263 `)
10264
Cole Faust3b806d32024-03-11 15:15:03 -070010265 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010266 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10267 inputs.Strings(),
10268 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10269}
Yu Liueae7b362023-11-16 17:05:47 -080010270
10271var apex_default_bp = `
10272 apex_key {
10273 name: "myapex.key",
10274 public_key: "testkey.avbpubkey",
10275 private_key: "testkey.pem",
10276 }
10277
10278 filegroup {
10279 name: "myapex.manifest",
10280 srcs: ["apex_manifest.json"],
10281 }
10282
10283 filegroup {
10284 name: "myapex.androidmanifest",
10285 srcs: ["AndroidManifest.xml"],
10286 }
10287`
10288
10289func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010290 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010291 ctx := testApex(t, apex_default_bp+`
10292 apex {
10293 name: "myapex",
10294 manifest: ":myapex.manifest",
10295 androidManifest: ":myapex.androidmanifest",
10296 key: "myapex.key",
10297 java_libs: [
10298 "my_java_library_foo",
10299 "my_java_library_bar",
10300 ],
10301 updatable: false,
10302 }
10303
10304 java_library {
10305 name: "my_java_library_foo",
10306 srcs: ["foo/bar/MyClass.java"],
10307 sdk_version: "none",
10308 system_modules: "none",
10309 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010310 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010311 "myapex",
10312 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010313 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010314 }
10315
10316 java_library {
10317 name: "my_java_library_bar",
10318 srcs: ["foo/bar/MyClass.java"],
10319 sdk_version: "none",
10320 system_modules: "none",
10321 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010322 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010323 "myapex",
10324 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010325 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010326 }
10327
10328 aconfig_declarations {
10329 name: "my_aconfig_declarations_foo",
10330 package: "com.example.package",
10331 container: "myapex",
10332 srcs: ["foo.aconfig"],
10333 }
10334
10335 java_aconfig_library {
10336 name: "my_java_aconfig_library_foo",
10337 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010338 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010339 "myapex",
10340 ],
10341 }
10342
10343 aconfig_declarations {
10344 name: "my_aconfig_declarations_bar",
10345 package: "com.example.package",
10346 container: "myapex",
10347 srcs: ["bar.aconfig"],
10348 }
10349
10350 java_aconfig_library {
10351 name: "my_java_aconfig_library_bar",
10352 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010353 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010354 "myapex",
10355 ],
10356 }
10357 `)
10358
10359 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10360 s := mod.Rule("apexRule").Args["copy_commands"]
10361 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010362 if len(copyCmds) != 14 {
10363 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010364 }
10365
Jooyung Hana3fddf42024-09-03 13:22:21 +090010366 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10367 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10368 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10369 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010370 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010371
Yu Liubba555e2024-02-17 00:36:42 +000010372 inputs := []string{
10373 "my_aconfig_declarations_foo/intermediate.pb",
10374 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010375 }
Yu Liubba555e2024-02-17 00:36:42 +000010376 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10377 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10378 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10379 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010380 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010381}
10382
10383func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010384 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010385 ctx := testApex(t, apex_default_bp+`
10386 apex {
10387 name: "myapex",
10388 manifest: ":myapex.manifest",
10389 androidManifest: ":myapex.androidmanifest",
10390 key: "myapex.key",
10391 java_libs: [
10392 "my_java_library_foo",
10393 ],
10394 native_shared_libs: [
10395 "my_cc_library_bar",
10396 ],
10397 binaries: [
10398 "my_cc_binary_baz",
10399 ],
10400 updatable: false,
10401 }
10402
10403 java_library {
10404 name: "my_java_library_foo",
10405 srcs: ["foo/bar/MyClass.java"],
10406 sdk_version: "none",
10407 system_modules: "none",
10408 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010409 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010410 "myapex",
10411 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010412 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010413 }
10414
10415 cc_library {
10416 name: "my_cc_library_bar",
10417 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010418 static_libs: [
10419 "my_cc_aconfig_library_bar",
10420 "my_cc_aconfig_library_baz",
10421 ],
Yu Liueae7b362023-11-16 17:05:47 -080010422 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010423 "myapex",
10424 ],
10425 }
10426
10427 cc_binary {
10428 name: "my_cc_binary_baz",
10429 srcs: ["foo/bar/MyClass.cc"],
10430 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010431 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010432 "myapex",
10433 ],
10434 }
10435
10436 aconfig_declarations {
10437 name: "my_aconfig_declarations_foo",
10438 package: "com.example.package",
10439 container: "myapex",
10440 srcs: ["foo.aconfig"],
10441 }
10442
10443 java_aconfig_library {
10444 name: "my_java_aconfig_library_foo",
10445 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010446 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010447 "myapex",
10448 ],
10449 }
10450
10451 aconfig_declarations {
10452 name: "my_aconfig_declarations_bar",
10453 package: "com.example.package",
10454 container: "myapex",
10455 srcs: ["bar.aconfig"],
10456 }
10457
10458 cc_aconfig_library {
10459 name: "my_cc_aconfig_library_bar",
10460 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010461 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010462 "myapex",
10463 ],
10464 }
10465
10466 aconfig_declarations {
10467 name: "my_aconfig_declarations_baz",
10468 package: "com.example.package",
10469 container: "myapex",
10470 srcs: ["baz.aconfig"],
10471 }
10472
10473 cc_aconfig_library {
10474 name: "my_cc_aconfig_library_baz",
10475 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010476 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010477 "myapex",
10478 ],
10479 }
10480
10481 cc_library {
10482 name: "server_configurable_flags",
10483 srcs: ["server_configurable_flags.cc"],
10484 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010485 cc_library {
10486 name: "libbase",
10487 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010488 apex_available: [
10489 "myapex",
10490 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010491 }
10492 cc_library {
10493 name: "libaconfig_storage_read_api_cc",
10494 srcs: ["libaconfig_storage_read_api_cc.cc"],
10495 }
Yu Liueae7b362023-11-16 17:05:47 -080010496 `)
10497
10498 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10499 s := mod.Rule("apexRule").Args["copy_commands"]
10500 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010501 if len(copyCmds) != 18 {
10502 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010503 }
10504
Jooyung Hana3fddf42024-09-03 13:22:21 +090010505 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10506 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10507 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10508 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010509 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010510
Yu Liubba555e2024-02-17 00:36:42 +000010511 inputs := []string{
10512 "my_aconfig_declarations_foo/intermediate.pb",
10513 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10514 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010515 }
Yu Liubba555e2024-02-17 00:36:42 +000010516 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10517 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10518 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10519 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010520 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010521}
10522
Yu Liucec0e412023-11-30 16:45:50 -080010523func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010524 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010525 ctx := testApex(t, apex_default_bp+`
10526 apex {
10527 name: "myapex",
10528 manifest: ":myapex.manifest",
10529 androidManifest: ":myapex.androidmanifest",
10530 key: "myapex.key",
10531 native_shared_libs: [
10532 "libmy_rust_library",
10533 ],
10534 binaries: [
10535 "my_rust_binary",
10536 ],
10537 rust_dyn_libs: [
10538 "libmy_rust_dylib",
10539 ],
10540 updatable: false,
10541 }
10542
10543 rust_library {
10544 name: "libflags_rust", // test mock
10545 crate_name: "flags_rust",
10546 srcs: ["lib.rs"],
10547 apex_available: [
10548 "myapex",
10549 ],
10550 }
10551
10552 rust_library {
10553 name: "liblazy_static", // test mock
10554 crate_name: "lazy_static",
10555 srcs: ["src/lib.rs"],
10556 apex_available: [
10557 "myapex",
10558 ],
10559 }
10560
Ted Bauer02d475c2024-03-27 20:56:26 +000010561 rust_library {
10562 name: "libaconfig_storage_read_api", // test mock
10563 crate_name: "aconfig_storage_read_api",
10564 srcs: ["src/lib.rs"],
10565 apex_available: [
10566 "myapex",
10567 ],
10568 }
10569
Ted Bauer6ef40db2024-03-29 14:04:10 +000010570 rust_library {
10571 name: "liblogger", // test mock
10572 crate_name: "logger",
10573 srcs: ["src/lib.rs"],
10574 apex_available: [
10575 "myapex",
10576 ],
10577 }
10578
10579 rust_library {
10580 name: "liblog_rust", // test mock
10581 crate_name: "log_rust",
10582 srcs: ["src/lib.rs"],
10583 apex_available: [
10584 "myapex",
10585 ],
10586 }
10587
Yu Liucec0e412023-11-30 16:45:50 -080010588 rust_ffi_shared {
10589 name: "libmy_rust_library",
10590 srcs: ["src/lib.rs"],
10591 rustlibs: ["libmy_rust_aconfig_library_foo"],
10592 crate_name: "my_rust_library",
10593 apex_available: [
10594 "myapex",
10595 ],
10596 }
10597
10598 rust_library_dylib {
10599 name: "libmy_rust_dylib",
10600 srcs: ["foo/bar/MyClass.rs"],
10601 rustlibs: ["libmy_rust_aconfig_library_bar"],
10602 crate_name: "my_rust_dylib",
10603 apex_available: [
10604 "myapex",
10605 ],
10606 }
10607
10608 rust_binary {
10609 name: "my_rust_binary",
10610 srcs: ["foo/bar/MyClass.rs"],
10611 rustlibs: [
10612 "libmy_rust_aconfig_library_baz",
10613 "libmy_rust_dylib",
10614 ],
10615 apex_available: [
10616 "myapex",
10617 ],
10618 }
10619
10620 aconfig_declarations {
10621 name: "my_aconfig_declarations_foo",
10622 package: "com.example.package",
10623 container: "myapex",
10624 srcs: ["foo.aconfig"],
10625 }
10626
10627 aconfig_declarations {
10628 name: "my_aconfig_declarations_bar",
10629 package: "com.example.package",
10630 container: "myapex",
10631 srcs: ["bar.aconfig"],
10632 }
10633
10634 aconfig_declarations {
10635 name: "my_aconfig_declarations_baz",
10636 package: "com.example.package",
10637 container: "myapex",
10638 srcs: ["baz.aconfig"],
10639 }
10640
10641 rust_aconfig_library {
10642 name: "libmy_rust_aconfig_library_foo",
10643 aconfig_declarations: "my_aconfig_declarations_foo",
10644 crate_name: "my_rust_aconfig_library_foo",
10645 apex_available: [
10646 "myapex",
10647 ],
10648 }
10649
10650 rust_aconfig_library {
10651 name: "libmy_rust_aconfig_library_bar",
10652 aconfig_declarations: "my_aconfig_declarations_bar",
10653 crate_name: "my_rust_aconfig_library_bar",
10654 apex_available: [
10655 "myapex",
10656 ],
10657 }
10658
10659 rust_aconfig_library {
10660 name: "libmy_rust_aconfig_library_baz",
10661 aconfig_declarations: "my_aconfig_declarations_baz",
10662 crate_name: "my_rust_aconfig_library_baz",
10663 apex_available: [
10664 "myapex",
10665 ],
10666 }
10667 `)
10668
10669 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10670 s := mod.Rule("apexRule").Args["copy_commands"]
10671 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010672 if len(copyCmds) != 38 {
10673 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010674 }
10675
Jooyung Hana3fddf42024-09-03 13:22:21 +090010676 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10677 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10678 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10679 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010680 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010681
Yu Liubba555e2024-02-17 00:36:42 +000010682 inputs := []string{
10683 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010684 "my_aconfig_declarations_bar/intermediate.pb",
10685 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010686 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10687 }
10688 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10689 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10690 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10691 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010692 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010693}
10694
10695func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10696 aconfigRule := mod.Description(desc)
10697 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010698 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010699 if len(aconfigArgs) != len(inputs) {
10700 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010701 }
Yu Liucec0e412023-11-30 16:45:50 -080010702
Yu Liubba555e2024-02-17 00:36:42 +000010703 ensureEquals(t, container, aconfigRule.Args["container"])
10704 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10705
10706 buildParams := aconfigRule.BuildParams
10707 for _, input := range inputs {
10708 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10709 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010710 }
Yu Liubba555e2024-02-17 00:36:42 +000010711
10712 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010713}
10714
Yu Liueae7b362023-11-16 17:05:47 -080010715func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010716 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010717 ctx := testApex(t, apex_default_bp+`
10718 apex {
10719 name: "myapex",
10720 manifest: ":myapex.manifest",
10721 androidManifest: ":myapex.androidmanifest",
10722 key: "myapex.key",
10723 java_libs: [
10724 "my_java_library_foo",
10725 "other_java_library_bar",
10726 ],
10727 updatable: false,
10728 }
10729
10730 java_library {
10731 name: "my_java_library_foo",
10732 srcs: ["foo/bar/MyClass.java"],
10733 sdk_version: "none",
10734 system_modules: "none",
10735 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010736 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010737 "myapex",
10738 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010739 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010740 }
10741
10742 java_library {
10743 name: "other_java_library_bar",
10744 srcs: ["foo/bar/MyClass.java"],
10745 sdk_version: "none",
10746 system_modules: "none",
10747 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010748 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010749 "myapex",
10750 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010751 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010752 }
10753
10754 aconfig_declarations {
10755 name: "my_aconfig_declarations_foo",
10756 package: "com.example.package",
10757 container: "myapex",
10758 srcs: ["foo.aconfig"],
10759 }
10760
10761 java_aconfig_library {
10762 name: "my_java_aconfig_library_foo",
10763 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010764 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010765 "myapex",
10766 ],
10767 }
10768
10769 aconfig_declarations {
10770 name: "other_aconfig_declarations_bar",
10771 package: "com.example.package",
10772 container: "otherapex",
10773 srcs: ["bar.aconfig"],
10774 }
10775
10776 java_aconfig_library {
10777 name: "other_java_aconfig_library_bar",
10778 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010779 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010780 "myapex",
10781 ],
10782 }
10783 `)
10784
10785 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10786 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10787 s := " " + combineAconfigRule.Args["cache_files"]
10788 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10789 if len(aconfigArgs) != 1 {
10790 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10791 }
10792 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10793
10794 buildParams := combineAconfigRule.BuildParams
10795 if len(buildParams.Inputs) != 1 {
10796 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10797 }
10798 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10799 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10800}
10801
10802func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010803 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010804 ctx := testApex(t, apex_default_bp+`
10805 apex {
10806 name: "myapex",
10807 manifest: ":myapex.manifest",
10808 androidManifest: ":myapex.androidmanifest",
10809 key: "myapex.key",
10810 java_libs: [
10811 "my_java_library_foo",
10812 "my_java_library_bar",
10813 ],
10814 updatable: false,
10815 }
10816
10817 java_library {
10818 name: "my_java_library_foo",
10819 srcs: ["foo/bar/MyClass.java"],
10820 sdk_version: "none",
10821 system_modules: "none",
10822 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010823 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010824 "myapex",
10825 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010826 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010827 }
10828
10829 java_library {
10830 name: "my_java_library_bar",
10831 srcs: ["foo/bar/MyClass.java"],
10832 sdk_version: "none",
10833 system_modules: "none",
10834 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010835 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010836 "myapex",
10837 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010838 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010839 }
10840
10841 aconfig_declarations {
10842 name: "my_aconfig_declarations_foo",
10843 package: "com.example.package",
10844 container: "myapex",
10845 srcs: ["foo.aconfig"],
10846 }
10847
10848 java_aconfig_library {
10849 name: "my_java_aconfig_library_foo",
10850 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010851 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010852 "myapex",
10853 ],
10854 }
10855
10856 java_aconfig_library {
10857 name: "my_java_aconfig_library_bar",
10858 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010859 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010860 "myapex",
10861 ],
10862 }
10863 `)
10864
10865 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10866 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10867 s := " " + combineAconfigRule.Args["cache_files"]
10868 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10869 if len(aconfigArgs) != 1 {
10870 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10871 }
10872 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10873
10874 buildParams := combineAconfigRule.BuildParams
10875 if len(buildParams.Inputs) != 1 {
10876 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10877 }
10878 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10879 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10880}
Spandan Das5be63332023-12-13 00:06:32 +000010881
10882// Test that the boot jars come from the _selected_ apex prebuilt
10883// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10884func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010885 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010886 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10887 t.Helper()
10888 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10889 foundLibfooJar := false
10890 base := stem + ".jar"
10891 for _, output := range s.AllOutputs() {
10892 if filepath.Base(output) == base {
10893 foundLibfooJar = true
10894 buildRule := s.Output(output)
10895 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10896 }
10897 }
10898 if !foundLibfooJar {
10899 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10900 }
10901 }
10902
Spandan Das64c9e0c2023-12-20 20:13:34 +000010903 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10904 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10905 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10906 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10907 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10908 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)
10909 }
10910
10911 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10912 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10913 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10914 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10915 }
10916
Spandan Das5be63332023-12-13 00:06:32 +000010917 bp := `
10918 // Source APEX.
10919
10920 java_library {
10921 name: "framework-foo",
10922 srcs: ["foo.java"],
10923 installable: true,
10924 apex_available: [
10925 "com.android.foo",
10926 ],
10927 }
10928
10929 bootclasspath_fragment {
10930 name: "foo-bootclasspath-fragment",
10931 contents: ["framework-foo"],
10932 apex_available: [
10933 "com.android.foo",
10934 ],
10935 hidden_api: {
10936 split_packages: ["*"],
10937 },
10938 }
10939
10940 apex_key {
10941 name: "com.android.foo.key",
10942 public_key: "com.android.foo.avbpubkey",
10943 private_key: "com.android.foo.pem",
10944 }
10945
10946 apex {
10947 name: "com.android.foo",
10948 key: "com.android.foo.key",
10949 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10950 updatable: false,
10951 }
10952
10953 // Prebuilt APEX.
10954
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010955 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010956 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010957 public: {
10958 jars: ["foo.jar"],
10959 },
Spandan Das5be63332023-12-13 00:06:32 +000010960 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010961 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010962 }
10963
10964 prebuilt_bootclasspath_fragment {
10965 name: "foo-bootclasspath-fragment",
10966 contents: ["framework-foo"],
10967 hidden_api: {
10968 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10969 metadata: "my-bootclasspath-fragment/metadata.csv",
10970 index: "my-bootclasspath-fragment/index.csv",
10971 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10972 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10973 },
10974 apex_available: [
10975 "com.android.foo",
10976 ],
10977 }
10978
10979 prebuilt_apex {
10980 name: "com.android.foo",
10981 apex_name: "com.android.foo",
10982 src: "com.android.foo-arm.apex",
10983 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10984 }
10985
10986 // Another Prebuilt ART APEX
10987 prebuilt_apex {
10988 name: "com.android.foo.v2",
10989 apex_name: "com.android.foo", // Used to determine the API domain
10990 src: "com.android.foo-arm.apex",
10991 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10992 }
10993
10994 // APEX contribution modules
10995
10996 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010997 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010998 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010999 contents: ["com.android.foo"],
11000 }
11001
11002 apex_contributions {
11003 name: "foo.prebuilt.contributions",
11004 api_domain: "com.android.foo",
11005 contents: ["prebuilt_com.android.foo"],
11006 }
11007
11008 apex_contributions {
11009 name: "foo.prebuilt.v2.contributions",
11010 api_domain: "com.android.foo",
11011 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011012 }
11013 `
11014
11015 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011016 desc string
11017 selectedApexContributions string
11018 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011019 }{
11020 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011021 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11022 selectedApexContributions: "foo.source.contributions",
11023 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011024 },
11025 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011026 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11027 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011028 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 +000011029 },
11030 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011031 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11032 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011033 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 +000011034 },
11035 }
11036
11037 fragment := java.ApexVariantReference{
11038 Apex: proptools.StringPtr("com.android.foo"),
11039 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11040 }
11041
11042 for _, tc := range testCases {
11043 preparer := android.GroupFixturePreparers(
11044 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11045 android.FixtureMergeMockFs(map[string][]byte{
11046 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11047 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011048 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11049 // file creation.
11050 java.FixtureConfigureBootJars("platform:foo"),
11051 android.FixtureModifyMockFS(func(fs android.MockFS) {
11052 fs["platform/Android.bp"] = []byte(`
11053 java_library {
11054 name: "foo",
11055 srcs: ["Test.java"],
11056 compile_dex: true,
11057 }
11058 `)
11059 fs["platform/Test.java"] = nil
11060 }),
11061
Colin Crossa66b4632024-08-08 15:50:47 -070011062 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011063 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011064 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011065 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011066 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11067 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011068 }
11069}
Spandan Das3576e762024-01-03 18:57:03 +000011070
11071// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11072// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11073func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011074 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011075 // for a mainline module family, check that only the flagged soong module is visible to make
11076 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11077 variation := func(moduleName string) string {
11078 ret := "android_common_com.android.foo"
11079 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011080 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011081 }
11082 return ret
11083 }
11084
11085 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11086 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11087
11088 for _, hiddenModuleName := range hiddenModuleNames {
11089 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11090 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11091
11092 }
11093 }
11094
11095 bp := `
11096 apex_key {
11097 name: "com.android.foo.key",
11098 public_key: "com.android.foo.avbpubkey",
11099 private_key: "com.android.foo.pem",
11100 }
11101
11102 // AOSP source apex
11103 apex {
11104 name: "com.android.foo",
11105 key: "com.android.foo.key",
11106 updatable: false,
11107 }
11108
11109 // Google source apex
11110 override_apex {
11111 name: "com.google.android.foo",
11112 base: "com.android.foo",
11113 key: "com.android.foo.key",
11114 }
11115
11116 // Prebuilt Google APEX.
11117
11118 prebuilt_apex {
11119 name: "com.google.android.foo",
11120 apex_name: "com.android.foo",
11121 src: "com.android.foo-arm.apex",
11122 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11123 }
11124
11125 // Another Prebuilt Google APEX
11126 prebuilt_apex {
11127 name: "com.google.android.foo.v2",
11128 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011129 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011130 src: "com.android.foo-arm.apex",
11131 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11132 }
11133
11134 // APEX contribution modules
11135
11136 apex_contributions {
11137 name: "foo.source.contributions",
11138 api_domain: "com.android.foo",
11139 contents: ["com.google.android.foo"],
11140 }
11141
11142 apex_contributions {
11143 name: "foo.prebuilt.contributions",
11144 api_domain: "com.android.foo",
11145 contents: ["prebuilt_com.google.android.foo"],
11146 }
11147
11148 apex_contributions {
11149 name: "foo.prebuilt.v2.contributions",
11150 api_domain: "com.android.foo",
11151 contents: ["prebuilt_com.google.android.foo.v2"],
11152 }
11153
11154 // This is an incompatible module because it selects multiple versions of the same mainline module
11155 apex_contributions {
11156 name: "foo.prebuilt.duplicate.contributions",
11157 api_domain: "com.android.foo",
11158 contents: [
11159 "prebuilt_com.google.android.foo",
11160 "prebuilt_com.google.android.foo.v2",
11161 ],
11162 }
11163 `
11164
11165 testCases := []struct {
11166 desc string
11167 selectedApexContributions string
11168 expectedVisibleModuleName string
11169 expectedHiddenModuleNames []string
11170 expectedError string
11171 }{
11172 {
11173 desc: "Source apex is selected, prebuilts should be hidden from make",
11174 selectedApexContributions: "foo.source.contributions",
11175 expectedVisibleModuleName: "com.google.android.foo",
11176 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11177 },
11178 {
11179 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11180 selectedApexContributions: "foo.prebuilt.contributions",
11181 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11182 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11183 },
11184 {
11185 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11186 selectedApexContributions: "foo.prebuilt.v2.contributions",
11187 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11188 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11189 },
11190 {
11191 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11192 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11193 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11194 },
11195 }
11196
11197 for _, tc := range testCases {
11198 preparer := android.GroupFixturePreparers(
11199 android.FixtureMergeMockFs(map[string][]byte{
11200 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11201 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011202 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011203 )
11204 if tc.expectedError != "" {
11205 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11206 testApex(t, bp, preparer)
11207 return
11208 }
11209 ctx := testApex(t, bp, preparer)
11210
Spandan Das3576e762024-01-03 18:57:03 +000011211 // Check that
11212 // 1. The contents of the selected apex_contributions are visible to make
11213 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11214 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11215 }
11216}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011217
Spandan Das85bd4622024-08-01 00:51:20 +000011218// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11219func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011220 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011221 // for a mainline module family, check that only the flagged soong module is visible to make
11222 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11223 variation := func(moduleName string) string {
11224 ret := "android_common_com.android.adservices"
11225 if moduleName == "com.google.android.foo" {
11226 ret = "android_common_com.google.android.foo_com.google.android.foo"
11227 }
11228 return ret
11229 }
11230
11231 for _, visibleModuleName := range visibleModuleNames {
11232 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11233 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11234 }
11235
11236 for _, hiddenModuleName := range hiddenModuleNames {
11237 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11238 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11239
11240 }
11241 }
11242
11243 bp := `
11244 apex_key {
11245 name: "com.android.adservices.key",
11246 public_key: "com.android.adservices.avbpubkey",
11247 private_key: "com.android.adservices.pem",
11248 }
11249
11250 // AOSP source apex
11251 apex {
11252 name: "com.android.adservices",
11253 key: "com.android.adservices.key",
11254 updatable: false,
11255 }
11256
11257 // Prebuilt Google APEX.
11258
11259 prebuilt_apex {
11260 name: "com.google.android.adservices",
11261 apex_name: "com.android.adservices",
11262 src: "com.android.foo-arm.apex",
11263 }
11264
11265 // Another Prebuilt Google APEX
11266 prebuilt_apex {
11267 name: "com.google.android.adservices.v2",
11268 apex_name: "com.android.adservices",
11269 src: "com.android.foo-arm.apex",
11270 }
11271
11272 // APEX contribution modules
11273
11274
11275 apex_contributions {
11276 name: "adservices.prebuilt.contributions",
11277 api_domain: "com.android.adservices",
11278 contents: ["prebuilt_com.google.android.adservices"],
11279 }
11280
11281 apex_contributions {
11282 name: "adservices.prebuilt.v2.contributions",
11283 api_domain: "com.android.adservices",
11284 contents: ["prebuilt_com.google.android.adservices.v2"],
11285 }
11286 `
11287
11288 testCases := []struct {
11289 desc string
11290 selectedApexContributions string
11291 expectedVisibleModuleNames []string
11292 expectedHiddenModuleNames []string
11293 }{
11294 {
11295 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11296 selectedApexContributions: "",
11297 expectedVisibleModuleNames: []string{"com.android.adservices"},
11298 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11299 },
11300 {
11301 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11302 selectedApexContributions: "adservices.prebuilt.contributions",
11303 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11304 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11305 },
11306 {
11307 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11308 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11309 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11310 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11311 },
11312 }
11313
11314 for _, tc := range testCases {
11315 preparer := android.GroupFixturePreparers(
11316 android.FixtureMergeMockFs(map[string][]byte{
11317 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11318 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011319 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011320 )
11321 ctx := testApex(t, bp, preparer)
11322
11323 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11324 }
11325}
11326
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011327func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011328 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011329 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11330 for _, moduleName := range moduleNames {
11331 ret += fmt.Sprintf(`
11332 aconfig_declarations {
11333 name: "%[1]s",
11334 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011335 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011336 srcs: [
11337 "%[1]s.aconfig",
11338 ],
11339 }
11340 java_aconfig_library {
11341 name: "%[1]s-lib",
11342 aconfig_declarations: "%[1]s",
11343 }
11344 `, moduleName)
11345 }
11346 return ret
11347 }
11348
11349 result := android.GroupFixturePreparers(
11350 prepareForApexTest,
11351 java.PrepareForTestWithJavaSdkLibraryFiles,
11352 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011353 ).RunTestWithBp(t, `
11354 java_library {
11355 name: "baz-java-lib",
11356 static_libs: [
11357 "baz-lib",
11358 ],
11359 }
11360 filegroup {
11361 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011362 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011363 ":qux-lib{.generated_srcjars}",
11364 ],
11365 }
11366 filegroup {
11367 name: "qux-another-filegroup",
11368 srcs: [
11369 ":qux-filegroup",
11370 ],
11371 }
11372 java_library {
11373 name: "quux-java-lib",
11374 srcs: [
11375 "a.java",
11376 ],
11377 libs: [
11378 "quux-lib",
11379 ],
11380 }
11381 java_sdk_library {
11382 name: "foo",
11383 srcs: [
11384 ":qux-another-filegroup",
11385 ],
11386 api_packages: ["foo"],
11387 system: {
11388 enabled: true,
11389 },
11390 module_lib: {
11391 enabled: true,
11392 },
11393 test: {
11394 enabled: true,
11395 },
11396 static_libs: [
11397 "bar-lib",
11398 ],
11399 libs: [
11400 "baz-java-lib",
11401 "quux-java-lib",
11402 ],
11403 aconfig_declarations: [
11404 "bar",
11405 ],
11406 }
11407 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11408
11409 m := result.ModuleForTests("foo.stubs.source", "android_common")
11410 outDir := "out/soong/.intermediates"
11411
11412 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11413 // textproto files
11414 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11415
11416 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11417 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11418 // to aconfig.
11419 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11420 "passed as an input",
11421 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11422
11423 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11424 // to metalava as classpath. Thus the cache file provided by the associated
11425 // aconfig_declarations module "baz" should be passed to aconfig.
11426 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11427 "java_aconfig_library passed as an input",
11428 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11429
11430 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11431 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11432 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11433 "input",
11434 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11435
11436 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11437 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11438 // aconfig_declarations module "quux" should not be passed to aconfig.
11439 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11440 "depend on java_aconfig_library not passed as an input",
11441 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11442}
Cole Faust7c991b42024-05-15 11:17:55 -070011443
11444func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011445 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011446 ctx := testApex(t, `
11447 apex {
11448 name: "myapex",
11449 key: "myapex.key",
11450 prebuilts: ["myetc", "myetc2"],
11451 min_sdk_version: "29",
11452 }
11453 apex_key {
11454 name: "myapex.key",
11455 public_key: "testkey.avbpubkey",
11456 private_key: "testkey.pem",
11457 }
11458
11459 prebuilt_etc {
11460 name: "myetc",
11461 src: "myprebuilt",
11462 filename: "myfilename",
11463 }
11464 prebuilt_etc {
11465 name: "myetc2",
11466 sub_dir: "mysubdir",
11467 src: "myprebuilt",
11468 filename: "myfilename",
11469 }
11470 `, withFiles(android.MockFS{
11471 "packages/modules/common/build/allowed_deps.txt": nil,
11472 }))
11473
11474 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11475 data := android.AndroidMkDataForTest(t, ctx, ab)
11476 var builder strings.Builder
11477 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11478 androidMk := builder.String()
11479
11480 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11481 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11482}
Spandan Das50801e22024-05-13 18:29:45 +000011483
11484func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011485 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011486 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11487 args := module.Rule("apexRule").Args
11488 optFlags := args["opt_flags"]
11489 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11490 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11491 }
11492 }
11493
11494 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11495 t.Helper()
11496 found := false
11497 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11498 if dep == wantDep {
11499 found = true
11500 }
11501 })
11502 if !found {
11503 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11504 }
11505 }
11506
11507 ctx := testApex(t, `
11508 apex {
11509 name: "com.android.apex30",
11510 min_sdk_version: "30",
11511 key: "apex30.key",
11512 java_libs: ["javalib"],
11513 }
11514
11515 java_library {
11516 name: "javalib",
11517 srcs: ["A.java"],
11518 apex_available: ["com.android.apex30"],
11519 min_sdk_version: "30",
11520 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011521 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011522 }
11523
11524 override_apex {
11525 name: "com.mycompany.android.apex30",
11526 base: "com.android.apex30",
11527 }
11528
11529 override_apex {
11530 name: "com.mycompany.android.apex31",
11531 base: "com.android.apex30",
11532 min_sdk_version: "31",
11533 }
11534
11535 apex_key {
11536 name: "apex30.key",
11537 public_key: "testkey.avbpubkey",
11538 private_key: "testkey.pem",
11539 }
11540
11541 `, android.FixtureMergeMockFs(android.MockFS{
11542 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11543 }),
11544 )
11545
11546 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11547 checkMinSdkVersion(t, baseModule, "30")
11548
11549 // Override module, but uses same min_sdk_version
11550 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11551 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11552 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11553 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11554
11555 // Override module, uses different min_sdk_version
11556 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11557 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11558 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11559 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11560}
Spandan Das0b28fa02024-05-28 23:40:17 +000011561
11562func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011563 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011564 context := android.GroupFixturePreparers(
11565 android.PrepareForIntegrationTestWithAndroid,
11566 PrepareForTestWithApexBuildComponents,
11567 android.FixtureMergeMockFs(android.MockFS{
11568 "system/sepolicy/apex/foo-file_contexts": nil,
11569 }),
11570 )
11571 res := context.RunTestWithBp(t, `
11572 apex {
11573 name: "foo",
11574 key: "myapex.key",
11575 apex_available_name: "com.android.foo",
11576 variant_version: "0",
11577 updatable: false,
11578 }
11579 apex_key {
11580 name: "myapex.key",
11581 public_key: "testkey.avbpubkey",
11582 private_key: "testkey.pem",
11583 }
11584 prebuilt_apex {
11585 name: "foo",
11586 src: "foo.apex",
11587 prefer: true,
11588 }
11589 override_apex {
11590 name: "myoverrideapex",
11591 base: "foo",
11592 }
11593 `)
11594
11595 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11596}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011597
11598func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011599 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011600 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`, `
11601 apex {
11602 name: "myapex",
11603 key: "myapex.key",
11604 updatable: true,
11605 min_sdk_version: "current",
11606 }
11607
11608 apex_key {
11609 name: "myapex.key",
11610 public_key: "testkey.avbpubkey",
11611 private_key: "testkey.pem",
11612 }
11613 `)
11614}
Spandan Das2f68f192024-07-22 19:25:50 +000011615
11616func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011617 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011618 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11619 result := android.GroupFixturePreparers(
11620 prepareForApexTest,
11621 android.PrepareForTestWithAndroidMk,
11622 android.PrepareForTestWithMakevars,
11623 android.FixtureMergeMockFs(fs),
11624 ).RunTest(t)
11625
11626 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011627 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011628
11629 installRules := result.InstallMakeRulesForTesting(t)
11630
11631 var installedlibRule *android.InstallMakeRule
11632 for i, rule := range installRules {
11633 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11634 if installedlibRule != nil {
11635 t.Errorf("Duplicate install rules for %s", rule.Target)
11636 }
11637 installedlibRule = &installRules[i]
11638 }
11639 }
11640 if installedlibRule == nil {
11641 t.Errorf("No install rule found for installedlib")
11642 return
11643 }
11644
11645 if expectLibfooOnSystemLib {
11646 android.AssertStringListContains(t,
11647 "installedlib doesn't have install dependency on libfoo impl",
11648 installedlibRule.OrderOnlyDeps,
11649 "out/target/product/test_device/system/lib/libfoo.so")
11650 } else {
11651 android.AssertStringListDoesNotContain(t,
11652 "installedlib has install dependency on libfoo stub",
11653 installedlibRule.Deps,
11654 "out/target/product/test_device/system/lib/libfoo.so")
11655 android.AssertStringListDoesNotContain(t,
11656 "installedlib has order-only install dependency on libfoo stub",
11657 installedlibRule.OrderOnlyDeps,
11658 "out/target/product/test_device/system/lib/libfoo.so")
11659 }
11660 }
11661
11662 prebuiltLibfooBp := []byte(`
11663 cc_prebuilt_library {
11664 name: "libfoo",
11665 prefer: true,
11666 srcs: ["libfoo.so"],
11667 stubs: {
11668 versions: ["1"],
11669 },
11670 apex_available: ["apexfoo"],
11671 }
11672 `)
11673
11674 apexfooBp := []byte(`
11675 apex {
11676 name: "apexfoo",
11677 key: "apexfoo.key",
11678 native_shared_libs: ["libfoo"],
11679 updatable: false,
11680 compile_multilib: "both",
11681 }
11682 apex_key {
11683 name: "apexfoo.key",
11684 public_key: "testkey.avbpubkey",
11685 private_key: "testkey.pem",
11686 }
11687 `)
11688
11689 installedlibBp := []byte(`
11690 cc_library {
11691 name: "installedlib",
11692 shared_libs: ["libfoo"],
11693 }
11694 `)
11695
11696 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011697 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011698 testFunc(
11699 t,
11700 /*expectLibfooOnSystemLib=*/ false,
11701 android.MockFS{
11702 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11703 "apexfoo/Android.bp": apexfooBp,
11704 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11705 "Android.bp": installedlibBp,
11706 },
11707 )
11708 })
11709
11710 disabledSourceLibfooBp := []byte(`
11711 cc_library {
11712 name: "libfoo",
11713 enabled: false,
11714 stubs: {
11715 versions: ["1"],
11716 },
11717 apex_available: ["apexfoo"],
11718 }
11719 `)
11720
11721 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011722 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011723 testFunc(
11724 t,
11725 /*expectLibfooOnSystemLib=*/ false,
11726 android.MockFS{
11727 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11728 "impl/Android.bp": disabledSourceLibfooBp,
11729 "apexfoo/Android.bp": apexfooBp,
11730 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11731 "Android.bp": installedlibBp,
11732 },
11733 )
11734 })
11735}
Jihoon Kange246bb72024-09-18 22:26:22 +000011736
11737func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011738 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011739 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11740 // in libs of android_app and java_library does not lead to class loader context device/host
11741 // path mismatch errors.
11742 android.GroupFixturePreparers(
11743 prepareForApexTest,
11744 android.PrepareForIntegrationTestWithAndroid,
11745 PrepareForTestWithApexBuildComponents,
11746 android.FixtureModifyEnv(func(env map[string]string) {
11747 env["DISABLE_CONTAINER_CHECK"] = "true"
11748 }),
11749 withFiles(filesForSdkLibrary),
11750 android.FixtureMergeMockFs(android.MockFS{
11751 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11752 }),
11753 ).RunTestWithBp(t, `
11754 apex {
11755 name: "com.android.foo30",
11756 key: "myapex.key",
11757 updatable: true,
11758 bootclasspath_fragments: [
11759 "foo-bootclasspath-fragment",
11760 ],
11761 java_libs: [
11762 "bar",
11763 ],
11764 apps: [
11765 "bar-app",
11766 ],
11767 min_sdk_version: "30",
11768 }
11769 apex_key {
11770 name: "myapex.key",
11771 public_key: "testkey.avbpubkey",
11772 private_key: "testkey.pem",
11773 }
11774 bootclasspath_fragment {
11775 name: "foo-bootclasspath-fragment",
11776 contents: [
11777 "framework-foo",
11778 ],
11779 apex_available: [
11780 "com.android.foo30",
11781 ],
11782 hidden_api: {
11783 split_packages: ["*"]
11784 },
11785 }
11786
11787 java_sdk_library {
11788 name: "framework-foo",
11789 srcs: [
11790 "A.java"
11791 ],
11792 unsafe_ignore_missing_latest_api: true,
11793 apex_available: [
11794 "com.android.foo30",
11795 ],
11796 compile_dex: true,
11797 sdk_version: "core_current",
11798 shared_library: false,
11799 }
11800
11801 java_library {
11802 name: "bar",
11803 srcs: [
11804 "A.java"
11805 ],
11806 libs: [
11807 "framework-foo.impl",
11808 ],
11809 apex_available: [
11810 "com.android.foo30",
11811 ],
11812 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011813 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011814 }
11815
11816 java_library {
11817 name: "baz",
11818 srcs: [
11819 "A.java"
11820 ],
11821 libs: [
11822 "bar",
11823 ],
11824 sdk_version: "core_current",
11825 }
11826
11827 android_app {
11828 name: "bar-app",
11829 srcs: [
11830 "A.java"
11831 ],
11832 libs: [
11833 "baz",
11834 "framework-foo.impl",
11835 ],
11836 apex_available: [
11837 "com.android.foo30",
11838 ],
11839 sdk_version: "core_current",
11840 min_sdk_version: "30",
11841 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011842 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011843 }
11844 `)
11845}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011846
11847// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11848func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011849 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011850 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11851 apex {
11852 name: "myapex",
11853 key: "myapex.key",
11854 systemserverclasspath_fragments: [
11855 "mysystemserverclasspathfragment",
11856 ],
11857 min_sdk_version: "29",
11858 updatable: true,
11859 system_ext_specific: true,
11860 }
11861
11862 apex_key {
11863 name: "myapex.key",
11864 public_key: "testkey.avbpubkey",
11865 private_key: "testkey.pem",
11866 }
11867
11868 java_library {
11869 name: "foo",
11870 srcs: ["b.java"],
11871 min_sdk_version: "29",
11872 installable: true,
11873 apex_available: [
11874 "myapex",
11875 ],
11876 sdk_version: "current",
11877 }
11878
11879 systemserverclasspath_fragment {
11880 name: "mysystemserverclasspathfragment",
11881 contents: [
11882 "foo",
11883 ],
11884 apex_available: [
11885 "myapex",
11886 ],
11887 }
11888 `,
11889 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11890 )
11891}
Spandan Das72d86c62024-10-15 19:27:41 +000011892
11893// partitions should not package the artifacts that are included inside the apex.
11894func TestFilesystemWithApexDeps(t *testing.T) {
11895 t.Parallel()
11896 result := testApex(t, `
11897 android_filesystem {
11898 name: "myfilesystem",
11899 deps: ["myapex"],
11900 }
11901 apex {
11902 name: "myapex",
11903 key: "myapex.key",
11904 binaries: ["binfoo"],
11905 native_shared_libs: ["libfoo"],
11906 apps: ["appfoo"],
11907 updatable: false,
11908 }
11909 apex_key {
11910 name: "myapex.key",
11911 }
11912 cc_binary {
11913 name: "binfoo",
11914 apex_available: ["myapex"],
11915 }
11916 cc_library {
11917 name: "libfoo",
11918 apex_available: ["myapex"],
11919 }
11920 android_app {
11921 name: "appfoo",
11922 sdk_version: "current",
11923 apex_available: ["myapex"],
11924 }
11925 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11926
11927 partition := result.ModuleForTests("myfilesystem", "android_common")
11928 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11929 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11930}
Colin Crossb614cd42024-10-11 12:52:21 -070011931
11932func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11933 t.Parallel()
11934
11935 extractDepenencyPathFromErrors := func(errs []error) []string {
11936 i := slices.IndexFunc(errs, func(err error) bool {
11937 return strings.Contains(err.Error(), "dependency path:")
11938 })
11939 if i < 0 {
11940 return nil
11941 }
11942 var dependencyPath []string
11943 for _, err := range errs[i+1:] {
11944 s := err.Error()
11945 lastSpace := strings.LastIndexByte(s, ' ')
11946 if lastSpace >= 0 {
11947 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11948 }
11949 }
11950 return dependencyPath
11951 }
11952
11953 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11954 return func(t *testing.T, result *android.TestResult) {
11955 t.Helper()
11956 if len(result.Errs) == 0 {
11957 t.Fatalf("expected errors")
11958 }
11959 t.Log("found errors:")
11960 for _, err := range result.Errs {
11961 t.Log(err)
11962 }
11963 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11964 t.Fatalf("expected error %q, got %q", w, g)
11965 }
11966 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11967 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11968 t.Errorf("expected dependency path %q, got %q", w, g)
11969 }
11970 }
11971 }
11972
11973 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11974 return func(bp *bpmodify.Blueprint) {
11975 m := bp.ModulesByName(module)
11976 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11977 if err != nil {
11978 panic(err)
11979 }
11980 props.AddStringToList(lib)
11981 }
11982 }
11983
11984 bpTemplate := `
11985 apex {
11986 name: "myapex",
11987 key: "myapex.key",
11988 native_shared_libs: ["mylib"],
11989 rust_dyn_libs: ["libmyrust"],
11990 binaries: ["mybin", "myrustbin"],
11991 jni_libs: ["libjni"],
11992 apps: ["myapp"],
11993 updatable: false,
11994 }
11995
11996 apex {
11997 name: "otherapex",
11998 key: "myapex.key",
11999 native_shared_libs: ["libotherapex"],
12000 updatable: false,
12001 }
12002
12003 apex_key {
12004 name: "myapex.key",
12005 public_key: "testkey.avbpubkey",
12006 private_key: "testkey.pem",
12007 }
12008
12009 cc_library {
12010 name: "mylib",
12011 srcs: ["foo.cpp"],
12012 apex_available: ["myapex"],
12013 }
12014
12015 cc_binary {
12016 name: "mybin",
12017 srcs: ["foo.cpp"],
12018 apex_available: ["myapex"],
12019 }
12020
12021 rust_library {
12022 name: "libmyrust",
12023 crate_name: "myrust",
12024 srcs: ["src/lib.rs"],
12025 rustlibs: ["libmyrust_transitive_dylib"],
12026 rlibs: ["libmyrust_transitive_rlib"],
12027 apex_available: ["myapex"],
12028 }
12029
12030 rust_library{
12031 name: "libmyrust_transitive_dylib",
12032 crate_name: "myrust_transitive_dylib",
12033 srcs: ["src/lib.rs"],
12034 apex_available: ["myapex"],
12035 }
12036
12037 rust_library {
12038 name: "libmyrust_transitive_rlib",
12039 crate_name: "myrust_transitive_rlib",
12040 srcs: ["src/lib.rs"],
12041 apex_available: ["myapex"],
12042 }
12043
12044 rust_binary {
12045 name: "myrustbin",
12046 srcs: ["src/main.rs"],
12047 apex_available: ["myapex"],
12048 }
12049
12050 cc_library {
12051 name: "libbar",
12052 sdk_version: "current",
12053 srcs: ["bar.cpp"],
12054 apex_available: ["myapex"],
12055 stl: "none",
12056 }
12057
12058 android_app {
12059 name: "myapp",
12060 jni_libs: ["libembeddedjni"],
12061 use_embedded_native_libs: true,
12062 sdk_version: "current",
12063 apex_available: ["myapex"],
12064 }
12065
12066 cc_library {
12067 name: "libembeddedjni",
12068 sdk_version: "current",
12069 srcs: ["bar.cpp"],
12070 apex_available: ["myapex"],
12071 stl: "none",
12072 }
12073
12074 cc_library {
12075 name: "libjni",
12076 sdk_version: "current",
12077 srcs: ["bar.cpp"],
12078 apex_available: ["myapex"],
12079 stl: "none",
12080 }
12081
12082 cc_library {
12083 name: "libotherapex",
12084 sdk_version: "current",
12085 srcs: ["otherapex.cpp"],
12086 apex_available: ["otherapex"],
12087 stubs: {
12088 symbol_file: "libotherapex.map.txt",
12089 versions: ["1", "2", "3"],
12090 },
12091 stl: "none",
12092 }
12093
12094 cc_library {
12095 name: "libplatform",
12096 sdk_version: "current",
12097 srcs: ["libplatform.cpp"],
12098 stubs: {
12099 symbol_file: "libplatform.map.txt",
12100 versions: ["1", "2", "3"],
12101 },
12102 stl: "none",
12103 system_shared_libs: [],
12104 }
12105 `
12106
12107 testCases := []struct {
12108 name string
12109 bpModifier func(bp *bpmodify.Blueprint)
12110 dependencyPath []string
12111 }{
12112 {
12113 name: "library dependency in other apex",
12114 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12115 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12116 },
12117 {
12118 name: "transitive library dependency in other apex",
12119 bpModifier: func(bp *bpmodify.Blueprint) {
12120 addToSharedLibs("mylib", "libbar")(bp)
12121 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12122 },
12123 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12124 },
12125 {
12126 name: "library dependency in platform",
12127 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12128 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12129 },
12130 {
12131 name: "jni library dependency in other apex",
12132 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12133 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12134 },
12135 {
12136 name: "transitive jni library dependency in other apex",
12137 bpModifier: func(bp *bpmodify.Blueprint) {
12138 addToSharedLibs("libjni", "libbar")(bp)
12139 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12140 },
12141 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12142 },
12143 {
12144 name: "jni library dependency in platform",
12145 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12146 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12147 },
12148 {
12149 name: "transitive jni library dependency in platform",
12150 bpModifier: func(bp *bpmodify.Blueprint) {
12151 addToSharedLibs("libjni", "libbar")(bp)
12152 addToSharedLibs("libbar", "libplatform#impl")(bp)
12153 },
12154 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12155 },
Spandan Das10c41362024-12-03 01:33:09 +000012156 {
12157 name: "app jni library dependency in other apex",
12158 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12159 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12160 },
12161 {
12162 name: "transitive app jni library dependency in other apex",
12163 bpModifier: func(bp *bpmodify.Blueprint) {
12164 addToSharedLibs("libembeddedjni", "libbar")(bp)
12165 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12166 },
12167 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12168 },
12169 {
12170 name: "app jni library dependency in platform",
12171 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12172 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12173 },
12174 {
12175 name: "transitive app jni library dependency in platform",
12176 bpModifier: func(bp *bpmodify.Blueprint) {
12177 addToSharedLibs("libembeddedjni", "libbar")(bp)
12178 addToSharedLibs("libbar", "libplatform#impl")(bp)
12179 },
12180 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12181 },
Colin Crossb614cd42024-10-11 12:52:21 -070012182 {
12183 name: "binary dependency in other apex",
12184 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12185 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12186 },
12187 {
12188 name: "transitive binary dependency in other apex",
12189 bpModifier: func(bp *bpmodify.Blueprint) {
12190 addToSharedLibs("mybin", "libbar")(bp)
12191 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12192 },
12193 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12194 },
12195 {
12196 name: "binary dependency in platform",
12197 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12198 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12199 },
12200 {
12201 name: "transitive binary dependency in platform",
12202 bpModifier: func(bp *bpmodify.Blueprint) {
12203 addToSharedLibs("mybin", "libbar")(bp)
12204 addToSharedLibs("libbar", "libplatform#impl")(bp)
12205 },
12206 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12207 },
12208
12209 {
12210 name: "rust library dependency in other apex",
12211 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12212 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12213 },
12214 {
12215 name: "transitive rust library dependency in other apex",
12216 bpModifier: func(bp *bpmodify.Blueprint) {
12217 addToSharedLibs("libmyrust", "libbar")(bp)
12218 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12219 },
12220 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12221 },
12222 {
12223 name: "rust library dependency in platform",
12224 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12225 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12226 },
12227 {
12228 name: "transitive rust library dependency in platform",
12229 bpModifier: func(bp *bpmodify.Blueprint) {
12230 addToSharedLibs("libmyrust", "libbar")(bp)
12231 addToSharedLibs("libbar", "libplatform#impl")(bp)
12232 },
12233 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12234 },
12235 {
12236 name: "transitive rust library dylib dependency in other apex",
12237 bpModifier: func(bp *bpmodify.Blueprint) {
12238 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12239 },
12240 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12241 },
12242 {
12243 name: "transitive rust library dylib dependency in platform",
12244 bpModifier: func(bp *bpmodify.Blueprint) {
12245 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12246 },
12247 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12248 },
12249 {
12250 name: "transitive rust library rlib dependency in other apex",
12251 bpModifier: func(bp *bpmodify.Blueprint) {
12252 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12253 },
12254 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12255 },
12256 {
12257 name: "transitive rust library rlib dependency in platform",
12258 bpModifier: func(bp *bpmodify.Blueprint) {
12259 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12260 },
12261 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12262 },
12263 {
12264 name: "rust binary dependency in other apex",
12265 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12266 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12267 },
12268 {
12269 name: "transitive rust binary dependency in other apex",
12270 bpModifier: func(bp *bpmodify.Blueprint) {
12271 addToSharedLibs("myrustbin", "libbar")(bp)
12272 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12273 },
12274 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12275 },
12276 {
12277 name: "rust binary dependency in platform",
12278 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12279 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12280 },
12281 {
12282 name: "transitive rust binary dependency in platform",
12283 bpModifier: func(bp *bpmodify.Blueprint) {
12284 addToSharedLibs("myrustbin", "libbar")(bp)
12285 addToSharedLibs("libbar", "libplatform#impl")(bp)
12286 },
12287 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12288 },
12289 }
12290
12291 for _, testCase := range testCases {
12292 t.Run(testCase.name, func(t *testing.T) {
12293 t.Parallel()
12294 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12295 if err != nil {
12296 t.Fatal(err)
12297 }
12298 if testCase.bpModifier != nil {
12299 func() {
12300 defer func() {
12301 if r := recover(); r != nil {
12302 t.Fatalf("panic in bpModifier: %v", r)
12303 }
12304 }()
12305 testCase.bpModifier(bp)
12306 }()
12307 }
12308 android.GroupFixturePreparers(
12309 android.PrepareForTestWithAndroidBuildComponents,
12310 cc.PrepareForTestWithCcBuildComponents,
12311 java.PrepareForTestWithDexpreopt,
12312 rust.PrepareForTestWithRustDefaultModules,
12313 PrepareForTestWithApexBuildComponents,
12314 prepareForTestWithMyapex,
12315 prepareForTestWithOtherapex,
12316 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12317 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12318 }),
12319 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12320 RunTestWithBp(t, bp.String())
12321 })
12322 }
12323}