blob: 12cf6a6939c2fe8913ff956b586045ff611bb51a [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: [],
5821 static_executable: true,
5822 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005823 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005824 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005825
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005826 cc_library {
5827 name: "mylib",
5828 srcs: ["mylib.cpp"],
5829 system_shared_libs: [],
5830 stl: "none",
5831 }
5832
Liz Kammer5bd365f2020-05-27 15:15:11 -07005833 filegroup {
5834 name: "fg2",
5835 srcs: [
5836 "testdata/baz"
5837 ],
5838 }
Roland Levillain630846d2019-06-26 12:48:34 +01005839 `)
5840
Jooyung Hana0503a52023-08-23 13:12:50 +09005841 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005842 copyCmds := apexRule.Args["copy_commands"]
5843
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005844 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005845 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005846 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005847
Liz Kammer1c14a212020-05-12 15:26:55 -07005848 //Ensure that test data are copied into apex.
5849 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5850 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5851
Roland Levillainf89cd092019-07-29 16:22:59 +01005852 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005853 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005854 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005855 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005856 prefix := "TARGET_"
5857 var builder strings.Builder
5858 data.Custom(&builder, name, prefix, "", data)
5859 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005860 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005861 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005862}
5863
Jooyung Hand48f3c32019-08-23 11:18:57 +09005864func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005865 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005866 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5867 apex {
5868 name: "myapex",
5869 key: "myapex.key",
5870 native_shared_libs: ["libfoo"],
5871 }
5872
5873 apex_key {
5874 name: "myapex.key",
5875 public_key: "testkey.avbpubkey",
5876 private_key: "testkey.pem",
5877 }
5878
5879 cc_library {
5880 name: "libfoo",
5881 stl: "none",
5882 system_shared_libs: [],
5883 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005884 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005885 }
5886 `)
5887 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5888 apex {
5889 name: "myapex",
5890 key: "myapex.key",
5891 java_libs: ["myjar"],
5892 }
5893
5894 apex_key {
5895 name: "myapex.key",
5896 public_key: "testkey.avbpubkey",
5897 private_key: "testkey.pem",
5898 }
5899
5900 java_library {
5901 name: "myjar",
5902 srcs: ["foo/bar/MyClass.java"],
5903 sdk_version: "none",
5904 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005905 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005906 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005907 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005908 }
5909 `)
5910}
5911
Bill Peckhama41a6962021-01-11 10:58:54 -08005912func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005913 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005914 apex {
5915 name: "myapex",
5916 key: "myapex.key",
5917 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005918 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005919 }
5920
5921 apex_key {
5922 name: "myapex.key",
5923 public_key: "testkey.avbpubkey",
5924 private_key: "testkey.pem",
5925 }
5926
5927 java_import {
5928 name: "myjavaimport",
5929 apex_available: ["myapex"],
5930 jars: ["my.jar"],
5931 compile_dex: true,
5932 }
5933 `)
5934
Jooyung Hana0503a52023-08-23 13:12:50 +09005935 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005936 apexRule := module.Rule("apexRule")
5937 copyCmds := apexRule.Args["copy_commands"]
5938 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5939}
5940
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005941func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005942 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005943 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944 apex {
5945 name: "myapex",
5946 key: "myapex.key",
5947 apps: [
5948 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005949 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005950 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005951 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005952 }
5953
5954 apex_key {
5955 name: "myapex.key",
5956 public_key: "testkey.avbpubkey",
5957 private_key: "testkey.pem",
5958 }
5959
5960 android_app {
5961 name: "AppFoo",
5962 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005963 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005964 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005965 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005966 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005967 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005968 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005969 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005970
5971 android_app {
5972 name: "AppFooPriv",
5973 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005974 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005975 system_modules: "none",
5976 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005977 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005978 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005979 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005980 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005981
5982 cc_library_shared {
5983 name: "libjni",
5984 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005985 shared_libs: ["libfoo"],
5986 stl: "none",
5987 system_shared_libs: [],
5988 apex_available: [ "myapex" ],
5989 sdk_version: "current",
5990 }
5991
5992 cc_library_shared {
5993 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005994 stl: "none",
5995 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005996 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005997 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005998 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005999 `)
6000
Jooyung Hana0503a52023-08-23 13:12:50 +09006001 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 apexRule := module.Rule("apexRule")
6003 copyCmds := apexRule.Args["copy_commands"]
6004
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006005 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6006 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006007 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006008
Colin Crossaede88c2020-08-11 12:17:01 -07006009 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006010 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006012 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006013 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006014 // JNI libraries including transitive deps are
6015 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006016 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // ... embedded inside APK (jnilibs.zip)
6018 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6019 // ... and not directly inside the APEX
6020 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6021 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006022
6023 apexBundle := module.Module().(*apexBundle)
6024 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6025 var builder strings.Builder
6026 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6027 androidMk := builder.String()
6028 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6029 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6030 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6031 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6032 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6033 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 +01006034}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006035
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006036func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006037 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006038 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6039 for _, id := range invalidBuildIds {
6040 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6041 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6042 variables.BuildId = proptools.StringPtr(id)
6043 })
6044 testApexError(t, message, `apex {
6045 name: "myapex",
6046 key: "myapex.key",
6047 apps: ["AppFooPrebuilt"],
6048 updatable: false,
6049 }
6050
6051 apex_key {
6052 name: "myapex.key",
6053 public_key: "testkey.avbpubkey",
6054 private_key: "testkey.pem",
6055 }
6056
6057 android_app_import {
6058 name: "AppFooPrebuilt",
6059 apk: "PrebuiltAppFoo.apk",
6060 presigned: true,
6061 apex_available: ["myapex"],
6062 }
6063 `, fixture)
6064 }
6065}
6066
Dario Frenicde2a032019-10-27 00:29:22 +01006067func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006068 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006069 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006070 apex {
6071 name: "myapex",
6072 key: "myapex.key",
6073 apps: [
6074 "AppFooPrebuilt",
6075 "AppFooPrivPrebuilt",
6076 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006077 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006078 }
6079
6080 apex_key {
6081 name: "myapex.key",
6082 public_key: "testkey.avbpubkey",
6083 private_key: "testkey.pem",
6084 }
6085
6086 android_app_import {
6087 name: "AppFooPrebuilt",
6088 apk: "PrebuiltAppFoo.apk",
6089 presigned: true,
6090 dex_preopt: {
6091 enabled: false,
6092 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006093 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006094 }
6095
6096 android_app_import {
6097 name: "AppFooPrivPrebuilt",
6098 apk: "PrebuiltAppFooPriv.apk",
6099 privileged: true,
6100 presigned: true,
6101 dex_preopt: {
6102 enabled: false,
6103 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006104 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006105 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006106 }
6107 `)
6108
Jooyung Hana0503a52023-08-23 13:12:50 +09006109 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006110 apexRule := module.Rule("apexRule")
6111 copyCmds := apexRule.Args["copy_commands"]
6112
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006113 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6114 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006115}
6116
6117func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006118 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006119 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006120 apex {
6121 name: "myapex",
6122 key: "myapex.key",
6123 apps: [
6124 "AppFoo",
6125 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006126 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006127 }
6128
6129 apex_key {
6130 name: "myapex.key",
6131 public_key: "testkey.avbpubkey",
6132 private_key: "testkey.pem",
6133 }
6134
6135 android_app {
6136 name: "AppFoo",
6137 srcs: ["foo/bar/MyClass.java"],
6138 sdk_version: "none",
6139 system_modules: "none",
6140 apex_available: [ "myapex" ],
6141 }
6142
6143 android_app_import {
6144 name: "AppFoo",
6145 apk: "AppFooPrebuilt.apk",
6146 filename: "AppFooPrebuilt.apk",
6147 presigned: true,
6148 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006149 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006150 }
6151 `, withFiles(map[string][]byte{
6152 "AppFooPrebuilt.apk": nil,
6153 }))
6154
Jooyung Hana0503a52023-08-23 13:12:50 +09006155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006156 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006157 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006158}
6159
Dario Freni6f3937c2019-12-20 22:58:03 +00006160func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006161 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006162 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006163 apex {
6164 name: "myapex",
6165 key: "myapex.key",
6166 apps: [
6167 "TesterHelpAppFoo",
6168 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006169 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006170 }
6171
6172 apex_key {
6173 name: "myapex.key",
6174 public_key: "testkey.avbpubkey",
6175 private_key: "testkey.pem",
6176 }
6177
6178 android_test_helper_app {
6179 name: "TesterHelpAppFoo",
6180 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006181 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006182 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006183 }
6184
6185 `)
6186
Jooyung Hana0503a52023-08-23 13:12:50 +09006187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006188 apexRule := module.Rule("apexRule")
6189 copyCmds := apexRule.Args["copy_commands"]
6190
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006191 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006192}
6193
Jooyung Han18020ea2019-11-13 10:50:48 +09006194func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006195 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006196 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006197 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006202 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006203 }
6204
6205 apex_key {
6206 name: "myapex.key",
6207 public_key: "testkey.avbpubkey",
6208 private_key: "testkey.pem",
6209 }
6210
6211 apex {
6212 name: "otherapex",
6213 key: "myapex.key",
6214 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006215 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006216 }
6217
6218 cc_defaults {
6219 name: "libfoo-defaults",
6220 apex_available: ["otherapex"],
6221 }
6222
6223 cc_library {
6224 name: "libfoo",
6225 defaults: ["libfoo-defaults"],
6226 stl: "none",
6227 system_shared_libs: [],
6228 }`)
6229}
6230
Paul Duffine52e66f2020-03-30 17:54:29 +01006231func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006232 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006233 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006234 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006235 apex {
6236 name: "myapex",
6237 key: "myapex.key",
6238 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006239 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006240 }
6241
6242 apex_key {
6243 name: "myapex.key",
6244 public_key: "testkey.avbpubkey",
6245 private_key: "testkey.pem",
6246 }
6247
6248 apex {
6249 name: "otherapex",
6250 key: "otherapex.key",
6251 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006252 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 }
6254
6255 apex_key {
6256 name: "otherapex.key",
6257 public_key: "testkey.avbpubkey",
6258 private_key: "testkey.pem",
6259 }
6260
6261 cc_library {
6262 name: "libfoo",
6263 stl: "none",
6264 system_shared_libs: [],
6265 apex_available: ["otherapex"],
6266 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006267
6268 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6269 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6270 testApex(t, `
6271 apex {
6272 name: "com.sdv.myapex",
6273 key: "myapex.key",
6274 native_shared_libs: ["libfoo"],
6275 updatable: false,
6276 product_specific: true,
6277 }
6278
6279 apex_key {
6280 name: "myapex.key",
6281 public_key: "testkey.avbpubkey",
6282 private_key: "testkey.pem",
6283 }
6284
6285 apex {
6286 name: "com.any.otherapex",
6287 key: "otherapex.key",
6288 native_shared_libs: ["libfoo"],
6289 updatable: false,
6290 }
6291
6292 apex_key {
6293 name: "otherapex.key",
6294 public_key: "testkey.avbpubkey",
6295 private_key: "testkey.pem",
6296 }
6297
6298 cc_library {
6299 name: "libfoo",
6300 stl: "none",
6301 system_shared_libs: [],
6302 apex_available: ["com.any.otherapex"],
6303 product_specific: true,
6304 }`,
6305 android.FixtureMergeMockFs(android.MockFS{
6306 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6307 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6308 }))
6309
6310 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6311 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6312 apex {
6313 name: "com.sdv.myapex",
6314 key: "myapex.key",
6315 native_shared_libs: ["libfoo"],
6316 updatable: false,
6317 }
6318
6319 apex_key {
6320 name: "myapex.key",
6321 public_key: "testkey.avbpubkey",
6322 private_key: "testkey.pem",
6323 }
6324
6325 apex {
6326 name: "com.any.otherapex",
6327 key: "otherapex.key",
6328 native_shared_libs: ["libfoo"],
6329 updatable: false,
6330 }
6331
6332 apex_key {
6333 name: "otherapex.key",
6334 public_key: "testkey.avbpubkey",
6335 private_key: "testkey.pem",
6336 }
6337
6338 cc_library {
6339 name: "libfoo",
6340 stl: "none",
6341 system_shared_libs: [],
6342 apex_available: ["com.any.otherapex"],
6343 }`,
6344 android.FixtureMergeMockFs(android.MockFS{
6345 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6346 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6347 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006348}
Jiyong Park127b40b2019-09-30 16:04:35 +09006349
Paul Duffine52e66f2020-03-30 17:54:29 +01006350func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006351 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006352 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006353 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006354.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006355.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006356.*via tag cc\.dependencyTag.*
6357.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006358.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006359.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006360.*via tag cc\.dependencyTag.*
6361.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006362.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006363.*-> libbaz.*link:shared.*
6364.*via tag cc\.dependencyTag.*
6365.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006370 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006371 }
6372
6373 apex_key {
6374 name: "myapex.key",
6375 public_key: "testkey.avbpubkey",
6376 private_key: "testkey.pem",
6377 }
6378
Jiyong Park127b40b2019-09-30 16:04:35 +09006379 cc_library {
6380 name: "libfoo",
6381 stl: "none",
6382 shared_libs: ["libbar"],
6383 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006384 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006385 }
6386
6387 cc_library {
6388 name: "libbar",
6389 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006390 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006391 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006392 apex_available: ["myapex"],
6393 }
6394
6395 cc_library {
6396 name: "libbaz",
6397 stl: "none",
6398 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006399 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006400
6401 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6402 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6403 testApex(t, `
6404 apex {
6405 name: "com.sdv.myapex",
6406 key: "myapex.key",
6407 native_shared_libs: ["libfoo"],
6408 updatable: false,
6409 product_specific: true,
6410 }
6411
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417
6418 cc_library {
6419 name: "libfoo",
6420 stl: "none",
6421 shared_libs: ["libbar"],
6422 system_shared_libs: [],
6423 apex_available: ["com.sdv.myapex"],
6424 product_specific: true,
6425 }
6426
6427 cc_library {
6428 name: "libbar",
6429 stl: "none",
6430 shared_libs: ["libbaz"],
6431 system_shared_libs: [],
6432 apex_available: ["com.sdv.myapex"],
6433 product_specific: true,
6434 }
6435
6436 cc_library {
6437 name: "libbaz",
6438 stl: "none",
6439 system_shared_libs: [],
6440 product_specific: true,
6441 }`,
6442 android.FixtureMergeMockFs(android.MockFS{
6443 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6444 }))
6445
6446 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6447 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6448 apex {
6449 name: "com.sdv.myapex",
6450 key: "myapex.key",
6451 native_shared_libs: ["libfoo"],
6452 updatable: false,
6453 }
6454
6455 apex_key {
6456 name: "myapex.key",
6457 public_key: "testkey.avbpubkey",
6458 private_key: "testkey.pem",
6459 }
6460
6461 cc_library {
6462 name: "libfoo",
6463 stl: "none",
6464 shared_libs: ["libbar"],
6465 system_shared_libs: [],
6466 apex_available: ["com.sdv.myapex"],
6467 }
6468
6469 cc_library {
6470 name: "libbar",
6471 stl: "none",
6472 shared_libs: ["libbaz"],
6473 system_shared_libs: [],
6474 apex_available: ["com.sdv.myapex"],
6475 }
6476
6477 cc_library {
6478 name: "libbaz",
6479 stl: "none",
6480 system_shared_libs: [],
6481 }`,
6482 android.FixtureMergeMockFs(android.MockFS{
6483 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6484 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006485}
Jiyong Park127b40b2019-09-30 16:04:35 +09006486
Liz Kammer5f108fa2023-05-11 14:33:17 -04006487func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006488 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006489 testApex(t, `
6490 apex {
6491 name: "myapex",
6492 key: "myapex.key",
6493 native_shared_libs: ["libfoo"],
6494 updatable: false,
6495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 stl: "none",
6506 static_libs: ["libbar"],
6507 system_shared_libs: [],
6508 apex_available: ["myapex"],
6509 }
6510
6511 cc_library {
6512 name: "libbar",
6513 stl: "none",
6514 shared_libs: ["libbaz"],
6515 system_shared_libs: [],
6516 apex_available: ["myapex"],
6517 }
6518
6519 cc_library {
6520 name: "libbaz",
6521 stl: "none",
6522 system_shared_libs: [],
6523 }`)
6524
6525 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6526 apex {
6527 name: "myapex",
6528 key: "myapex.key",
6529 native_shared_libs: ["libfoo"],
6530 updatable: false,
6531 }
6532
6533 apex_key {
6534 name: "myapex.key",
6535 public_key: "testkey.avbpubkey",
6536 private_key: "testkey.pem",
6537 }
6538
6539 cc_library {
6540 name: "libfoo",
6541 stl: "none",
6542 static_libs: ["libbar"],
6543 system_shared_libs: [],
6544 apex_available: ["myapex"],
6545 }
6546
6547 cc_library {
6548 name: "libbar",
6549 stl: "none",
6550 system_shared_libs: [],
6551 }`)
6552}
6553
Paul Duffine52e66f2020-03-30 17:54:29 +01006554func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006555 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 testApexError(t, "\"otherapex\" is not a valid module name", `
6557 apex {
6558 name: "myapex",
6559 key: "myapex.key",
6560 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006561 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006562 }
6563
6564 apex_key {
6565 name: "myapex.key",
6566 public_key: "testkey.avbpubkey",
6567 private_key: "testkey.pem",
6568 }
6569
6570 cc_library {
6571 name: "libfoo",
6572 stl: "none",
6573 system_shared_libs: [],
6574 apex_available: ["otherapex"],
6575 }`)
6576
Paul Duffine52e66f2020-03-30 17:54:29 +01006577 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006578 apex {
6579 name: "myapex",
6580 key: "myapex.key",
6581 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006582 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006583 }
6584
6585 apex_key {
6586 name: "myapex.key",
6587 public_key: "testkey.avbpubkey",
6588 private_key: "testkey.pem",
6589 }
6590
6591 cc_library {
6592 name: "libfoo",
6593 stl: "none",
6594 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006595 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006596 apex_available: ["myapex"],
6597 }
6598
6599 cc_library {
6600 name: "libbar",
6601 stl: "none",
6602 system_shared_libs: [],
6603 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006604 }
6605
6606 cc_library {
6607 name: "libbaz",
6608 stl: "none",
6609 system_shared_libs: [],
6610 stubs: {
6611 versions: ["10", "20", "30"],
6612 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006613 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006614}
Jiyong Park127b40b2019-09-30 16:04:35 +09006615
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006616func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006617 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006618 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006619 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006620 testApexError(t, "expected an integer between 0-9; got -1", `
6621 apex {
6622 name: "myapex",
6623 key: "myapex.key",
6624 apex_available_name: "com.android.foo",
6625 variant_version: "-1",
6626 updatable: false,
6627 }
6628 apex_key {
6629 name: "myapex.key",
6630 public_key: "testkey.avbpubkey",
6631 private_key: "testkey.pem",
6632 }
6633 `)
6634 })
6635
6636 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006637 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006638 testApexError(t, "expected an integer between 0-9; got 10", `
6639 apex {
6640 name: "myapex",
6641 key: "myapex.key",
6642 apex_available_name: "com.android.foo",
6643 variant_version: "10",
6644 updatable: false,
6645 }
6646 apex_key {
6647 name: "myapex.key",
6648 public_key: "testkey.avbpubkey",
6649 private_key: "testkey.pem",
6650 }
6651 `)
6652 })
6653}
6654
6655func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006656 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006657 context := android.GroupFixturePreparers(
6658 android.PrepareForIntegrationTestWithAndroid,
6659 PrepareForTestWithApexBuildComponents,
6660 android.FixtureMergeMockFs(android.MockFS{
6661 "system/sepolicy/apex/foo-file_contexts": nil,
6662 "system/sepolicy/apex/bar-file_contexts": nil,
6663 }),
6664 )
6665 result := context.RunTestWithBp(t, `
6666 apex {
6667 name: "foo",
6668 key: "myapex.key",
6669 apex_available_name: "com.android.foo",
6670 variant_version: "0",
6671 updatable: false,
6672 }
6673 apex {
6674 name: "bar",
6675 key: "myapex.key",
6676 apex_available_name: "com.android.foo",
6677 variant_version: "3",
6678 updatable: false,
6679 }
6680 apex_key {
6681 name: "myapex.key",
6682 public_key: "testkey.avbpubkey",
6683 private_key: "testkey.pem",
6684 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006685 override_apex {
6686 name: "myoverrideapex",
6687 base: "bar",
6688 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006689 `)
6690
Jooyung Hana0503a52023-08-23 13:12:50 +09006691 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006692 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006693 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6694 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6695 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6696 }
6697
Jooyung Hana0503a52023-08-23 13:12:50 +09006698 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006699 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006700 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6701 barActualDefaultVersion := barManifestRule.Args["default_version"]
6702 if barActualDefaultVersion != barExpectedDefaultVersion {
6703 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6704 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006705
Spandan Das50801e22024-05-13 18:29:45 +00006706 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006707 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6708 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6709 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6710 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006711}
6712
Sam Delmericoca816532023-06-02 14:09:50 -04006713func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006714 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006715 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 -07006716 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006717 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6718 apex {
6719 name: "myapex_sminus",
6720 key: "myapex.key",
6721 apps: ["AppFoo"],
6722 apex_available_name: "myapex",
6723 updatable: false,
6724 }
6725 apex {
6726 name: "myapex",
6727 key: "myapex.key",
6728 apps: ["AppFoo"],
6729 updatable: false,
6730 }
6731 apex_key {
6732 name: "myapex.key",
6733 public_key: "testkey.avbpubkey",
6734 private_key: "testkey.pem",
6735 }
6736 android_app {
6737 name: "AppFoo",
6738 srcs: ["foo/bar/MyClass.java"],
6739 sdk_version: "none",
6740 system_modules: "none",
6741 apex_available: [ "myapex_sminus" ],
6742 }`,
6743 android.FixtureMergeMockFs(android.MockFS{
6744 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6745 }),
6746 )
6747 })
6748
6749 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 -07006750 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006751 testApex(t, `
6752 apex {
6753 name: "myapex_sminus",
6754 key: "myapex.key",
6755 apps: ["AppFoo"],
6756 apex_available_name: "myapex",
6757 updatable: false,
6758 }
6759 apex {
6760 name: "myapex",
6761 key: "myapex.key",
6762 apps: ["AppFoo"],
6763 updatable: false,
6764 }
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770 android_app {
6771 name: "AppFoo",
6772 srcs: ["foo/bar/MyClass.java"],
6773 sdk_version: "none",
6774 system_modules: "none",
6775 apex_available: [ "myapex" ],
6776 }`,
6777 android.FixtureMergeMockFs(android.MockFS{
6778 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6779 }),
6780 )
6781 })
6782
6783 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006784 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006785 testApex(t, `
6786 override_apex {
6787 name: "myoverrideapex_sminus",
6788 base: "myapex_sminus",
6789 key: "myapex.key",
6790 apps: ["AppFooOverride"],
6791 }
6792 override_apex {
6793 name: "myoverrideapex",
6794 base: "myapex",
6795 key: "myapex.key",
6796 apps: ["AppFooOverride"],
6797 }
6798 apex {
6799 name: "myapex_sminus",
6800 key: "myapex.key",
6801 apps: ["AppFoo"],
6802 apex_available_name: "myapex",
6803 updatable: false,
6804 }
6805 apex {
6806 name: "myapex",
6807 key: "myapex.key",
6808 apps: ["AppFoo"],
6809 updatable: false,
6810 }
6811 apex_key {
6812 name: "myapex.key",
6813 public_key: "testkey.avbpubkey",
6814 private_key: "testkey.pem",
6815 }
6816 android_app {
6817 name: "AppFooOverride",
6818 srcs: ["foo/bar/MyClass.java"],
6819 sdk_version: "none",
6820 system_modules: "none",
6821 apex_available: [ "myapex" ],
6822 }
6823 android_app {
6824 name: "AppFoo",
6825 srcs: ["foo/bar/MyClass.java"],
6826 sdk_version: "none",
6827 system_modules: "none",
6828 apex_available: [ "myapex" ],
6829 }`,
6830 android.FixtureMergeMockFs(android.MockFS{
6831 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6832 }),
6833 )
6834 })
6835}
6836
6837func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006838 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006839 context := android.GroupFixturePreparers(
6840 android.PrepareForIntegrationTestWithAndroid,
6841 PrepareForTestWithApexBuildComponents,
6842 java.PrepareForTestWithDexpreopt,
6843 android.FixtureMergeMockFs(android.MockFS{
6844 "system/sepolicy/apex/myapex-file_contexts": nil,
6845 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6846 }),
6847 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6848 variables.BuildId = proptools.StringPtr("buildid")
6849 }),
6850 )
6851 context.RunTestWithBp(t, `
6852 override_apex {
6853 name: "myoverrideapex_sminus",
6854 base: "myapex_sminus",
6855 }
6856 override_apex {
6857 name: "myoverrideapex",
6858 base: "myapex",
6859 }
6860 apex {
6861 name: "myapex",
6862 key: "myapex.key",
6863 apps: ["AppFoo"],
6864 updatable: false,
6865 }
6866 apex {
6867 name: "myapex_sminus",
6868 apex_available_name: "myapex",
6869 key: "myapex.key",
6870 apps: ["AppFoo_sminus"],
6871 updatable: false,
6872 }
6873 apex_key {
6874 name: "myapex.key",
6875 public_key: "testkey.avbpubkey",
6876 private_key: "testkey.pem",
6877 }
6878 android_app {
6879 name: "AppFoo",
6880 srcs: ["foo/bar/MyClass.java"],
6881 sdk_version: "none",
6882 system_modules: "none",
6883 apex_available: [ "myapex" ],
6884 }
6885 android_app {
6886 name: "AppFoo_sminus",
6887 srcs: ["foo/bar/MyClass.java"],
6888 sdk_version: "none",
6889 min_sdk_version: "29",
6890 system_modules: "none",
6891 apex_available: [ "myapex" ],
6892 }`)
6893}
6894
Jiyong Park89e850a2020-04-07 16:37:39 +09006895func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006896 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006897 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006898 apex {
6899 name: "myapex",
6900 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006901 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006902 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006903 }
6904
6905 apex_key {
6906 name: "myapex.key",
6907 public_key: "testkey.avbpubkey",
6908 private_key: "testkey.pem",
6909 }
6910
6911 cc_library {
6912 name: "libfoo",
6913 stl: "none",
6914 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006915 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006916 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006917 }
6918
6919 cc_library {
6920 name: "libfoo2",
6921 stl: "none",
6922 system_shared_libs: [],
6923 shared_libs: ["libbaz"],
6924 apex_available: ["//apex_available:platform"],
6925 }
6926
6927 cc_library {
6928 name: "libbar",
6929 stl: "none",
6930 system_shared_libs: [],
6931 apex_available: ["myapex"],
6932 }
6933
6934 cc_library {
6935 name: "libbaz",
6936 stl: "none",
6937 system_shared_libs: [],
6938 apex_available: ["myapex"],
6939 stubs: {
6940 versions: ["1"],
6941 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006942 }`)
6943
Jiyong Park89e850a2020-04-07 16:37:39 +09006944 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6945 // because it depends on libbar which isn't available to platform
6946 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6947 if libfoo.NotAvailableForPlatform() != true {
6948 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6949 }
6950
6951 // libfoo2 however can be available to platform because it depends on libbaz which provides
6952 // stubs
6953 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6954 if libfoo2.NotAvailableForPlatform() == true {
6955 t.Errorf("%q should be available to platform", libfoo2.String())
6956 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006957}
Jiyong Parka90ca002019-10-07 15:47:24 +09006958
Paul Duffine52e66f2020-03-30 17:54:29 +01006959func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006960 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006961 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006962 apex {
6963 name: "myapex",
6964 key: "myapex.key",
6965 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006966 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006967 }
6968
6969 apex_key {
6970 name: "myapex.key",
6971 public_key: "testkey.avbpubkey",
6972 private_key: "testkey.pem",
6973 }
6974
6975 cc_library {
6976 name: "libfoo",
6977 stl: "none",
6978 system_shared_libs: [],
6979 apex_available: ["myapex"],
6980 static: {
6981 apex_available: ["//apex_available:platform"],
6982 },
6983 }`)
6984
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6986 if libfooShared.NotAvailableForPlatform() != true {
6987 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6988 }
6989 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6990 if libfooStatic.NotAvailableForPlatform() != false {
6991 t.Errorf("%q should be available to platform", libfooStatic.String())
6992 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006993}
6994
Jooyung Han9a419e22024-08-16 17:14:21 +09006995func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006996 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006997
6998 for _, tc := range []struct {
6999 name string
7000 apexAvailable string
7001 expectedError string
7002 }{
7003 {
7004 name: "prefix matches correctly",
7005 apexAvailable: "com.foo.*",
7006 },
7007 {
7008 name: "prefix doesn't match",
7009 apexAvailable: "com.bar.*",
7010 expectedError: `Consider .* "com.foo\.\*"`,
7011 },
7012 {
7013 name: "short prefix",
7014 apexAvailable: "com.*",
7015 expectedError: "requires two or more components",
7016 },
7017 {
7018 name: "wildcard not in the end",
7019 apexAvailable: "com.*.foo",
7020 expectedError: "should end with .*",
7021 },
7022 {
7023 name: "wildcard in the middle",
7024 apexAvailable: "com.foo*.*",
7025 expectedError: "not allowed in the middle",
7026 },
7027 {
7028 name: "hint with prefix pattern",
7029 apexAvailable: "//apex_available:platform",
7030 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7031 },
7032 } {
7033 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007034 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007035 errorHandler := android.FixtureExpectsNoErrors
7036 if tc.expectedError != "" {
7037 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7038 }
7039 context := android.GroupFixturePreparers(
7040 prepareForApexTest,
7041 android.FixtureMergeMockFs(android.MockFS{
7042 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7043 }),
7044 ).ExtendWithErrorHandler(errorHandler)
7045
7046 context.RunTestWithBp(t, `
7047 apex {
7048 name: "com.foo.bar",
7049 key: "myapex.key",
7050 native_shared_libs: ["libfoo"],
7051 updatable: false,
7052 }
7053
7054 apex_key {
7055 name: "myapex.key",
7056 public_key: "testkey.avbpubkey",
7057 private_key: "testkey.pem",
7058 }
7059
7060 cc_library {
7061 name: "libfoo",
7062 stl: "none",
7063 system_shared_libs: [],
7064 apex_available: ["`+tc.apexAvailable+`"],
7065 }`)
7066 })
7067 }
7068 testApexError(t, `Consider adding "com.foo" to`, `
7069 apex {
7070 name: "com.foo", // too short for a partner apex
7071 key: "myapex.key",
7072 native_shared_libs: ["libfoo"],
7073 updatable: false,
7074 }
7075
7076 apex_key {
7077 name: "myapex.key",
7078 public_key: "testkey.avbpubkey",
7079 private_key: "testkey.pem",
7080 }
7081
7082 cc_library {
7083 name: "libfoo",
7084 stl: "none",
7085 system_shared_libs: [],
7086 }
7087 `)
7088}
7089
Jooyung Hanb9518072024-11-22 14:05:20 +09007090func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7091 t.Parallel()
7092 ctx := testApex(t, `
7093 apex_test {
7094 name: "myapex",
7095 key: "myapex.key",
7096 skip_validations: {
7097 host_apex_verifier: true,
7098 },
7099 updatable: false,
7100 }
7101 apex_key {
7102 name: "myapex.key",
7103 public_key: "testkey.avbpubkey",
7104 private_key: "testkey.pem",
7105 }
7106 `)
7107
7108 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7109 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7110 t.Error("should not run host_apex_verifier")
7111 }
7112}
7113
7114func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7115 t.Parallel()
7116 ctx := testApex(t, `
7117 apex_test {
7118 name: "myapex",
7119 key: "myapex.key",
7120 updatable: false,
7121 }
7122 apex_key {
7123 name: "myapex.key",
7124 public_key: "testkey.avbpubkey",
7125 private_key: "testkey.pem",
7126 }
7127 `)
7128
7129 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7130 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7131 t.Error("should run host_apex_verifier")
7132 }
7133}
7134
Jiyong Park5d790c32019-11-15 18:40:32 +09007135func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007137 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007138 apex {
7139 name: "myapex",
7140 key: "myapex.key",
7141 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007142 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007143 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007144 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007145 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007146 }
7147
7148 override_apex {
7149 name: "override_myapex",
7150 base: "myapex",
7151 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007152 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007153 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007154 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007155 compile_multilib: "first",
7156 multilib: {
7157 lib32: {
7158 native_shared_libs: ["mylib32"],
7159 },
7160 lib64: {
7161 native_shared_libs: ["mylib64"],
7162 },
7163 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007164 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007165 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007166 key: "mynewapex.key",
7167 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007168 }
7169
7170 apex_key {
7171 name: "myapex.key",
7172 public_key: "testkey.avbpubkey",
7173 private_key: "testkey.pem",
7174 }
7175
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007176 apex_key {
7177 name: "mynewapex.key",
7178 public_key: "testkey2.avbpubkey",
7179 private_key: "testkey2.pem",
7180 }
7181
7182 android_app_certificate {
7183 name: "myapex.certificate",
7184 certificate: "testkey",
7185 }
7186
Jiyong Park5d790c32019-11-15 18:40:32 +09007187 android_app {
7188 name: "app",
7189 srcs: ["foo/bar/MyClass.java"],
7190 package_name: "foo",
7191 sdk_version: "none",
7192 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007193 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007194 }
7195
7196 override_android_app {
7197 name: "override_app",
7198 base: "app",
7199 package_name: "bar",
7200 }
markchien7c803b82021-08-26 22:10:06 +08007201
7202 bpf {
7203 name: "bpf",
7204 srcs: ["bpf.c"],
7205 }
7206
7207 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007208 name: "overrideBpf",
7209 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007210 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007211
7212 prebuilt_etc {
7213 name: "myetc",
7214 src: "myprebuilt",
7215 }
7216
7217 prebuilt_etc {
7218 name: "override_myetc",
7219 src: "override_myprebuilt",
7220 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007221
7222 cc_library {
7223 name: "mylib32",
7224 apex_available: [ "myapex" ],
7225 }
7226
7227 cc_library {
7228 name: "mylib64",
7229 apex_available: [ "myapex" ],
7230 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007231 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007232
Jooyung Hana0503a52023-08-23 13:12:50 +09007233 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007234 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007235 if originalVariant.GetOverriddenBy() != "" {
7236 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7237 }
7238 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7239 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7240 }
7241
Spandan Das50801e22024-05-13 18:29:45 +00007242 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007243 apexRule := module.Rule("apexRule")
7244 copyCmds := apexRule.Args["copy_commands"]
7245
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007246 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7247 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007248
markchien7c803b82021-08-26 22:10:06 +08007249 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007250 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007251
Daniel Norman5a3ce132021-08-26 15:44:43 -07007252 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7253 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7254
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007255 apexBundle := module.Module().(*apexBundle)
7256 name := apexBundle.Name()
7257 if name != "override_myapex" {
7258 t.Errorf("name should be \"override_myapex\", but was %q", name)
7259 }
7260
Baligh Uddin004d7172020-02-19 21:29:28 -08007261 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7262 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7263 }
7264
Jiyong Park20bacab2020-03-03 11:45:41 +09007265 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007266 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007267 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7268
7269 signApkRule := module.Rule("signapk")
7270 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007271
Colin Crossaa255532020-07-03 13:18:24 -07007272 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007273 var builder strings.Builder
7274 data.Custom(&builder, name, "TARGET_", "", data)
7275 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007276 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7277 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007278 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007279 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007280 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007281 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007282 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007283 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007284}
7285
Albert Martineefabcf2022-03-21 20:11:16 +00007286func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007287 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007288 // Override from 29 to 31
7289 minSdkOverride31 := "31"
7290 ctx := testApex(t, `
7291 apex {
7292 name: "myapex",
7293 key: "myapex.key",
7294 native_shared_libs: ["mylib"],
7295 updatable: true,
7296 min_sdk_version: "29"
7297 }
7298
7299 override_apex {
7300 name: "override_myapex",
7301 base: "myapex",
7302 logging_parent: "com.foo.bar",
7303 package_name: "test.overridden.package"
7304 }
7305
7306 apex_key {
7307 name: "myapex.key",
7308 public_key: "testkey.avbpubkey",
7309 private_key: "testkey.pem",
7310 }
7311
7312 cc_library {
7313 name: "mylib",
7314 srcs: ["mylib.cpp"],
7315 runtime_libs: ["libbar"],
7316 system_shared_libs: [],
7317 stl: "none",
7318 apex_available: [ "myapex" ],
7319 min_sdk_version: "apex_inherit"
7320 }
7321
7322 cc_library {
7323 name: "libbar",
7324 srcs: ["mylib.cpp"],
7325 system_shared_libs: [],
7326 stl: "none",
7327 apex_available: [ "myapex" ],
7328 min_sdk_version: "apex_inherit"
7329 }
7330
7331 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7332
Jooyung Hana0503a52023-08-23 13:12:50 +09007333 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007334 copyCmds := apexRule.Args["copy_commands"]
7335
7336 // Ensure that direct non-stubs dep is always included
7337 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7338
7339 // Ensure that runtime_libs dep in included
7340 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7341
7342 // Ensure libraries target overridden min_sdk_version value
7343 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7344}
7345
7346func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007347 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007348 // Attempt to override from 31 to 29, should be a NOOP
7349 minSdkOverride29 := "29"
7350 ctx := testApex(t, `
7351 apex {
7352 name: "myapex",
7353 key: "myapex.key",
7354 native_shared_libs: ["mylib"],
7355 updatable: true,
7356 min_sdk_version: "31"
7357 }
7358
7359 override_apex {
7360 name: "override_myapex",
7361 base: "myapex",
7362 logging_parent: "com.foo.bar",
7363 package_name: "test.overridden.package"
7364 }
7365
7366 apex_key {
7367 name: "myapex.key",
7368 public_key: "testkey.avbpubkey",
7369 private_key: "testkey.pem",
7370 }
7371
7372 cc_library {
7373 name: "mylib",
7374 srcs: ["mylib.cpp"],
7375 runtime_libs: ["libbar"],
7376 system_shared_libs: [],
7377 stl: "none",
7378 apex_available: [ "myapex" ],
7379 min_sdk_version: "apex_inherit"
7380 }
7381
7382 cc_library {
7383 name: "libbar",
7384 srcs: ["mylib.cpp"],
7385 system_shared_libs: [],
7386 stl: "none",
7387 apex_available: [ "myapex" ],
7388 min_sdk_version: "apex_inherit"
7389 }
7390
7391 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7392
Jooyung Hana0503a52023-08-23 13:12:50 +09007393 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007394 copyCmds := apexRule.Args["copy_commands"]
7395
7396 // Ensure that direct non-stubs dep is always included
7397 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7398
7399 // Ensure that runtime_libs dep in included
7400 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7401
7402 // Ensure libraries target the original min_sdk_version value rather than the overridden
7403 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7404}
7405
Jooyung Han214bf372019-11-12 13:03:50 +09007406func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007407 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007408 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007409 apex {
7410 name: "myapex",
7411 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007412 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007413 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007414 }
7415
7416 apex_key {
7417 name: "myapex.key",
7418 public_key: "testkey.avbpubkey",
7419 private_key: "testkey.pem",
7420 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007421
7422 cc_library {
7423 name: "mylib",
7424 srcs: ["mylib.cpp"],
7425 stl: "libc++",
7426 system_shared_libs: [],
7427 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007428 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007429 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007430 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007431
Jooyung Hana0503a52023-08-23 13:12:50 +09007432 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007433 args := module.Rule("apexRule").Args
7434 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007435 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007436
7437 // The copies of the libraries in the apex should have one more dependency than
7438 // the ones outside the apex, namely the unwinder. Ideally we should check
7439 // the dependency names directly here but for some reason the names are blank in
7440 // this test.
7441 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007442 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007443 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7444 if len(apexImplicits) != len(nonApexImplicits)+1 {
7445 t.Errorf("%q missing unwinder dep", lib)
7446 }
7447 }
Jooyung Han214bf372019-11-12 13:03:50 +09007448}
7449
Paul Duffine05480a2021-03-08 15:07:14 +00007450var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007451 "api/current.txt": nil,
7452 "api/removed.txt": nil,
7453 "api/system-current.txt": nil,
7454 "api/system-removed.txt": nil,
7455 "api/test-current.txt": nil,
7456 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007457
Anton Hanssondff2c782020-12-21 17:10:01 +00007458 "100/public/api/foo.txt": nil,
7459 "100/public/api/foo-removed.txt": nil,
7460 "100/system/api/foo.txt": nil,
7461 "100/system/api/foo-removed.txt": nil,
7462
Paul Duffineedc5d52020-06-12 17:46:39 +01007463 // For java_sdk_library_import
7464 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007465}
7466
Jooyung Han58f26ab2019-12-18 15:34:32 +09007467func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007468 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007469 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007470 apex {
7471 name: "myapex",
7472 key: "myapex.key",
7473 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007474 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007475 }
7476
7477 apex_key {
7478 name: "myapex.key",
7479 public_key: "testkey.avbpubkey",
7480 private_key: "testkey.pem",
7481 }
7482
7483 java_sdk_library {
7484 name: "foo",
7485 srcs: ["a.java"],
7486 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007487 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007488 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007489
7490 prebuilt_apis {
7491 name: "sdk",
7492 api_dirs: ["100"],
7493 }
Paul Duffin9b879592020-05-26 13:21:35 +01007494 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007495
7496 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007497 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007498 "javalib/foo.jar",
7499 "etc/permissions/foo.xml",
7500 })
7501 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007502 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7503 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7504 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007505}
7506
Spandan Das3ee19692024-06-19 04:47:40 +00007507func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007508 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007509 ctx := testApex(t, `
7510 override_apex {
7511 name: "mycompanyapex",
7512 base: "myapex",
7513 }
7514 apex {
7515 name: "myapex",
7516 key: "myapex.key",
7517 java_libs: ["foo"],
7518 updatable: false,
7519 }
7520
7521 apex_key {
7522 name: "myapex.key",
7523 public_key: "testkey.avbpubkey",
7524 private_key: "testkey.pem",
7525 }
7526
7527 java_sdk_library {
7528 name: "foo",
7529 srcs: ["a.java"],
7530 api_packages: ["foo"],
7531 apex_available: [ "myapex" ],
7532 }
7533
7534 prebuilt_apis {
7535 name: "sdk",
7536 api_dirs: ["100"],
7537 }
7538 `, withFiles(filesForSdkLibrary))
7539
7540 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7541 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7542 // (com.android.foo), the filepath should not contain override apex name.
7543 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7544 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7545 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7546}
7547
Paul Duffin9b879592020-05-26 13:21:35 +01007548func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007549 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007550 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007551 apex {
7552 name: "myapex",
7553 key: "myapex.key",
7554 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007555 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007556 }
7557
7558 apex_key {
7559 name: "myapex.key",
7560 public_key: "testkey.avbpubkey",
7561 private_key: "testkey.pem",
7562 }
7563
7564 java_sdk_library {
7565 name: "foo",
7566 srcs: ["a.java"],
7567 api_packages: ["foo"],
7568 apex_available: ["myapex"],
7569 sdk_version: "none",
7570 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007571 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007572 }
7573
7574 java_library {
7575 name: "bar",
7576 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007577 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007578 apex_available: ["myapex"],
7579 sdk_version: "none",
7580 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007581 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007582 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007583
7584 prebuilt_apis {
7585 name: "sdk",
7586 api_dirs: ["100"],
7587 }
Paul Duffin9b879592020-05-26 13:21:35 +01007588 `, withFiles(filesForSdkLibrary))
7589
7590 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007591 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007592 "javalib/bar.jar",
7593 "javalib/foo.jar",
7594 "etc/permissions/foo.xml",
7595 })
7596
7597 // The bar library should depend on the implementation jar.
7598 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007599 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007600 t.Errorf("expected %q, found %#q", expected, actual)
7601 }
7602}
7603
7604func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007606 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007607 apex {
7608 name: "myapex",
7609 key: "myapex.key",
7610 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007611 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007612 }
7613
7614 apex_key {
7615 name: "myapex.key",
7616 public_key: "testkey.avbpubkey",
7617 private_key: "testkey.pem",
7618 }
7619
7620 java_sdk_library {
7621 name: "foo",
7622 srcs: ["a.java"],
7623 api_packages: ["foo"],
7624 apex_available: ["myapex"],
7625 sdk_version: "none",
7626 system_modules: "none",
7627 }
7628
7629 java_library {
7630 name: "bar",
7631 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007632 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007633 sdk_version: "none",
7634 system_modules: "none",
7635 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007636
7637 prebuilt_apis {
7638 name: "sdk",
7639 api_dirs: ["100"],
7640 }
Paul Duffin9b879592020-05-26 13:21:35 +01007641 `, withFiles(filesForSdkLibrary))
7642
7643 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007644 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007645 "javalib/foo.jar",
7646 "etc/permissions/foo.xml",
7647 })
7648
7649 // The bar library should depend on the stubs jar.
7650 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007651 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007652 t.Errorf("expected %q, found %#q", expected, actual)
7653 }
7654}
7655
Paul Duffineedc5d52020-06-12 17:46:39 +01007656func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007658 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007659 prebuilt_apis {
7660 name: "sdk",
7661 api_dirs: ["100"],
7662 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007663 withFiles(map[string][]byte{
7664 "apex/a.java": nil,
7665 "apex/apex_manifest.json": nil,
7666 "apex/Android.bp": []byte(`
7667 package {
7668 default_visibility: ["//visibility:private"],
7669 }
7670
7671 apex {
7672 name: "myapex",
7673 key: "myapex.key",
7674 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007675 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007676 }
7677
7678 apex_key {
7679 name: "myapex.key",
7680 public_key: "testkey.avbpubkey",
7681 private_key: "testkey.pem",
7682 }
7683
7684 java_library {
7685 name: "bar",
7686 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007687 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007688 apex_available: ["myapex"],
7689 sdk_version: "none",
7690 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007691 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007692 }
7693`),
7694 "source/a.java": nil,
7695 "source/api/current.txt": nil,
7696 "source/api/removed.txt": nil,
7697 "source/Android.bp": []byte(`
7698 package {
7699 default_visibility: ["//visibility:private"],
7700 }
7701
7702 java_sdk_library {
7703 name: "foo",
7704 visibility: ["//apex"],
7705 srcs: ["a.java"],
7706 api_packages: ["foo"],
7707 apex_available: ["myapex"],
7708 sdk_version: "none",
7709 system_modules: "none",
7710 public: {
7711 enabled: true,
7712 },
Colin Crosse4f34882024-11-14 12:26:00 -08007713 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007714 }
7715`),
7716 "prebuilt/a.jar": nil,
7717 "prebuilt/Android.bp": []byte(`
7718 package {
7719 default_visibility: ["//visibility:private"],
7720 }
7721
7722 java_sdk_library_import {
7723 name: "foo",
7724 visibility: ["//apex", "//source"],
7725 apex_available: ["myapex"],
7726 prefer: true,
7727 public: {
7728 jars: ["a.jar"],
7729 },
Colin Crosse4f34882024-11-14 12:26:00 -08007730 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007731 }
7732`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007733 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007734 )
7735
7736 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007737 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007738 "javalib/bar.jar",
7739 "javalib/foo.jar",
7740 "etc/permissions/foo.xml",
7741 })
7742
7743 // The bar library should depend on the implementation jar.
7744 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007745 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007746 t.Errorf("expected %q, found %#q", expected, actual)
7747 }
7748}
7749
7750func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007751 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007752 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7753 apex {
7754 name: "myapex",
7755 key: "myapex.key",
7756 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007757 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007758 }
7759
7760 apex_key {
7761 name: "myapex.key",
7762 public_key: "testkey.avbpubkey",
7763 private_key: "testkey.pem",
7764 }
7765
7766 java_sdk_library_import {
7767 name: "foo",
7768 apex_available: ["myapex"],
7769 prefer: true,
7770 public: {
7771 jars: ["a.jar"],
7772 },
7773 }
7774
7775 `, withFiles(filesForSdkLibrary))
7776}
7777
atrost6e126252020-01-27 17:01:16 +00007778func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007779 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007780 result := android.GroupFixturePreparers(
7781 prepareForApexTest,
7782 java.PrepareForTestWithPlatformCompatConfig,
7783 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007784 apex {
7785 name: "myapex",
7786 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007787 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007788 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007789 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007790 }
7791
7792 apex_key {
7793 name: "myapex.key",
7794 public_key: "testkey.avbpubkey",
7795 private_key: "testkey.pem",
7796 }
7797
7798 platform_compat_config {
7799 name: "myjar-platform-compat-config",
7800 src: ":myjar",
7801 }
7802
7803 java_library {
7804 name: "myjar",
7805 srcs: ["foo/bar/MyClass.java"],
7806 sdk_version: "none",
7807 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007808 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007809 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007810 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007811
7812 // Make sure that a preferred prebuilt does not affect the apex contents.
7813 prebuilt_platform_compat_config {
7814 name: "myjar-platform-compat-config",
7815 metadata: "compat-config/metadata.xml",
7816 prefer: true,
7817 }
atrost6e126252020-01-27 17:01:16 +00007818 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007819 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007820 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007821 "etc/compatconfig/myjar-platform-compat-config.xml",
7822 "javalib/myjar.jar",
7823 })
7824}
7825
Jooyung Han862c0d62022-12-21 10:15:37 +09007826func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007827 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007828 android.GroupFixturePreparers(
7829 android.PrepareForTestWithAndroidBuildComponents,
7830 PrepareForTestWithApexBuildComponents,
7831 prepareForTestWithMyapex,
7832 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7833 ).
7834 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7835 RunTestWithBp(t, `
7836 apex {
7837 name: "myapex",
7838 key: "myapex.key",
7839 prebuilts: ["foo", "bar"],
7840 updatable: false,
7841 }
7842
7843 apex_key {
7844 name: "myapex.key",
7845 public_key: "testkey.avbpubkey",
7846 private_key: "testkey.pem",
7847 }
7848
7849 prebuilt_etc {
7850 name: "foo",
7851 src: "myprebuilt",
7852 filename_from_src: true,
7853 }
7854
7855 prebuilt_etc {
7856 name: "bar",
7857 src: "myprebuilt",
7858 filename_from_src: true,
7859 }
7860 `)
7861}
7862
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007863func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007864 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007865 bp := `
7866 apex {
7867 name: "myapex",
7868 key: "myapex.key",
7869 native_shared_libs: ["libfoo"],
7870 updatable: false,
7871 unwanted_transitive_deps: ["libbar"],
7872 }
7873
7874 apex_key {
7875 name: "myapex.key",
7876 public_key: "testkey.avbpubkey",
7877 private_key: "testkey.pem",
7878 }
7879
7880 cc_library {
7881 name: "libfoo",
7882 srcs: ["foo.cpp"],
7883 shared_libs: ["libbar"],
7884 apex_available: ["myapex"],
7885 }
7886
7887 cc_library {
7888 name: "libbar",
7889 srcs: ["bar.cpp"],
7890 apex_available: ["myapex"],
7891 }`
7892 ctx := testApex(t, bp)
7893 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7894 "*/libc++.so",
7895 "*/libfoo.so",
7896 // not libbar.so
7897 })
7898}
7899
Jiyong Park479321d2019-12-16 11:47:12 +09007900func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007901 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007902 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7903 apex {
7904 name: "myapex",
7905 key: "myapex.key",
7906 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007907 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007908 }
7909
7910 apex_key {
7911 name: "myapex.key",
7912 public_key: "testkey.avbpubkey",
7913 private_key: "testkey.pem",
7914 }
7915
7916 java_library {
7917 name: "myjar",
7918 srcs: ["foo/bar/MyClass.java"],
7919 sdk_version: "none",
7920 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007921 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007922 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007923 }
7924 `)
7925}
7926
Jiyong Park7cd10e32020-01-14 09:22:18 +09007927func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007928 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007929 bp := `
7930 apex {
7931 name: "myapex",
7932 key: "myapex.key",
7933 native_shared_libs: ["mylib"],
7934 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007935 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007936 }
7937
Jiyong Park9d677202020-02-19 16:29:35 +09007938 apex {
7939 name: "myapex.updatable",
7940 key: "myapex.key",
7941 native_shared_libs: ["mylib"],
7942 java_libs: ["myjar"],
7943 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007944 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007945 }
7946
Jiyong Park7cd10e32020-01-14 09:22:18 +09007947 apex_key {
7948 name: "myapex.key",
7949 public_key: "testkey.avbpubkey",
7950 private_key: "testkey.pem",
7951 }
7952
7953 cc_library {
7954 name: "mylib",
7955 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007956 shared_libs: [
7957 "myotherlib",
7958 "myotherlib_ext",
7959 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007960 system_shared_libs: [],
7961 stl: "none",
7962 apex_available: [
7963 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007964 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007965 "//apex_available:platform",
7966 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007967 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007968 }
7969
7970 cc_library {
7971 name: "myotherlib",
7972 srcs: ["mylib.cpp"],
7973 system_shared_libs: [],
7974 stl: "none",
7975 apex_available: [
7976 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007977 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007978 "//apex_available:platform",
7979 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007980 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007981 }
7982
Jiyong Parkce243632023-02-17 18:22:25 +09007983 cc_library {
7984 name: "myotherlib_ext",
7985 srcs: ["mylib.cpp"],
7986 system_shared_libs: [],
7987 system_ext_specific: true,
7988 stl: "none",
7989 apex_available: [
7990 "myapex",
7991 "myapex.updatable",
7992 "//apex_available:platform",
7993 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007994 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007995 }
7996
Jiyong Park7cd10e32020-01-14 09:22:18 +09007997 java_library {
7998 name: "myjar",
7999 srcs: ["foo/bar/MyClass.java"],
8000 sdk_version: "none",
8001 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008002 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008003 apex_available: [
8004 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008005 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008006 "//apex_available:platform",
8007 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008008 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008009 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008010 }
8011
8012 java_library {
8013 name: "myotherjar",
8014 srcs: ["foo/bar/MyClass.java"],
8015 sdk_version: "none",
8016 system_modules: "none",
8017 apex_available: [
8018 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008019 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008020 "//apex_available:platform",
8021 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008022 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008023 }
8024 `
8025
8026 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8027 for _, f := range files {
8028 if f.path == file {
8029 if f.isLink {
8030 t.Errorf("%q is not a real file", file)
8031 }
8032 return
8033 }
8034 }
8035 t.Errorf("%q is not found", file)
8036 }
8037
Jiyong Parkce243632023-02-17 18:22:25 +09008038 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008039 for _, f := range files {
8040 if f.path == file {
8041 if !f.isLink {
8042 t.Errorf("%q is not a symlink", file)
8043 }
Jiyong Parkce243632023-02-17 18:22:25 +09008044 if f.src != target {
8045 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8046 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008047 return
8048 }
8049 }
8050 t.Errorf("%q is not found", file)
8051 }
8052
Jiyong Park9d677202020-02-19 16:29:35 +09008053 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8054 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008055 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008056 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008057 ensureRealfileExists(t, files, "javalib/myjar.jar")
8058 ensureRealfileExists(t, files, "lib64/mylib.so")
8059 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008060 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008061
Jooyung Hana0503a52023-08-23 13:12:50 +09008062 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008063 ensureRealfileExists(t, files, "javalib/myjar.jar")
8064 ensureRealfileExists(t, files, "lib64/mylib.so")
8065 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008066 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008067
8068 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008069 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008070 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008071 ensureRealfileExists(t, files, "javalib/myjar.jar")
8072 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008073 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8074 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008075
Jooyung Hana0503a52023-08-23 13:12:50 +09008076 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008077 ensureRealfileExists(t, files, "javalib/myjar.jar")
8078 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008079 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8080 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008081}
8082
Yo Chiange8128052020-07-23 20:09:18 +08008083func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008084 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008085 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008086 apex {
8087 name: "myapex",
8088 key: "myapex.key",
8089 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008090 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008091 }
8092
8093 apex_key {
8094 name: "myapex.key",
8095 public_key: "testkey.avbpubkey",
8096 private_key: "testkey.pem",
8097 }
8098
8099 cc_library_shared {
8100 name: "mylib",
8101 srcs: ["mylib.cpp"],
8102 shared_libs: ["myotherlib"],
8103 system_shared_libs: [],
8104 stl: "none",
8105 apex_available: [
8106 "myapex",
8107 "//apex_available:platform",
8108 ],
8109 }
8110
8111 cc_prebuilt_library_shared {
8112 name: "myotherlib",
8113 srcs: ["prebuilt.so"],
8114 system_shared_libs: [],
8115 stl: "none",
8116 apex_available: [
8117 "myapex",
8118 "//apex_available:platform",
8119 ],
8120 }
8121 `)
8122
Jooyung Hana0503a52023-08-23 13:12:50 +09008123 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008124 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008125 var builder strings.Builder
8126 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8127 androidMk := builder.String()
8128 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008129 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008130 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8131 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8132 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008133 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008134}
8135
Jooyung Han643adc42020-02-27 13:50:06 +09008136func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008137 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008138 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008139 apex {
8140 name: "myapex",
8141 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008142 binaries: ["mybin"],
8143 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008144 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008145 }
8146
8147 apex_key {
8148 name: "myapex.key",
8149 public_key: "testkey.avbpubkey",
8150 private_key: "testkey.pem",
8151 }
8152
8153 cc_library {
8154 name: "mylib",
8155 srcs: ["mylib.cpp"],
8156 shared_libs: ["mylib2"],
8157 system_shared_libs: [],
8158 stl: "none",
8159 apex_available: [ "myapex" ],
8160 }
8161
8162 cc_library {
8163 name: "mylib2",
8164 srcs: ["mylib.cpp"],
8165 system_shared_libs: [],
8166 stl: "none",
8167 apex_available: [ "myapex" ],
8168 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008169
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008170 // Used as both a JNI library and a regular shared library.
8171 cc_library {
8172 name: "mylib3",
8173 srcs: ["mylib.cpp"],
8174 system_shared_libs: [],
8175 stl: "none",
8176 apex_available: [ "myapex" ],
8177 }
8178
8179 cc_binary {
8180 name: "mybin",
8181 srcs: ["mybin.cpp"],
8182 shared_libs: ["mylib3"],
8183 system_shared_libs: [],
8184 stl: "none",
8185 apex_available: [ "myapex" ],
8186 }
8187
Jiyong Park34d5c332022-02-24 18:02:44 +09008188 rust_ffi_shared {
8189 name: "libfoo.rust",
8190 crate_name: "foo",
8191 srcs: ["foo.rs"],
8192 shared_libs: ["libfoo.shared_from_rust"],
8193 prefer_rlib: true,
8194 apex_available: ["myapex"],
8195 }
8196
8197 cc_library_shared {
8198 name: "libfoo.shared_from_rust",
8199 srcs: ["mylib.cpp"],
8200 system_shared_libs: [],
8201 stl: "none",
8202 stubs: {
8203 versions: ["10", "11", "12"],
8204 },
8205 }
8206
Jooyung Han643adc42020-02-27 13:50:06 +09008207 `)
8208
Jooyung Hana0503a52023-08-23 13:12:50 +09008209 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008210 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008211 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008212 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008213 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008214 "lib64/mylib.so",
8215 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008216 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008217 "lib64/libfoo.rust.so",
8218 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8219 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008220 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008221
8222 // b/220397949
8223 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008224}
8225
Jooyung Han49f67012020-04-17 13:43:10 +09008226func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008227 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008228 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008229 apex {
8230 name: "myapex",
8231 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008232 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008233 }
8234 apex_key {
8235 name: "myapex.key",
8236 public_key: "testkey.avbpubkey",
8237 private_key: "testkey.pem",
8238 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008239 `,
8240 android.FixtureModifyConfig(func(config android.Config) {
8241 delete(config.Targets, android.Android)
8242 config.AndroidCommonTarget = android.Target{}
8243 }),
8244 )
Jooyung Han49f67012020-04-17 13:43:10 +09008245
8246 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8247 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8248 }
8249}
8250
Jiyong Parkbd159612020-02-28 15:22:21 +09008251func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008252 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008253 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008254 apex {
8255 name: "myapex",
8256 key: "myapex.key",
8257 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008258 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008259 }
8260
8261 apex_key {
8262 name: "myapex.key",
8263 public_key: "testkey.avbpubkey",
8264 private_key: "testkey.pem",
8265 }
8266
8267 android_app {
8268 name: "AppFoo",
8269 srcs: ["foo/bar/MyClass.java"],
8270 sdk_version: "none",
8271 system_modules: "none",
8272 apex_available: [ "myapex" ],
8273 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008274 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008275
Jooyung Hana0503a52023-08-23 13:12:50 +09008276 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008277 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008278
8279 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008280 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 +09008281}
8282
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008283func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008284 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008285 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008286 apex {
8287 name: "myapex",
8288 key: "myapex.key",
8289 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008290 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008291 }
8292
8293 apex_key {
8294 name: "myapex.key",
8295 public_key: "testkey.avbpubkey",
8296 private_key: "testkey.pem",
8297 }
8298
8299 android_app_set {
8300 name: "AppSet",
8301 set: "AppSet.apks",
8302 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008303 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008304 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008305 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008306 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8307 s := mod.Rule("apexRule").Args["copy_commands"]
8308 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008309 if len(copyCmds) != 4 {
8310 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008311 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008312 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8313 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008314 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8315 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008316
8317 // Ensure that canned_fs_config has an entry for the app set zip file
8318 generateFsRule := mod.Rule("generateFsConfig")
8319 cmd := generateFsRule.RuleParams.Command
8320 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008321}
8322
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008323func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008324 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008325 apex_set {
8326 name: "myapex",
8327 filename: "foo_v2.apex",
8328 sanitized: {
8329 none: { set: "myapex.apks", },
8330 hwaddress: { set: "myapex.hwasan.apks", },
8331 },
Paul Duffin24704672021-04-06 16:09:30 +01008332 }
8333 `
8334 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008335
Paul Duffin24704672021-04-06 16:09:30 +01008336 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008337 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008338
Spandan Das9d6e2092024-09-21 02:50:00 +00008339 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008340 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008341
Paul Duffin24704672021-04-06 16:09:30 +01008342 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8343
8344 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008345 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8346 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008347
8348 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008349}
8350
Pranav Guptaeba03b02022-09-27 00:27:08 +00008351func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008352 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008353 ctx := testApex(t, `
8354 apex_set {
8355 name: "myapex",
8356 set: ":myapex_apks_file",
8357 }
8358
8359 filegroup {
8360 name: "myapex_apks_file",
8361 srcs: ["myapex.apks"],
8362 }
8363 `)
8364
Spandan Das9d6e2092024-09-21 02:50:00 +00008365 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008366
8367 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008368 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008369 extractedApex := m.Output(extractorOutput)
8370
8371 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8372}
8373
Paul Duffin89f570a2021-06-16 01:42:33 +01008374func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008375 t.Helper()
8376
Paul Duffin55607122021-03-30 23:32:51 +01008377 fs := android.MockFS{
8378 "a.java": nil,
8379 "a.jar": nil,
8380 "apex_manifest.json": nil,
8381 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008382 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008383 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8384 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8385 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008386 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008387 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008388
Paul Duffin55607122021-03-30 23:32:51 +01008389 errorHandler := android.FixtureExpectsNoErrors
8390 if errmsg != "" {
8391 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008392 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008393
Paul Duffin55607122021-03-30 23:32:51 +01008394 result := android.GroupFixturePreparers(
8395 cc.PrepareForTestWithCcDefaultModules,
8396 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008397 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008398 java.PrepareForTestWithJavaSdkLibraryFiles,
8399 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008400 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008401 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008402 android.FixtureModifyMockFS(func(fs android.MockFS) {
8403 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8404 insert := ""
8405 for _, fragment := range fragments {
8406 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8407 }
8408 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8409 platform_bootclasspath {
8410 name: "platform-bootclasspath",
8411 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008412 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008413 %s
8414 ],
8415 }
8416 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008417 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008418 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008419 // Dexpreopt for boot jars requires the ART boot image profile.
8420 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8421 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008422 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008423 ).
8424 ExtendWithErrorHandler(errorHandler).
8425 RunTestWithBp(t, bp)
8426
8427 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008428}
8429
Jooyung Han548640b2020-04-27 12:10:30 +09008430func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008431 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008432 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8433 apex {
8434 name: "myapex",
8435 key: "myapex.key",
8436 updatable: true,
8437 }
8438
8439 apex_key {
8440 name: "myapex.key",
8441 public_key: "testkey.avbpubkey",
8442 private_key: "testkey.pem",
8443 }
8444 `)
8445}
8446
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008447func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008448 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008449 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8450 apex {
8451 name: "myapex",
8452 key: "myapex.key",
8453 }
8454
8455 apex_key {
8456 name: "myapex.key",
8457 public_key: "testkey.avbpubkey",
8458 private_key: "testkey.pem",
8459 }
8460 `)
8461}
8462
satayevb98371c2021-06-15 16:49:50 +01008463func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008464 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008465 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8466 apex {
8467 name: "myapex",
8468 key: "myapex.key",
8469 systemserverclasspath_fragments: [
8470 "mysystemserverclasspathfragment",
8471 ],
8472 min_sdk_version: "29",
8473 updatable: true,
8474 }
8475
8476 apex_key {
8477 name: "myapex.key",
8478 public_key: "testkey.avbpubkey",
8479 private_key: "testkey.pem",
8480 }
8481
8482 java_library {
8483 name: "foo",
8484 srcs: ["b.java"],
8485 min_sdk_version: "29",
8486 installable: true,
8487 apex_available: [
8488 "myapex",
8489 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008490 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008491 }
8492
8493 systemserverclasspath_fragment {
8494 name: "mysystemserverclasspathfragment",
8495 generate_classpaths_proto: false,
8496 contents: [
8497 "foo",
8498 ],
8499 apex_available: [
8500 "myapex",
8501 ],
8502 }
satayevabcd5972021-08-06 17:49:46 +01008503 `,
8504 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8505 )
satayevb98371c2021-06-15 16:49:50 +01008506}
8507
Paul Duffin064b70c2020-11-02 17:32:38 +00008508func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008509 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008510 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008511 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008512 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008513 fragment := java.ApexVariantReference{
8514 Apex: proptools.StringPtr("myapex"),
8515 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8516 }
8517
Paul Duffin064b70c2020-11-02 17:32:38 +00008518 testDexpreoptWithApexes(t, `
8519 prebuilt_apex {
8520 name: "myapex" ,
8521 arch: {
8522 arm64: {
8523 src: "myapex-arm64.apex",
8524 },
8525 arm: {
8526 src: "myapex-arm.apex",
8527 },
8528 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008529 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8530 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008531
Paul Duffin89f570a2021-06-16 01:42:33 +01008532 prebuilt_bootclasspath_fragment {
8533 name: "my-bootclasspath-fragment",
8534 contents: ["libfoo"],
8535 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008536 hidden_api: {
8537 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8538 metadata: "my-bootclasspath-fragment/metadata.csv",
8539 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008540 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8541 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8542 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008543 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008544 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008545
Spandan Das52c01a12024-09-20 01:09:48 +00008546 java_sdk_library_import {
8547 name: "libfoo",
8548 prefer: true,
8549 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008550 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008551 },
8552 apex_available: ["myapex"],
8553 shared_library: false,
8554 permitted_packages: ["libfoo"],
8555 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008556 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008557 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008558}
8559
Spandan Dasf14e2542021-11-12 00:01:37 +00008560func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008561 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008562 bp += `
8563 apex_key {
8564 name: "myapex.key",
8565 public_key: "testkey.avbpubkey",
8566 private_key: "testkey.pem",
8567 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008568 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008569 "lib1/src/A.java": nil,
8570 "lib2/src/B.java": nil,
8571 "system/sepolicy/apex/myapex-file_contexts": nil,
8572 }
8573
Paul Duffin45338f02021-03-30 23:07:52 +01008574 errorHandler := android.FixtureExpectsNoErrors
8575 if errmsg != "" {
8576 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008577 }
Colin Crossae8600b2020-10-29 17:09:13 -07008578
Paul Duffin45338f02021-03-30 23:07:52 +01008579 android.GroupFixturePreparers(
8580 android.PrepareForTestWithAndroidBuildComponents,
8581 java.PrepareForTestWithJavaBuildComponents,
8582 PrepareForTestWithApexBuildComponents,
8583 android.PrepareForTestWithNeverallowRules(rules),
8584 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008585 apexBootJars := make([]string, 0, len(bootJars))
8586 for _, apexBootJar := range bootJars {
8587 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008588 }
satayevd604b212021-07-21 14:23:52 +01008589 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008590 }),
8591 fs.AddToFixture(),
8592 ).
8593 ExtendWithErrorHandler(errorHandler).
8594 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008595}
8596
8597func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008598 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008599 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008600 name string
8601 expectedError string
8602 bp string
8603 bootJars []string
8604 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008605 }{
8606
8607 {
8608 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8609 expectedError: "",
8610 bp: `
8611 java_library {
8612 name: "bcp_lib1",
8613 srcs: ["lib1/src/*.java"],
8614 permitted_packages: ["foo.bar"],
8615 apex_available: ["myapex"],
8616 sdk_version: "none",
8617 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008618 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008619 }
8620 java_library {
8621 name: "nonbcp_lib2",
8622 srcs: ["lib2/src/*.java"],
8623 apex_available: ["myapex"],
8624 permitted_packages: ["a.b"],
8625 sdk_version: "none",
8626 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008627 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008628 }
8629 apex {
8630 name: "myapex",
8631 key: "myapex.key",
8632 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008633 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008634 }`,
8635 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008636 bcpPermittedPackages: map[string][]string{
8637 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008638 "foo.bar",
8639 },
8640 },
8641 },
8642 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008643 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008644 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 +01008645 bp: `
8646 java_library {
8647 name: "bcp_lib1",
8648 srcs: ["lib1/src/*.java"],
8649 apex_available: ["myapex"],
8650 permitted_packages: ["foo.bar"],
8651 sdk_version: "none",
8652 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008653 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008654 }
8655 java_library {
8656 name: "bcp_lib2",
8657 srcs: ["lib2/src/*.java"],
8658 apex_available: ["myapex"],
8659 permitted_packages: ["foo.bar", "bar.baz"],
8660 sdk_version: "none",
8661 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008662 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008663 }
8664 apex {
8665 name: "myapex",
8666 key: "myapex.key",
8667 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008668 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008669 }
8670 `,
8671 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008672 bcpPermittedPackages: map[string][]string{
8673 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008674 "foo.bar",
8675 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008676 "bcp_lib2": []string{
8677 "foo.bar",
8678 },
8679 },
8680 },
8681 {
8682 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8683 expectedError: "",
8684 bp: `
8685 java_library {
8686 name: "bcp_lib_restricted",
8687 srcs: ["lib1/src/*.java"],
8688 apex_available: ["myapex"],
8689 permitted_packages: ["foo.bar"],
8690 sdk_version: "none",
8691 min_sdk_version: "29",
8692 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008693 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008694 }
8695 java_library {
8696 name: "bcp_lib_unrestricted",
8697 srcs: ["lib2/src/*.java"],
8698 apex_available: ["myapex"],
8699 permitted_packages: ["foo.bar", "bar.baz"],
8700 sdk_version: "none",
8701 min_sdk_version: "29",
8702 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008703 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008704 }
8705 apex {
8706 name: "myapex",
8707 key: "myapex.key",
8708 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8709 updatable: true,
8710 min_sdk_version: "29",
8711 }
8712 `,
8713 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8714 bcpPermittedPackages: map[string][]string{
8715 "bcp_lib1_non_updateable": []string{
8716 "foo.bar",
8717 },
8718 // 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 +01008719 },
8720 },
8721 }
8722 for _, tc := range testcases {
8723 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008724 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008725 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8726 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008727 })
8728 }
8729}
8730
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008731// TODO(jungjw): Move this to proptools
8732func intPtr(i int) *int {
8733 return &i
8734}
8735
8736func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008737 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008738 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008739 apex_set {
8740 name: "myapex",
8741 set: "myapex.apks",
8742 filename: "foo_v2.apex",
8743 overrides: ["foo"],
8744 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008745 `,
8746 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8747 variables.Platform_sdk_version = intPtr(30)
8748 }),
8749 android.FixtureModifyConfig(func(config android.Config) {
8750 config.Targets[android.Android] = []android.Target{
8751 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8752 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8753 }
8754 }),
8755 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008756
Spandan Das9d6e2092024-09-21 02:50:00 +00008757 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008758
8759 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008760 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008761 actual := extractedApex.Args["abis"]
8762 expected := "ARMEABI_V7A,ARM64_V8A"
8763 if actual != expected {
8764 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8765 }
8766 actual = extractedApex.Args["sdk-version"]
8767 expected = "30"
8768 if actual != expected {
8769 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8770 }
8771
Paul Duffin6717d882021-06-15 19:09:41 +01008772 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008773 a := m.Module().(*ApexSet)
8774 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008775 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008776 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8777 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8778 }
8779}
8780
Anton Hansson805e0a52022-11-25 14:06:46 +00008781func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008782 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008783 ctx := testApex(t, `
8784 apex_set {
8785 name: "myapex",
8786 set: "myapex.apks",
8787 filename: "foo_v2.apex",
8788 overrides: ["foo"],
8789 }
8790 `,
8791 android.FixtureModifyConfig(func(config android.Config) {
8792 config.Targets[android.Android] = []android.Target{
8793 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8794 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8795 }
8796 }),
8797 )
8798
Spandan Das9d6e2092024-09-21 02:50:00 +00008799 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008800
8801 // Check extract_apks tool parameters. No native bridge arch expected
8802 extractedApex := m.Output("extracted/myapex.apks")
8803 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8804}
8805
Jiyong Park7d95a512020-05-10 15:16:24 +09008806func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008807 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008808 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8809 apex {
8810 name: "myapex",
8811 key: "myapex.key",
8812 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008813 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008814 }
8815
8816 apex_key {
8817 name: "myapex.key",
8818 public_key: "testkey.avbpubkey",
8819 private_key: "testkey.pem",
8820 }
8821
8822 cc_library {
8823 name: "mylib",
8824 srcs: ["mylib.cpp"],
8825 static_libs: ["otherlib"],
8826 system_shared_libs: [],
8827 stl: "none",
8828 apex_available: [ "myapex" ],
8829 }
8830
8831 cc_library {
8832 name: "otherlib",
8833 srcs: ["mylib.cpp"],
8834 system_shared_libs: [],
8835 stl: "none",
8836 stubs: {
8837 versions: ["1", "2", "3"],
8838 },
8839 apex_available: [ "myapex" ],
8840 }
8841 `)
8842}
8843
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008844func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008845 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008846 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008847 apex {
8848 name: "myapex",
8849 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008850 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008851 custom_sign_tool: "sign_myapex",
8852 }
8853
8854 apex_key {
8855 name: "myapex.key",
8856 public_key: "testkey.avbpubkey",
8857 private_key: "testkey.pem",
8858 }
8859 `)
8860
Jooyung Han286957d2023-10-30 16:17:56 +09008861 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008862 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008863 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 +09008864}
8865
8866func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008867 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008868 ctx := testApex(t, `
8869 apex {
8870 name: "myapex",
8871 key: "myapex.key",
8872 updatable: false,
8873 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008874 }
8875
8876 apex_key {
8877 name: "myapex.key",
8878 public_key: "testkey.avbpubkey",
8879 private_key: "testkey.pem",
8880 }
8881
8882 prebuilt_apex {
8883 name: "myapex",
8884 prefer: true,
8885 arch: {
8886 arm64: {
8887 src: "myapex-arm64.apex",
8888 },
8889 arm: {
8890 src: "myapex-arm.apex",
8891 },
8892 },
8893 }
8894
8895 apex_set {
8896 name: "myapex_set",
8897 set: "myapex.apks",
8898 filename: "myapex_set.apex",
8899 overrides: ["myapex"],
8900 }
8901 `)
8902
Colin Crossf61d03d2023-11-02 16:56:39 -07008903 content := android.ContentFromFileRuleForTests(t, ctx,
8904 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008905 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 -07008906 content = android.ContentFromFileRuleForTests(t, ctx,
8907 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008908 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 +09008909}
8910
Jooyung Han938b5932020-06-20 12:47:47 +09008911func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008912 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008913 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008914 apex {
8915 name: "myapex",
8916 key: "myapex.key",
8917 apps: ["app"],
8918 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008919 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008920 }
8921
8922 apex_key {
8923 name: "myapex.key",
8924 public_key: "testkey.avbpubkey",
8925 private_key: "testkey.pem",
8926 }
8927
8928 android_app {
8929 name: "app",
8930 srcs: ["foo/bar/MyClass.java"],
8931 package_name: "foo",
8932 sdk_version: "none",
8933 system_modules: "none",
8934 apex_available: [ "myapex" ],
8935 }
8936 `, withFiles(map[string][]byte{
8937 "sub/Android.bp": []byte(`
8938 override_apex {
8939 name: "override_myapex",
8940 base: "myapex",
8941 apps: ["override_app"],
8942 allowed_files: ":allowed",
8943 }
8944 // Overridable "path" property should be referenced indirectly
8945 filegroup {
8946 name: "allowed",
8947 srcs: ["allowed.txt"],
8948 }
8949 override_android_app {
8950 name: "override_app",
8951 base: "app",
8952 package_name: "bar",
8953 }
8954 `),
8955 }))
8956
Jooyung Hana0503a52023-08-23 13:12:50 +09008957 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008958 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8959 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8960 }
8961
Spandan Das50801e22024-05-13 18:29:45 +00008962 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008963 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8964 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8965 }
8966}
8967
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008968func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008969 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008970 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008971 apex {
8972 name: "myapex",
8973 key: "myapex.key",
8974 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008975 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008976 }
8977
8978 apex_key {
8979 name: "myapex.key",
8980 public_key: "testkey.avbpubkey",
8981 private_key: "testkey.pem",
8982 }
8983
8984 cc_library {
8985 name: "mylib",
8986 srcs: ["mylib.cpp"],
8987 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008988 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008989 },
8990 apex_available: ["myapex"],
8991 }
8992
8993 cc_prebuilt_library_shared {
8994 name: "mylib",
8995 prefer: false,
8996 srcs: ["prebuilt.so"],
8997 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008998 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008999 },
9000 apex_available: ["myapex"],
9001 }
9002 `)
9003}
9004
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009005func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009006 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009007 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009008 apex {
9009 name: "myapex",
9010 key: "myapex.key",
9011 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009012 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009013 }
9014 apex_key {
9015 name: "myapex.key",
9016 public_key: "testkey.avbpubkey",
9017 private_key: "testkey.pem",
9018 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009019 `,
9020 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9021 variables.CompressedApex = proptools.BoolPtr(true)
9022 }),
9023 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009024
Jooyung Hana0503a52023-08-23 13:12:50 +09009025 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009026 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9027
Jooyung Hana0503a52023-08-23 13:12:50 +09009028 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009029 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9030
9031 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009032 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009033 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9034
9035 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009036 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009037 var builder strings.Builder
9038 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9039 androidMk := builder.String()
9040 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9041}
9042
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009043func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9044 t.Parallel()
9045 ctx := testApex(t, `
9046 apex {
9047 name: "myapex",
9048 key: "myapex.key",
9049 compressible: true,
9050 updatable: false,
9051 payload_fs_type: "erofs",
9052 }
9053 apex_key {
9054 name: "myapex.key",
9055 public_key: "testkey.avbpubkey",
9056 private_key: "testkey.pem",
9057 }
9058 `,
9059 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9060 variables.CompressedApex = proptools.BoolPtr(true)
9061 }),
9062 )
9063
9064 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9065 if compressRule.Rule != nil {
9066 t.Error("erofs apex should not be compressed")
9067 }
9068}
9069
Jooyung Han26ec8482024-07-31 15:04:05 +09009070func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009071 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009072 for _, compressionEnabled := range []bool{true, false} {
9073 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009074 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009075 ctx := testApex(t, `
9076 apex_set {
9077 name: "com.company.android.myapex",
9078 apex_name: "com.android.myapex",
9079 set: "company-myapex.apks",
9080 }
9081 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9082 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9083 }),
9084 )
9085
9086 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9087 if compressionEnabled {
9088 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9089 } else {
9090 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9091 }
9092 })
9093 }
9094}
9095
Martin Stjernholm2856c662020-12-02 15:03:42 +00009096func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009097 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009098 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009099 apex {
9100 name: "myapex",
9101 key: "myapex.key",
9102 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009103 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009104 }
9105
9106 apex_key {
9107 name: "myapex.key",
9108 public_key: "testkey.avbpubkey",
9109 private_key: "testkey.pem",
9110 }
9111
9112 cc_library {
9113 name: "mylib",
9114 srcs: ["mylib.cpp"],
9115 apex_available: ["myapex"],
9116 shared_libs: ["otherlib"],
9117 system_shared_libs: [],
9118 }
9119
9120 cc_library {
9121 name: "otherlib",
9122 srcs: ["mylib.cpp"],
9123 stubs: {
9124 versions: ["current"],
9125 },
9126 }
9127
9128 cc_prebuilt_library_shared {
9129 name: "otherlib",
9130 prefer: true,
9131 srcs: ["prebuilt.so"],
9132 stubs: {
9133 versions: ["current"],
9134 },
9135 }
9136 `)
9137
Jooyung Hana0503a52023-08-23 13:12:50 +09009138 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009139 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009140 var builder strings.Builder
9141 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9142 androidMk := builder.String()
9143
9144 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9145 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009146 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009147}
9148
Jiyong Parke3867542020-12-03 17:28:25 +09009149func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009150 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009151 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009152 apex {
9153 name: "myapex",
9154 key: "myapex.key",
9155 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009156 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009157 }
9158
9159 apex_key {
9160 name: "myapex.key",
9161 public_key: "testkey.avbpubkey",
9162 private_key: "testkey.pem",
9163 }
9164
9165 cc_library {
9166 name: "mylib",
9167 srcs: ["mylib.cpp"],
9168 system_shared_libs: [],
9169 stl: "none",
9170 apex_available: ["myapex"],
9171 shared_libs: ["mylib2"],
9172 target: {
9173 apex: {
9174 exclude_shared_libs: ["mylib2"],
9175 },
9176 },
9177 }
9178
9179 cc_library {
9180 name: "mylib2",
9181 srcs: ["mylib.cpp"],
9182 system_shared_libs: [],
9183 stl: "none",
9184 }
9185 `)
9186
9187 // Check if mylib is linked to mylib2 for the non-apex target
9188 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9189 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9190
9191 // Make sure that the link doesn't occur for the apex target
9192 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9193 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9194
9195 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009196 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009197 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9198}
9199
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009200func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009201 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009202 bpBase := `
9203 apex {
9204 name: "myapex",
9205 key: "myapex.key",
9206 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009207 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009208 }
9209 apex_key {
9210 name: "myapex.key",
9211 public_key: "testkey.avbpubkey",
9212 private_key: "testkey.pem",
9213 }
9214 cc_library {
9215 name: "mylib",
9216 srcs: ["mylib.cpp"],
9217 apex_available: ["myapex"],
9218 shared_libs: ["stublib"],
9219 system_shared_libs: [],
9220 }
9221 apex {
9222 name: "otherapex",
9223 enabled: %s,
9224 key: "myapex.key",
9225 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009226 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009227 }
9228 `
9229
9230 stublibSourceBp := `
9231 cc_library {
9232 name: "stublib",
9233 srcs: ["mylib.cpp"],
9234 apex_available: ["otherapex"],
9235 system_shared_libs: [],
9236 stl: "none",
9237 stubs: {
9238 versions: ["1"],
9239 },
9240 }
9241 `
9242
9243 stublibPrebuiltBp := `
9244 cc_prebuilt_library_shared {
9245 name: "stublib",
9246 srcs: ["prebuilt.so"],
9247 apex_available: ["otherapex"],
9248 stubs: {
9249 versions: ["1"],
9250 },
9251 %s
9252 }
9253 `
9254
9255 tests := []struct {
9256 name string
9257 stublibBp string
9258 usePrebuilt bool
9259 modNames []string // Modules to collect AndroidMkEntries for
9260 otherApexEnabled []string
9261 }{
9262 {
9263 name: "only_source",
9264 stublibBp: stublibSourceBp,
9265 usePrebuilt: false,
9266 modNames: []string{"stublib"},
9267 otherApexEnabled: []string{"true", "false"},
9268 },
9269 {
9270 name: "source_preferred",
9271 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9272 usePrebuilt: false,
9273 modNames: []string{"stublib", "prebuilt_stublib"},
9274 otherApexEnabled: []string{"true", "false"},
9275 },
9276 {
9277 name: "prebuilt_preferred",
9278 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9279 usePrebuilt: true,
9280 modNames: []string{"stublib", "prebuilt_stublib"},
9281 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9282 },
9283 {
9284 name: "only_prebuilt",
9285 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9286 usePrebuilt: true,
9287 modNames: []string{"stublib"},
9288 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9289 },
9290 }
9291
9292 for _, test := range tests {
9293 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009294 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009295 for _, otherApexEnabled := range test.otherApexEnabled {
9296 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009298 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009299
9300 type modAndMkEntries struct {
9301 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009302 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009303 }
9304 entries := []*modAndMkEntries{}
9305
9306 // Gather shared lib modules that are installable
9307 for _, modName := range test.modNames {
9308 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9309 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9310 continue
9311 }
9312 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009313 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009314 continue
9315 }
Yu Liue70976d2024-10-15 20:45:35 +00009316 info := android.AndroidMkInfoForTest(t, ctx, mod)
9317 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9318 ents = append(ents, info.ExtraInfo...)
9319 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009320 if ent.Disabled {
9321 continue
9322 }
9323 entries = append(entries, &modAndMkEntries{
9324 mod: mod,
9325 mkEntries: ent,
9326 })
9327 }
9328 }
9329 }
9330
9331 var entry *modAndMkEntries = nil
9332 for _, ent := range entries {
9333 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9334 if entry != nil {
9335 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9336 } else {
9337 entry = ent
9338 }
9339 }
9340 }
9341
9342 if entry == nil {
9343 t.Errorf("AndroidMk entry for \"stublib\" missing")
9344 } else {
9345 isPrebuilt := entry.mod.Prebuilt() != nil
9346 if isPrebuilt != test.usePrebuilt {
9347 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9348 }
9349 if !entry.mod.IsStubs() {
9350 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9351 }
9352 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9353 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9354 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009355 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009356 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009357 if !android.InList(expected, cflags) {
9358 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9359 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009360 }
9361 })
9362 }
9363 })
9364 }
9365}
9366
Colin Crossc33e5212021-05-25 18:16:02 -07009367func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009368 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009369 bp := `
9370 apex {
9371 name: "myapex",
9372 key: "myapex.key",
9373 java_libs: ["mylib"],
9374 bootclasspath_fragments: ["mybootclasspathfragment"],
9375 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9376 updatable: false,
9377 }
9378
9379 apex_key {
9380 name: "myapex.key",
9381 public_key: "testkey.avbpubkey",
9382 private_key: "testkey.pem",
9383 }
9384
9385 java_library {
9386 name: "mylib",
9387 srcs: ["mylib.java"],
9388 apex_available: ["myapex"],
9389 compile_dex: true,
9390 }
9391
9392 bootclasspath_fragment {
9393 name: "mybootclasspathfragment",
9394 contents: ["mybootclasspathlib"],
9395 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009396 hidden_api: {
9397 split_packages: ["*"],
9398 },
Colin Crossc33e5212021-05-25 18:16:02 -07009399 }
9400
9401 java_library {
9402 name: "mybootclasspathlib",
9403 srcs: ["mybootclasspathlib.java"],
9404 apex_available: ["myapex"],
9405 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009406 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009407 }
9408
9409 systemserverclasspath_fragment {
9410 name: "mysystemserverclasspathfragment",
9411 contents: ["mysystemserverclasspathlib"],
9412 apex_available: ["myapex"],
9413 }
9414
9415 java_library {
9416 name: "mysystemserverclasspathlib",
9417 srcs: ["mysystemserverclasspathlib.java"],
9418 apex_available: ["myapex"],
9419 compile_dex: true,
9420 }
9421 `
9422
9423 result := android.GroupFixturePreparers(
9424 PrepareForTestWithApexBuildComponents,
9425 prepareForTestWithMyapex,
9426 java.PrepareForTestWithJavaDefaultModules,
9427 android.PrepareForTestWithAndroidBuildComponents,
9428 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009429 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9430 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009431 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009432 ).RunTest(t)
9433
9434 // Make sure jacoco ran on both mylib and mybootclasspathlib
9435 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9436 t.Errorf("Failed to find jacoco rule for mylib")
9437 }
9438 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9439 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9440 }
9441 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9442 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9443 }
9444}
9445
Jiyong Park192600a2021-08-03 07:52:17 +00009446func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009447 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009448 testApexError(t, `executable mybin is static`, `
9449 apex {
9450 name: "myapex",
9451 key: "myapex.key",
9452 binaries: ["mybin"],
9453 min_sdk_version: "29",
9454 }
9455
9456 apex_key {
9457 name: "myapex.key",
9458 public_key: "testkey.avbpubkey",
9459 private_key: "testkey.pem",
9460 }
9461
9462 cc_binary {
9463 name: "mybin",
9464 srcs: ["mylib.cpp"],
9465 relative_install_path: "foo/bar",
9466 static_executable: true,
9467 system_shared_libs: [],
9468 stl: "none",
9469 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009470 min_sdk_version: "29",
9471 }
9472 `)
9473
9474 testApexError(t, `executable mybin.rust is static`, `
9475 apex {
9476 name: "myapex",
9477 key: "myapex.key",
9478 binaries: ["mybin.rust"],
9479 min_sdk_version: "29",
9480 }
9481
9482 apex_key {
9483 name: "myapex.key",
9484 public_key: "testkey.avbpubkey",
9485 private_key: "testkey.pem",
9486 }
9487
9488 rust_binary {
9489 name: "mybin.rust",
9490 srcs: ["foo.rs"],
9491 static_executable: true,
9492 apex_available: ["myapex"],
9493 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009494 }
9495 `)
9496}
9497
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009498func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009499 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009500 ctx := testApex(t, `
9501 apex {
9502 name: "myapex",
9503 key: "myapex.key",
9504 updatable: false,
9505 java_libs: ["foo"],
9506 }
9507
9508 apex_key {
9509 name: "myapex.key",
9510 public_key: "testkey.avbpubkey",
9511 private_key: "testkey.pem",
9512 }
9513
9514 java_library {
9515 name: "foo",
9516 srcs: ["foo.java"],
9517 apex_available: ["myapex"],
9518 installable: true,
9519 }
9520 `,
9521 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9522 )
9523
Jooyung Hana0503a52023-08-23 13:12:50 +09009524 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009525 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9526 var builder strings.Builder
9527 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9528 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009529 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 +00009530}
9531
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009532func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009533 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009534 ctx := testApex(t, `
9535 apex {
9536 name: "myapex",
9537 key: "myapex.key",
9538 updatable: false,
9539 java_libs: ["foo"],
9540 required: ["otherapex"],
9541 }
9542
9543 apex {
9544 name: "otherapex",
9545 key: "myapex.key",
9546 updatable: false,
9547 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009548 }
9549
9550 apex_key {
9551 name: "myapex.key",
9552 public_key: "testkey.avbpubkey",
9553 private_key: "testkey.pem",
9554 }
9555
9556 java_library {
9557 name: "foo",
9558 srcs: ["foo.java"],
9559 apex_available: ["myapex", "otherapex"],
9560 installable: true,
9561 }
9562 `)
9563
Jooyung Hana0503a52023-08-23 13:12:50 +09009564 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009565 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9566 var builder strings.Builder
9567 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9568 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009569 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009570}
9571
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009572func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009573 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009574 ctx := testApex(t, `
9575 apex {
9576 name: "myapex",
9577 key: "myapex.key",
9578 updatable: false,
9579 }
9580
9581 apex_key {
9582 name: "myapex.key",
9583 public_key: "testkey.avbpubkey",
9584 private_key: "testkey.pem",
9585 }
9586 `)
9587
Jooyung Hana0503a52023-08-23 13:12:50 +09009588 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009589 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009590 data := android.AndroidMkDataForTest(t, ctx, bundle)
9591 var builder strings.Builder
9592 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9593 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009594 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009595}
9596
Jooyung Hana6d36672022-02-24 13:58:07 +09009597func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009598 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009599 for _, tc := range []struct {
9600 name string
9601 ref string
9602 expected_data []string
9603 }{
9604 {
9605 name: "test_using_output",
9606 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009607 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009608 },
9609 {
9610 name: "test_using_apex",
9611 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009612 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009613 },
9614 } {
9615 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009616 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009617 ctx := testApex(t, `
9618 apex {
9619 name: "myapex",
9620 key: "myapex.key",
9621 compressible: true,
9622 updatable: false,
9623 }
9624
9625 apex_key {
9626 name: "myapex.key",
9627 public_key: "testkey.avbpubkey",
9628 private_key: "testkey.pem",
9629 }
9630
9631 java_test {
9632 name: "`+tc.name+`",
9633 srcs: ["a.java"],
9634 data: ["`+tc.ref+`"],
9635 }
9636 `,
9637 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9638 variables.CompressedApex = proptools.BoolPtr(true)
9639 }))
9640 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9641 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9642 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9643 })
9644 }
9645}
9646
satayev758968a2021-12-06 11:42:40 +00009647func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009648 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009649 preparer := android.GroupFixturePreparers(
9650 PrepareForTestWithApexBuildComponents,
9651 prepareForTestWithMyapex,
9652 java.PrepareForTestWithJavaSdkLibraryFiles,
9653 java.PrepareForTestWithJavaDefaultModules,
9654 android.PrepareForTestWithAndroidBuildComponents,
9655 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9656 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9657 )
9658
9659 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9660 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009661 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009662 preparer.RunTestWithBp(t, `
9663 apex {
9664 name: "myapex",
9665 key: "myapex.key",
9666 bootclasspath_fragments: ["mybootclasspathfragment"],
9667 min_sdk_version: "30",
9668 updatable: false,
9669 }
9670
9671 apex_key {
9672 name: "myapex.key",
9673 public_key: "testkey.avbpubkey",
9674 private_key: "testkey.pem",
9675 }
9676
9677 bootclasspath_fragment {
9678 name: "mybootclasspathfragment",
9679 contents: ["mybootclasspathlib"],
9680 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009681 hidden_api: {
9682 split_packages: ["*"],
9683 },
satayev758968a2021-12-06 11:42:40 +00009684 }
9685
9686 java_sdk_library {
9687 name: "mybootclasspathlib",
9688 srcs: ["mybootclasspathlib.java"],
9689 apex_available: ["myapex"],
9690 compile_dex: true,
9691 unsafe_ignore_missing_latest_api: true,
9692 min_sdk_version: "31",
9693 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009694 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009695 }
9696
9697 java_library {
9698 name: "util",
9699 srcs: ["a.java"],
9700 apex_available: ["myapex"],
9701 min_sdk_version: "31",
9702 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009703 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009704 }
9705
9706 java_library {
9707 name: "another_util",
9708 srcs: ["a.java"],
9709 min_sdk_version: "31",
9710 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009711 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009712 }
9713 `)
9714 })
9715
9716 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9717 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009718 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009719 preparer.RunTestWithBp(t, `
9720 apex {
9721 name: "myapex",
9722 key: "myapex.key",
9723 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9724 min_sdk_version: "30",
9725 updatable: false,
9726 }
9727
9728 apex_key {
9729 name: "myapex.key",
9730 public_key: "testkey.avbpubkey",
9731 private_key: "testkey.pem",
9732 }
9733
9734 systemserverclasspath_fragment {
9735 name: "mysystemserverclasspathfragment",
9736 contents: ["mysystemserverclasspathlib"],
9737 apex_available: ["myapex"],
9738 }
9739
9740 java_sdk_library {
9741 name: "mysystemserverclasspathlib",
9742 srcs: ["mysystemserverclasspathlib.java"],
9743 apex_available: ["myapex"],
9744 compile_dex: true,
9745 min_sdk_version: "32",
9746 unsafe_ignore_missing_latest_api: true,
9747 static_libs: ["util"],
9748 }
9749
9750 java_library {
9751 name: "util",
9752 srcs: ["a.java"],
9753 apex_available: ["myapex"],
9754 min_sdk_version: "31",
9755 static_libs: ["another_util"],
9756 }
9757
9758 java_library {
9759 name: "another_util",
9760 srcs: ["a.java"],
9761 min_sdk_version: "31",
9762 apex_available: ["myapex"],
9763 }
9764 `)
9765 })
9766
9767 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009768 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009769 preparer.
satayev758968a2021-12-06 11:42:40 +00009770 RunTestWithBp(t, `
9771 apex {
9772 name: "myapex",
9773 key: "myapex.key",
9774 bootclasspath_fragments: ["mybootclasspathfragment"],
9775 min_sdk_version: "30",
9776 updatable: false,
9777 }
9778
9779 apex_key {
9780 name: "myapex.key",
9781 public_key: "testkey.avbpubkey",
9782 private_key: "testkey.pem",
9783 }
9784
9785 bootclasspath_fragment {
9786 name: "mybootclasspathfragment",
9787 contents: ["mybootclasspathlib"],
9788 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009789 hidden_api: {
9790 split_packages: ["*"],
9791 },
satayev758968a2021-12-06 11:42:40 +00009792 }
9793
9794 java_sdk_library {
9795 name: "mybootclasspathlib",
9796 srcs: ["mybootclasspathlib.java"],
9797 apex_available: ["myapex"],
9798 compile_dex: true,
9799 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009800 sdk_version: "current",
9801 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009802 }
9803 `)
9804 })
9805
9806 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009807 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009808 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9809 RunTestWithBp(t, `
9810 apex {
9811 name: "myapex",
9812 key: "myapex.key",
9813 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9814 min_sdk_version: "30",
9815 updatable: false,
9816 }
9817
9818 apex_key {
9819 name: "myapex.key",
9820 public_key: "testkey.avbpubkey",
9821 private_key: "testkey.pem",
9822 }
9823
9824 systemserverclasspath_fragment {
9825 name: "mysystemserverclasspathfragment",
9826 contents: ["mysystemserverclasspathlib"],
9827 apex_available: ["myapex"],
9828 }
9829
9830 java_sdk_library {
9831 name: "mysystemserverclasspathlib",
9832 srcs: ["mysystemserverclasspathlib.java"],
9833 apex_available: ["myapex"],
9834 compile_dex: true,
9835 unsafe_ignore_missing_latest_api: true,
9836 }
9837 `)
9838 })
9839}
9840
Jiakai Zhang6decef92022-01-12 17:56:19 +00009841// Verifies that the APEX depends on all the Make modules in the list.
9842func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9843 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9844 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009845 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009846 }
9847}
9848
9849// Verifies that the APEX does not depend on any of the Make modules in the list.
9850func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9851 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9852 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009853 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009854 }
9855}
9856
Cole Faust24e25c02024-01-19 14:12:17 -08009857func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009858 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009859 bpTemplate := `
9860 apex {
9861 name: "myapex",
9862 key: "myapex.key",
9863 java_libs: ["myjavalib"],
9864 updatable: %v,
9865 min_sdk_version: "29",
9866 }
9867 apex_key {
9868 name: "myapex.key",
9869 }
9870 java_library {
9871 name: "myjavalib",
9872 srcs: ["MyClass.java"],
9873 apex_available: [ "myapex" ],
9874 lint: {
9875 strict_updatability_linting: %v,
9876 %s
9877 },
9878 sdk_version: "current",
9879 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009880 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009881 }
9882 `
9883 fs := android.MockFS{
9884 "lint-baseline.xml": nil,
9885 }
9886
9887 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009888 testCaseName string
9889 apexUpdatable bool
9890 javaStrictUpdtabilityLint bool
9891 lintFileExists bool
9892 disallowedFlagExpectedOnApex bool
9893 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009894 }{
9895 {
Colin Cross87427352024-09-25 15:41:19 -07009896 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9897 apexUpdatable: true,
9898 javaStrictUpdtabilityLint: true,
9899 lintFileExists: false,
9900 disallowedFlagExpectedOnApex: false,
9901 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009902 },
9903 {
Colin Cross87427352024-09-25 15:41:19 -07009904 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9905 apexUpdatable: false,
9906 javaStrictUpdtabilityLint: false,
9907 lintFileExists: true,
9908 disallowedFlagExpectedOnApex: false,
9909 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009910 },
9911 {
Colin Cross87427352024-09-25 15:41:19 -07009912 testCaseName: "non-updatable apex respects strict updatability of javalib",
9913 apexUpdatable: false,
9914 javaStrictUpdtabilityLint: true,
9915 lintFileExists: true,
9916 disallowedFlagExpectedOnApex: false,
9917 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009918 },
9919 {
Colin Cross87427352024-09-25 15:41:19 -07009920 testCaseName: "updatable apex checks strict updatability of javalib",
9921 apexUpdatable: true,
9922 javaStrictUpdtabilityLint: false,
9923 lintFileExists: true,
9924 disallowedFlagExpectedOnApex: true,
9925 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009926 },
9927 }
9928
9929 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009930 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009931 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009932 fixtures := []android.FixturePreparer{}
9933 baselineProperty := ""
9934 if testCase.lintFileExists {
9935 fixtures = append(fixtures, fs.AddToFixture())
9936 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9937 }
9938 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009939
Colin Cross87427352024-09-25 15:41:19 -07009940 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009941
Colin Cross87427352024-09-25 15:41:19 -07009942 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9943 if expectStrictUpdatability {
9944 if m.Rule == nil {
9945 t.Errorf("expected strict updatability check rule on %s", name)
9946 } else {
9947 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9948 m.RuleParams.Command, "--disallowed_issues NewApi")
9949 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9950 m.Inputs.Strings(), "lint-baseline.xml")
9951 }
9952 } else {
9953 if m.Rule != nil {
9954 t.Errorf("expected no strict updatability check rule on %s", name)
9955 }
9956 }
9957 }
9958
9959 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9960 apex := result.ModuleForTests("myapex", "android_common_myapex")
9961 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9962 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9963
9964 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9965 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9966 })
Cole Faust24e25c02024-01-19 14:12:17 -08009967 }
9968}
9969
Cole Faust24e25c02024-01-19 14:12:17 -08009970// checks transtive deps of an apex coming from bootclasspath_fragment
9971func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009972 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009973 bp := `
9974 apex {
9975 name: "myapex",
9976 key: "myapex.key",
9977 bootclasspath_fragments: ["mybootclasspathfragment"],
9978 updatable: true,
9979 min_sdk_version: "29",
9980 }
9981 apex_key {
9982 name: "myapex.key",
9983 }
9984 bootclasspath_fragment {
9985 name: "mybootclasspathfragment",
9986 contents: ["myjavalib"],
9987 apex_available: ["myapex"],
9988 hidden_api: {
9989 split_packages: ["*"],
9990 },
9991 }
9992 java_library {
9993 name: "myjavalib",
9994 srcs: ["MyClass.java"],
9995 apex_available: [ "myapex" ],
9996 sdk_version: "current",
9997 min_sdk_version: "29",
9998 compile_dex: true,
9999 lint: {
10000 baseline_filename: "lint-baseline.xml",
10001 }
10002 }
10003 `
10004 fs := android.MockFS{
10005 "lint-baseline.xml": nil,
10006 }
10007
10008 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010009 apex := result.ModuleForTests("myapex", "android_common_myapex")
10010 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10011 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10012 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10013 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10014 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010015}
Spandan Das66773252022-01-15 00:23:18 +000010016
Jihoon Kang784c0052024-06-25 22:15:39 +000010017func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010018 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010019 bp := `
10020 apex {
10021 name: "myapex",
10022 key: "myapex.key",
10023 bootclasspath_fragments: ["mybootclasspathfragment"],
10024 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010025 java_libs: [
10026 "jacocoagent",
10027 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010028 }
10029 apex_key {
10030 name: "myapex.key",
10031 }
10032 bootclasspath_fragment {
10033 name: "mybootclasspathfragment",
10034 contents: ["foo"],
10035 apex_available: ["myapex"],
10036 hidden_api: {
10037 split_packages: ["*"],
10038 },
10039 }
10040 java_sdk_library {
10041 name: "foo",
10042 srcs: ["MyClass.java"],
10043 apex_available: [ "myapex" ],
10044 sdk_version: "current",
10045 min_sdk_version: "29",
10046 compile_dex: true,
10047 }
10048 `
10049 fs := android.MockFS{
10050 "lint-baseline.xml": nil,
10051 }
10052
10053 result := android.GroupFixturePreparers(
10054 prepareForApexTest,
10055 java.PrepareForTestWithJavaSdkLibraryFiles,
10056 java.PrepareForTestWithJacocoInstrumentation,
10057 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010058 android.FixtureMergeMockFs(fs),
10059 ).RunTestWithBp(t, bp)
10060
10061 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10062 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10063 android.AssertStringDoesContain(t,
10064 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10065 lintReportInputs, "foo.impl")
10066}
10067
Spandan Das42e89502022-05-06 22:12:55 +000010068// updatable apexes should propagate updatable=true to its apps
10069func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010070 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010071 bp := `
10072 apex {
10073 name: "myapex",
10074 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010075 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010076 apps: [
10077 "myapp",
10078 ],
10079 min_sdk_version: "30",
10080 }
10081 apex_key {
10082 name: "myapex.key",
10083 }
10084 android_app {
10085 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010086 apex_available: [
10087 "myapex",
10088 ],
10089 sdk_version: "current",
10090 min_sdk_version: "30",
10091 }
10092 `
Colin Cross99939e92024-10-01 16:02:46 -070010093 _ = android.GroupFixturePreparers(
10094 prepareForApexTest,
10095 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10096 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010097}
10098
Jingwen Chendea7a642023-03-28 11:30:50 +000010099func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010100 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010101 ctx := testApex(t, `
10102 apex {
10103 name: "myapex",
10104 key: "myapex.key",
10105 updatable: false,
10106 }
10107
10108 apex_key {
10109 name: "myapex.key",
10110 public_key: "testkey.avbpubkey",
10111 private_key: "testkey.pem",
10112 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010113 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010114 generateFsRule := mod.Rule("generateFsConfig")
10115 cmd := generateFsRule.RuleParams.Command
10116
10117 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10118}
10119
10120func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010121 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010122 ctx := testApex(t, `
10123 apex {
10124 name: "myapex",
10125 key: "myapex.key",
10126 canned_fs_config: "my_config",
10127 updatable: false,
10128 }
10129
10130 apex_key {
10131 name: "myapex.key",
10132 public_key: "testkey.avbpubkey",
10133 private_key: "testkey.pem",
10134 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010135 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010136 generateFsRule := mod.Rule("generateFsConfig")
10137 cmd := generateFsRule.RuleParams.Command
10138
10139 // Ensure that canned_fs_config has "cat my_config" at the end
10140 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10141}
Spandan Das20fce2d2023-04-12 17:21:39 +000010142
10143func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010144 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010145 testCases := []struct {
10146 desc string
10147 hasStubs bool
10148 apexAvailable string
10149 expectedError string
10150 }{
10151 {
10152 desc: "non-stub library can have multiple apex_available",
10153 hasStubs: false,
10154 apexAvailable: `["myapex", "otherapex"]`,
10155 },
10156 {
10157 desc: "stub library should not be available to anyapex",
10158 hasStubs: true,
10159 apexAvailable: `["//apex_available:anyapex"]`,
10160 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10161 },
10162 {
10163 desc: "stub library should not be available to multiple apexes",
10164 hasStubs: true,
10165 apexAvailable: `["myapex", "otherapex"]`,
10166 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10167 },
10168 {
10169 desc: "stub library can be available to a core apex and a test apex",
10170 hasStubs: true,
10171 apexAvailable: `["myapex", "test_myapex"]`,
10172 },
10173 }
10174 bpTemplate := `
10175 cc_library {
10176 name: "libfoo",
10177 %v
10178 apex_available: %v,
10179 }
10180 apex {
10181 name: "myapex",
10182 key: "apex.key",
10183 updatable: false,
10184 native_shared_libs: ["libfoo"],
10185 }
10186 apex {
10187 name: "otherapex",
10188 key: "apex.key",
10189 updatable: false,
10190 }
10191 apex_test {
10192 name: "test_myapex",
10193 key: "apex.key",
10194 updatable: false,
10195 native_shared_libs: ["libfoo"],
10196 }
10197 apex_key {
10198 name: "apex.key",
10199 }
10200 `
10201 for _, tc := range testCases {
10202 stubs := ""
10203 if tc.hasStubs {
10204 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10205 }
10206 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10207 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10208 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10209 })
10210 if tc.expectedError == "" {
10211 testApex(t, bp, mockFsFixturePreparer)
10212 } else {
10213 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10214 }
10215 }
10216}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010217
10218func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010219 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010220 context := android.GroupFixturePreparers(
10221 android.PrepareForIntegrationTestWithAndroid,
10222 cc.PrepareForIntegrationTestWithCc,
10223 PrepareForTestWithApexBuildComponents,
10224 prepareForTestWithMyapex,
10225 filesystem.PrepareForTestWithFilesystemBuildComponents,
10226 )
10227 result := context.RunTestWithBp(t, `
10228 android_system_image {
10229 name: "myfilesystem",
10230 deps: [
10231 "libfoo",
10232 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010233 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010234 gen_linker_config: true,
10235 linker_config_srcs: ["linker.config.json"],
10236 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010237 }
10238
10239 cc_library {
10240 name: "libfoo",
10241 shared_libs: [
10242 "libbar",
10243 ],
10244 stl: "none",
10245 }
10246
10247 cc_library {
10248 name: "libbar",
10249 stl: "none",
10250 apex_available: ["myapex"],
10251 }
10252
10253 apex {
10254 name: "myapex",
10255 native_shared_libs: ["libbar"],
10256 key: "myapex.key",
10257 updatable: false,
10258 }
10259
10260 apex_key {
10261 name: "myapex.key",
10262 public_key: "testkey.avbpubkey",
10263 private_key: "testkey.pem",
10264 }
10265 `)
10266
Cole Faust3b806d32024-03-11 15:15:03 -070010267 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010268 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10269 inputs.Strings(),
10270 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10271}
Yu Liueae7b362023-11-16 17:05:47 -080010272
10273var apex_default_bp = `
10274 apex_key {
10275 name: "myapex.key",
10276 public_key: "testkey.avbpubkey",
10277 private_key: "testkey.pem",
10278 }
10279
10280 filegroup {
10281 name: "myapex.manifest",
10282 srcs: ["apex_manifest.json"],
10283 }
10284
10285 filegroup {
10286 name: "myapex.androidmanifest",
10287 srcs: ["AndroidManifest.xml"],
10288 }
10289`
10290
10291func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010292 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010293 ctx := testApex(t, apex_default_bp+`
10294 apex {
10295 name: "myapex",
10296 manifest: ":myapex.manifest",
10297 androidManifest: ":myapex.androidmanifest",
10298 key: "myapex.key",
10299 java_libs: [
10300 "my_java_library_foo",
10301 "my_java_library_bar",
10302 ],
10303 updatable: false,
10304 }
10305
10306 java_library {
10307 name: "my_java_library_foo",
10308 srcs: ["foo/bar/MyClass.java"],
10309 sdk_version: "none",
10310 system_modules: "none",
10311 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010312 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010313 "myapex",
10314 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010315 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010316 }
10317
10318 java_library {
10319 name: "my_java_library_bar",
10320 srcs: ["foo/bar/MyClass.java"],
10321 sdk_version: "none",
10322 system_modules: "none",
10323 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010324 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010325 "myapex",
10326 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010327 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010328 }
10329
10330 aconfig_declarations {
10331 name: "my_aconfig_declarations_foo",
10332 package: "com.example.package",
10333 container: "myapex",
10334 srcs: ["foo.aconfig"],
10335 }
10336
10337 java_aconfig_library {
10338 name: "my_java_aconfig_library_foo",
10339 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010340 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010341 "myapex",
10342 ],
10343 }
10344
10345 aconfig_declarations {
10346 name: "my_aconfig_declarations_bar",
10347 package: "com.example.package",
10348 container: "myapex",
10349 srcs: ["bar.aconfig"],
10350 }
10351
10352 java_aconfig_library {
10353 name: "my_java_aconfig_library_bar",
10354 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010355 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010356 "myapex",
10357 ],
10358 }
10359 `)
10360
10361 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10362 s := mod.Rule("apexRule").Args["copy_commands"]
10363 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010364 if len(copyCmds) != 14 {
10365 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010366 }
10367
Jooyung Hana3fddf42024-09-03 13:22:21 +090010368 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10369 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10370 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10371 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010372 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010373
Yu Liubba555e2024-02-17 00:36:42 +000010374 inputs := []string{
10375 "my_aconfig_declarations_foo/intermediate.pb",
10376 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010377 }
Yu Liubba555e2024-02-17 00:36:42 +000010378 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10379 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10380 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10381 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010382 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010383}
10384
10385func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010386 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010387 ctx := testApex(t, apex_default_bp+`
10388 apex {
10389 name: "myapex",
10390 manifest: ":myapex.manifest",
10391 androidManifest: ":myapex.androidmanifest",
10392 key: "myapex.key",
10393 java_libs: [
10394 "my_java_library_foo",
10395 ],
10396 native_shared_libs: [
10397 "my_cc_library_bar",
10398 ],
10399 binaries: [
10400 "my_cc_binary_baz",
10401 ],
10402 updatable: false,
10403 }
10404
10405 java_library {
10406 name: "my_java_library_foo",
10407 srcs: ["foo/bar/MyClass.java"],
10408 sdk_version: "none",
10409 system_modules: "none",
10410 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010411 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010412 "myapex",
10413 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010414 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010415 }
10416
10417 cc_library {
10418 name: "my_cc_library_bar",
10419 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010420 static_libs: [
10421 "my_cc_aconfig_library_bar",
10422 "my_cc_aconfig_library_baz",
10423 ],
Yu Liueae7b362023-11-16 17:05:47 -080010424 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010425 "myapex",
10426 ],
10427 }
10428
10429 cc_binary {
10430 name: "my_cc_binary_baz",
10431 srcs: ["foo/bar/MyClass.cc"],
10432 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010433 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010434 "myapex",
10435 ],
10436 }
10437
10438 aconfig_declarations {
10439 name: "my_aconfig_declarations_foo",
10440 package: "com.example.package",
10441 container: "myapex",
10442 srcs: ["foo.aconfig"],
10443 }
10444
10445 java_aconfig_library {
10446 name: "my_java_aconfig_library_foo",
10447 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010448 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010449 "myapex",
10450 ],
10451 }
10452
10453 aconfig_declarations {
10454 name: "my_aconfig_declarations_bar",
10455 package: "com.example.package",
10456 container: "myapex",
10457 srcs: ["bar.aconfig"],
10458 }
10459
10460 cc_aconfig_library {
10461 name: "my_cc_aconfig_library_bar",
10462 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010463 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010464 "myapex",
10465 ],
10466 }
10467
10468 aconfig_declarations {
10469 name: "my_aconfig_declarations_baz",
10470 package: "com.example.package",
10471 container: "myapex",
10472 srcs: ["baz.aconfig"],
10473 }
10474
10475 cc_aconfig_library {
10476 name: "my_cc_aconfig_library_baz",
10477 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010478 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010479 "myapex",
10480 ],
10481 }
10482
10483 cc_library {
10484 name: "server_configurable_flags",
10485 srcs: ["server_configurable_flags.cc"],
10486 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010487 cc_library {
10488 name: "libbase",
10489 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010490 apex_available: [
10491 "myapex",
10492 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010493 }
10494 cc_library {
10495 name: "libaconfig_storage_read_api_cc",
10496 srcs: ["libaconfig_storage_read_api_cc.cc"],
10497 }
Yu Liueae7b362023-11-16 17:05:47 -080010498 `)
10499
10500 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10501 s := mod.Rule("apexRule").Args["copy_commands"]
10502 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010503 if len(copyCmds) != 18 {
10504 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010505 }
10506
Jooyung Hana3fddf42024-09-03 13:22:21 +090010507 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10508 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10509 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10510 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010511 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010512
Yu Liubba555e2024-02-17 00:36:42 +000010513 inputs := []string{
10514 "my_aconfig_declarations_foo/intermediate.pb",
10515 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10516 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010517 }
Yu Liubba555e2024-02-17 00:36:42 +000010518 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10519 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10520 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10521 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010522 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010523}
10524
Yu Liucec0e412023-11-30 16:45:50 -080010525func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010526 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010527 ctx := testApex(t, apex_default_bp+`
10528 apex {
10529 name: "myapex",
10530 manifest: ":myapex.manifest",
10531 androidManifest: ":myapex.androidmanifest",
10532 key: "myapex.key",
10533 native_shared_libs: [
10534 "libmy_rust_library",
10535 ],
10536 binaries: [
10537 "my_rust_binary",
10538 ],
10539 rust_dyn_libs: [
10540 "libmy_rust_dylib",
10541 ],
10542 updatable: false,
10543 }
10544
10545 rust_library {
10546 name: "libflags_rust", // test mock
10547 crate_name: "flags_rust",
10548 srcs: ["lib.rs"],
10549 apex_available: [
10550 "myapex",
10551 ],
10552 }
10553
10554 rust_library {
10555 name: "liblazy_static", // test mock
10556 crate_name: "lazy_static",
10557 srcs: ["src/lib.rs"],
10558 apex_available: [
10559 "myapex",
10560 ],
10561 }
10562
Ted Bauer02d475c2024-03-27 20:56:26 +000010563 rust_library {
10564 name: "libaconfig_storage_read_api", // test mock
10565 crate_name: "aconfig_storage_read_api",
10566 srcs: ["src/lib.rs"],
10567 apex_available: [
10568 "myapex",
10569 ],
10570 }
10571
Ted Bauer6ef40db2024-03-29 14:04:10 +000010572 rust_library {
10573 name: "liblogger", // test mock
10574 crate_name: "logger",
10575 srcs: ["src/lib.rs"],
10576 apex_available: [
10577 "myapex",
10578 ],
10579 }
10580
10581 rust_library {
10582 name: "liblog_rust", // test mock
10583 crate_name: "log_rust",
10584 srcs: ["src/lib.rs"],
10585 apex_available: [
10586 "myapex",
10587 ],
10588 }
10589
Yu Liucec0e412023-11-30 16:45:50 -080010590 rust_ffi_shared {
10591 name: "libmy_rust_library",
10592 srcs: ["src/lib.rs"],
10593 rustlibs: ["libmy_rust_aconfig_library_foo"],
10594 crate_name: "my_rust_library",
10595 apex_available: [
10596 "myapex",
10597 ],
10598 }
10599
10600 rust_library_dylib {
10601 name: "libmy_rust_dylib",
10602 srcs: ["foo/bar/MyClass.rs"],
10603 rustlibs: ["libmy_rust_aconfig_library_bar"],
10604 crate_name: "my_rust_dylib",
10605 apex_available: [
10606 "myapex",
10607 ],
10608 }
10609
10610 rust_binary {
10611 name: "my_rust_binary",
10612 srcs: ["foo/bar/MyClass.rs"],
10613 rustlibs: [
10614 "libmy_rust_aconfig_library_baz",
10615 "libmy_rust_dylib",
10616 ],
10617 apex_available: [
10618 "myapex",
10619 ],
10620 }
10621
10622 aconfig_declarations {
10623 name: "my_aconfig_declarations_foo",
10624 package: "com.example.package",
10625 container: "myapex",
10626 srcs: ["foo.aconfig"],
10627 }
10628
10629 aconfig_declarations {
10630 name: "my_aconfig_declarations_bar",
10631 package: "com.example.package",
10632 container: "myapex",
10633 srcs: ["bar.aconfig"],
10634 }
10635
10636 aconfig_declarations {
10637 name: "my_aconfig_declarations_baz",
10638 package: "com.example.package",
10639 container: "myapex",
10640 srcs: ["baz.aconfig"],
10641 }
10642
10643 rust_aconfig_library {
10644 name: "libmy_rust_aconfig_library_foo",
10645 aconfig_declarations: "my_aconfig_declarations_foo",
10646 crate_name: "my_rust_aconfig_library_foo",
10647 apex_available: [
10648 "myapex",
10649 ],
10650 }
10651
10652 rust_aconfig_library {
10653 name: "libmy_rust_aconfig_library_bar",
10654 aconfig_declarations: "my_aconfig_declarations_bar",
10655 crate_name: "my_rust_aconfig_library_bar",
10656 apex_available: [
10657 "myapex",
10658 ],
10659 }
10660
10661 rust_aconfig_library {
10662 name: "libmy_rust_aconfig_library_baz",
10663 aconfig_declarations: "my_aconfig_declarations_baz",
10664 crate_name: "my_rust_aconfig_library_baz",
10665 apex_available: [
10666 "myapex",
10667 ],
10668 }
10669 `)
10670
10671 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10672 s := mod.Rule("apexRule").Args["copy_commands"]
10673 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010674 if len(copyCmds) != 38 {
10675 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010676 }
10677
Jooyung Hana3fddf42024-09-03 13:22:21 +090010678 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10679 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10680 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10681 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010682 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010683
Yu Liubba555e2024-02-17 00:36:42 +000010684 inputs := []string{
10685 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010686 "my_aconfig_declarations_bar/intermediate.pb",
10687 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010688 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10689 }
10690 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10691 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10692 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10693 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010694 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010695}
10696
10697func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10698 aconfigRule := mod.Description(desc)
10699 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010700 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010701 if len(aconfigArgs) != len(inputs) {
10702 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010703 }
Yu Liucec0e412023-11-30 16:45:50 -080010704
Yu Liubba555e2024-02-17 00:36:42 +000010705 ensureEquals(t, container, aconfigRule.Args["container"])
10706 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10707
10708 buildParams := aconfigRule.BuildParams
10709 for _, input := range inputs {
10710 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10711 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010712 }
Yu Liubba555e2024-02-17 00:36:42 +000010713
10714 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010715}
10716
Yu Liueae7b362023-11-16 17:05:47 -080010717func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010718 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010719 ctx := testApex(t, apex_default_bp+`
10720 apex {
10721 name: "myapex",
10722 manifest: ":myapex.manifest",
10723 androidManifest: ":myapex.androidmanifest",
10724 key: "myapex.key",
10725 java_libs: [
10726 "my_java_library_foo",
10727 "other_java_library_bar",
10728 ],
10729 updatable: false,
10730 }
10731
10732 java_library {
10733 name: "my_java_library_foo",
10734 srcs: ["foo/bar/MyClass.java"],
10735 sdk_version: "none",
10736 system_modules: "none",
10737 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010738 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010739 "myapex",
10740 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010741 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010742 }
10743
10744 java_library {
10745 name: "other_java_library_bar",
10746 srcs: ["foo/bar/MyClass.java"],
10747 sdk_version: "none",
10748 system_modules: "none",
10749 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010750 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010751 "myapex",
10752 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010753 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010754 }
10755
10756 aconfig_declarations {
10757 name: "my_aconfig_declarations_foo",
10758 package: "com.example.package",
10759 container: "myapex",
10760 srcs: ["foo.aconfig"],
10761 }
10762
10763 java_aconfig_library {
10764 name: "my_java_aconfig_library_foo",
10765 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010766 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010767 "myapex",
10768 ],
10769 }
10770
10771 aconfig_declarations {
10772 name: "other_aconfig_declarations_bar",
10773 package: "com.example.package",
10774 container: "otherapex",
10775 srcs: ["bar.aconfig"],
10776 }
10777
10778 java_aconfig_library {
10779 name: "other_java_aconfig_library_bar",
10780 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010781 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010782 "myapex",
10783 ],
10784 }
10785 `)
10786
10787 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10788 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10789 s := " " + combineAconfigRule.Args["cache_files"]
10790 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10791 if len(aconfigArgs) != 1 {
10792 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10793 }
10794 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10795
10796 buildParams := combineAconfigRule.BuildParams
10797 if len(buildParams.Inputs) != 1 {
10798 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10799 }
10800 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10801 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10802}
10803
10804func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010805 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010806 ctx := testApex(t, apex_default_bp+`
10807 apex {
10808 name: "myapex",
10809 manifest: ":myapex.manifest",
10810 androidManifest: ":myapex.androidmanifest",
10811 key: "myapex.key",
10812 java_libs: [
10813 "my_java_library_foo",
10814 "my_java_library_bar",
10815 ],
10816 updatable: false,
10817 }
10818
10819 java_library {
10820 name: "my_java_library_foo",
10821 srcs: ["foo/bar/MyClass.java"],
10822 sdk_version: "none",
10823 system_modules: "none",
10824 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010825 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010826 "myapex",
10827 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010828 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010829 }
10830
10831 java_library {
10832 name: "my_java_library_bar",
10833 srcs: ["foo/bar/MyClass.java"],
10834 sdk_version: "none",
10835 system_modules: "none",
10836 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010837 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010838 "myapex",
10839 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010840 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010841 }
10842
10843 aconfig_declarations {
10844 name: "my_aconfig_declarations_foo",
10845 package: "com.example.package",
10846 container: "myapex",
10847 srcs: ["foo.aconfig"],
10848 }
10849
10850 java_aconfig_library {
10851 name: "my_java_aconfig_library_foo",
10852 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010853 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010854 "myapex",
10855 ],
10856 }
10857
10858 java_aconfig_library {
10859 name: "my_java_aconfig_library_bar",
10860 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010861 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010862 "myapex",
10863 ],
10864 }
10865 `)
10866
10867 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10868 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10869 s := " " + combineAconfigRule.Args["cache_files"]
10870 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10871 if len(aconfigArgs) != 1 {
10872 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10873 }
10874 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10875
10876 buildParams := combineAconfigRule.BuildParams
10877 if len(buildParams.Inputs) != 1 {
10878 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10879 }
10880 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10881 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10882}
Spandan Das5be63332023-12-13 00:06:32 +000010883
10884// Test that the boot jars come from the _selected_ apex prebuilt
10885// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10886func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010887 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010888 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10889 t.Helper()
10890 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10891 foundLibfooJar := false
10892 base := stem + ".jar"
10893 for _, output := range s.AllOutputs() {
10894 if filepath.Base(output) == base {
10895 foundLibfooJar = true
10896 buildRule := s.Output(output)
10897 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10898 }
10899 }
10900 if !foundLibfooJar {
10901 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10902 }
10903 }
10904
Spandan Das64c9e0c2023-12-20 20:13:34 +000010905 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10906 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10907 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10908 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10909 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10910 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)
10911 }
10912
10913 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10914 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10915 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10916 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10917 }
10918
Spandan Das5be63332023-12-13 00:06:32 +000010919 bp := `
10920 // Source APEX.
10921
10922 java_library {
10923 name: "framework-foo",
10924 srcs: ["foo.java"],
10925 installable: true,
10926 apex_available: [
10927 "com.android.foo",
10928 ],
10929 }
10930
10931 bootclasspath_fragment {
10932 name: "foo-bootclasspath-fragment",
10933 contents: ["framework-foo"],
10934 apex_available: [
10935 "com.android.foo",
10936 ],
10937 hidden_api: {
10938 split_packages: ["*"],
10939 },
10940 }
10941
10942 apex_key {
10943 name: "com.android.foo.key",
10944 public_key: "com.android.foo.avbpubkey",
10945 private_key: "com.android.foo.pem",
10946 }
10947
10948 apex {
10949 name: "com.android.foo",
10950 key: "com.android.foo.key",
10951 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10952 updatable: false,
10953 }
10954
10955 // Prebuilt APEX.
10956
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010957 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010958 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010959 public: {
10960 jars: ["foo.jar"],
10961 },
Spandan Das5be63332023-12-13 00:06:32 +000010962 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010963 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010964 }
10965
10966 prebuilt_bootclasspath_fragment {
10967 name: "foo-bootclasspath-fragment",
10968 contents: ["framework-foo"],
10969 hidden_api: {
10970 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10971 metadata: "my-bootclasspath-fragment/metadata.csv",
10972 index: "my-bootclasspath-fragment/index.csv",
10973 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10974 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10975 },
10976 apex_available: [
10977 "com.android.foo",
10978 ],
10979 }
10980
10981 prebuilt_apex {
10982 name: "com.android.foo",
10983 apex_name: "com.android.foo",
10984 src: "com.android.foo-arm.apex",
10985 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10986 }
10987
10988 // Another Prebuilt ART APEX
10989 prebuilt_apex {
10990 name: "com.android.foo.v2",
10991 apex_name: "com.android.foo", // Used to determine the API domain
10992 src: "com.android.foo-arm.apex",
10993 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10994 }
10995
10996 // APEX contribution modules
10997
10998 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010999 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011000 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011001 contents: ["com.android.foo"],
11002 }
11003
11004 apex_contributions {
11005 name: "foo.prebuilt.contributions",
11006 api_domain: "com.android.foo",
11007 contents: ["prebuilt_com.android.foo"],
11008 }
11009
11010 apex_contributions {
11011 name: "foo.prebuilt.v2.contributions",
11012 api_domain: "com.android.foo",
11013 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011014 }
11015 `
11016
11017 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011018 desc string
11019 selectedApexContributions string
11020 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011021 }{
11022 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011023 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11024 selectedApexContributions: "foo.source.contributions",
11025 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011026 },
11027 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011028 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11029 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011030 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 +000011031 },
11032 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011033 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11034 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011035 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 +000011036 },
11037 }
11038
11039 fragment := java.ApexVariantReference{
11040 Apex: proptools.StringPtr("com.android.foo"),
11041 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11042 }
11043
11044 for _, tc := range testCases {
11045 preparer := android.GroupFixturePreparers(
11046 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11047 android.FixtureMergeMockFs(map[string][]byte{
11048 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11049 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011050 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11051 // file creation.
11052 java.FixtureConfigureBootJars("platform:foo"),
11053 android.FixtureModifyMockFS(func(fs android.MockFS) {
11054 fs["platform/Android.bp"] = []byte(`
11055 java_library {
11056 name: "foo",
11057 srcs: ["Test.java"],
11058 compile_dex: true,
11059 }
11060 `)
11061 fs["platform/Test.java"] = nil
11062 }),
11063
Colin Crossa66b4632024-08-08 15:50:47 -070011064 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011065 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011066 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011067 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011068 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11069 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011070 }
11071}
Spandan Das3576e762024-01-03 18:57:03 +000011072
11073// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11074// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11075func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011076 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011077 // for a mainline module family, check that only the flagged soong module is visible to make
11078 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11079 variation := func(moduleName string) string {
11080 ret := "android_common_com.android.foo"
11081 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011082 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011083 }
11084 return ret
11085 }
11086
11087 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11088 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11089
11090 for _, hiddenModuleName := range hiddenModuleNames {
11091 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11092 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11093
11094 }
11095 }
11096
11097 bp := `
11098 apex_key {
11099 name: "com.android.foo.key",
11100 public_key: "com.android.foo.avbpubkey",
11101 private_key: "com.android.foo.pem",
11102 }
11103
11104 // AOSP source apex
11105 apex {
11106 name: "com.android.foo",
11107 key: "com.android.foo.key",
11108 updatable: false,
11109 }
11110
11111 // Google source apex
11112 override_apex {
11113 name: "com.google.android.foo",
11114 base: "com.android.foo",
11115 key: "com.android.foo.key",
11116 }
11117
11118 // Prebuilt Google APEX.
11119
11120 prebuilt_apex {
11121 name: "com.google.android.foo",
11122 apex_name: "com.android.foo",
11123 src: "com.android.foo-arm.apex",
11124 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11125 }
11126
11127 // Another Prebuilt Google APEX
11128 prebuilt_apex {
11129 name: "com.google.android.foo.v2",
11130 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011131 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011132 src: "com.android.foo-arm.apex",
11133 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11134 }
11135
11136 // APEX contribution modules
11137
11138 apex_contributions {
11139 name: "foo.source.contributions",
11140 api_domain: "com.android.foo",
11141 contents: ["com.google.android.foo"],
11142 }
11143
11144 apex_contributions {
11145 name: "foo.prebuilt.contributions",
11146 api_domain: "com.android.foo",
11147 contents: ["prebuilt_com.google.android.foo"],
11148 }
11149
11150 apex_contributions {
11151 name: "foo.prebuilt.v2.contributions",
11152 api_domain: "com.android.foo",
11153 contents: ["prebuilt_com.google.android.foo.v2"],
11154 }
11155
11156 // This is an incompatible module because it selects multiple versions of the same mainline module
11157 apex_contributions {
11158 name: "foo.prebuilt.duplicate.contributions",
11159 api_domain: "com.android.foo",
11160 contents: [
11161 "prebuilt_com.google.android.foo",
11162 "prebuilt_com.google.android.foo.v2",
11163 ],
11164 }
11165 `
11166
11167 testCases := []struct {
11168 desc string
11169 selectedApexContributions string
11170 expectedVisibleModuleName string
11171 expectedHiddenModuleNames []string
11172 expectedError string
11173 }{
11174 {
11175 desc: "Source apex is selected, prebuilts should be hidden from make",
11176 selectedApexContributions: "foo.source.contributions",
11177 expectedVisibleModuleName: "com.google.android.foo",
11178 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11179 },
11180 {
11181 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11182 selectedApexContributions: "foo.prebuilt.contributions",
11183 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11184 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11185 },
11186 {
11187 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11188 selectedApexContributions: "foo.prebuilt.v2.contributions",
11189 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11190 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11191 },
11192 {
11193 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11194 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11195 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11196 },
11197 }
11198
11199 for _, tc := range testCases {
11200 preparer := android.GroupFixturePreparers(
11201 android.FixtureMergeMockFs(map[string][]byte{
11202 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11203 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011204 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011205 )
11206 if tc.expectedError != "" {
11207 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11208 testApex(t, bp, preparer)
11209 return
11210 }
11211 ctx := testApex(t, bp, preparer)
11212
Spandan Das3576e762024-01-03 18:57:03 +000011213 // Check that
11214 // 1. The contents of the selected apex_contributions are visible to make
11215 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11216 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11217 }
11218}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011219
Spandan Das85bd4622024-08-01 00:51:20 +000011220// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11221func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011222 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011223 // for a mainline module family, check that only the flagged soong module is visible to make
11224 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11225 variation := func(moduleName string) string {
11226 ret := "android_common_com.android.adservices"
11227 if moduleName == "com.google.android.foo" {
11228 ret = "android_common_com.google.android.foo_com.google.android.foo"
11229 }
11230 return ret
11231 }
11232
11233 for _, visibleModuleName := range visibleModuleNames {
11234 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11235 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11236 }
11237
11238 for _, hiddenModuleName := range hiddenModuleNames {
11239 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11240 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11241
11242 }
11243 }
11244
11245 bp := `
11246 apex_key {
11247 name: "com.android.adservices.key",
11248 public_key: "com.android.adservices.avbpubkey",
11249 private_key: "com.android.adservices.pem",
11250 }
11251
11252 // AOSP source apex
11253 apex {
11254 name: "com.android.adservices",
11255 key: "com.android.adservices.key",
11256 updatable: false,
11257 }
11258
11259 // Prebuilt Google APEX.
11260
11261 prebuilt_apex {
11262 name: "com.google.android.adservices",
11263 apex_name: "com.android.adservices",
11264 src: "com.android.foo-arm.apex",
11265 }
11266
11267 // Another Prebuilt Google APEX
11268 prebuilt_apex {
11269 name: "com.google.android.adservices.v2",
11270 apex_name: "com.android.adservices",
11271 src: "com.android.foo-arm.apex",
11272 }
11273
11274 // APEX contribution modules
11275
11276
11277 apex_contributions {
11278 name: "adservices.prebuilt.contributions",
11279 api_domain: "com.android.adservices",
11280 contents: ["prebuilt_com.google.android.adservices"],
11281 }
11282
11283 apex_contributions {
11284 name: "adservices.prebuilt.v2.contributions",
11285 api_domain: "com.android.adservices",
11286 contents: ["prebuilt_com.google.android.adservices.v2"],
11287 }
11288 `
11289
11290 testCases := []struct {
11291 desc string
11292 selectedApexContributions string
11293 expectedVisibleModuleNames []string
11294 expectedHiddenModuleNames []string
11295 }{
11296 {
11297 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11298 selectedApexContributions: "",
11299 expectedVisibleModuleNames: []string{"com.android.adservices"},
11300 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11301 },
11302 {
11303 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11304 selectedApexContributions: "adservices.prebuilt.contributions",
11305 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11306 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11307 },
11308 {
11309 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11310 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11311 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11312 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11313 },
11314 }
11315
11316 for _, tc := range testCases {
11317 preparer := android.GroupFixturePreparers(
11318 android.FixtureMergeMockFs(map[string][]byte{
11319 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11320 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011321 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011322 )
11323 ctx := testApex(t, bp, preparer)
11324
11325 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11326 }
11327}
11328
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011329func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011330 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011331 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11332 for _, moduleName := range moduleNames {
11333 ret += fmt.Sprintf(`
11334 aconfig_declarations {
11335 name: "%[1]s",
11336 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011337 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011338 srcs: [
11339 "%[1]s.aconfig",
11340 ],
11341 }
11342 java_aconfig_library {
11343 name: "%[1]s-lib",
11344 aconfig_declarations: "%[1]s",
11345 }
11346 `, moduleName)
11347 }
11348 return ret
11349 }
11350
11351 result := android.GroupFixturePreparers(
11352 prepareForApexTest,
11353 java.PrepareForTestWithJavaSdkLibraryFiles,
11354 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011355 ).RunTestWithBp(t, `
11356 java_library {
11357 name: "baz-java-lib",
11358 static_libs: [
11359 "baz-lib",
11360 ],
11361 }
11362 filegroup {
11363 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011364 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011365 ":qux-lib{.generated_srcjars}",
11366 ],
11367 }
11368 filegroup {
11369 name: "qux-another-filegroup",
11370 srcs: [
11371 ":qux-filegroup",
11372 ],
11373 }
11374 java_library {
11375 name: "quux-java-lib",
11376 srcs: [
11377 "a.java",
11378 ],
11379 libs: [
11380 "quux-lib",
11381 ],
11382 }
11383 java_sdk_library {
11384 name: "foo",
11385 srcs: [
11386 ":qux-another-filegroup",
11387 ],
11388 api_packages: ["foo"],
11389 system: {
11390 enabled: true,
11391 },
11392 module_lib: {
11393 enabled: true,
11394 },
11395 test: {
11396 enabled: true,
11397 },
11398 static_libs: [
11399 "bar-lib",
11400 ],
11401 libs: [
11402 "baz-java-lib",
11403 "quux-java-lib",
11404 ],
11405 aconfig_declarations: [
11406 "bar",
11407 ],
11408 }
11409 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11410
11411 m := result.ModuleForTests("foo.stubs.source", "android_common")
11412 outDir := "out/soong/.intermediates"
11413
11414 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11415 // textproto files
11416 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11417
11418 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11419 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11420 // to aconfig.
11421 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11422 "passed as an input",
11423 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11424
11425 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11426 // to metalava as classpath. Thus the cache file provided by the associated
11427 // aconfig_declarations module "baz" should be passed to aconfig.
11428 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11429 "java_aconfig_library passed as an input",
11430 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11431
11432 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11433 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11434 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11435 "input",
11436 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11437
11438 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11439 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11440 // aconfig_declarations module "quux" should not be passed to aconfig.
11441 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11442 "depend on java_aconfig_library not passed as an input",
11443 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11444}
Cole Faust7c991b42024-05-15 11:17:55 -070011445
11446func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011447 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011448 ctx := testApex(t, `
11449 apex {
11450 name: "myapex",
11451 key: "myapex.key",
11452 prebuilts: ["myetc", "myetc2"],
11453 min_sdk_version: "29",
11454 }
11455 apex_key {
11456 name: "myapex.key",
11457 public_key: "testkey.avbpubkey",
11458 private_key: "testkey.pem",
11459 }
11460
11461 prebuilt_etc {
11462 name: "myetc",
11463 src: "myprebuilt",
11464 filename: "myfilename",
11465 }
11466 prebuilt_etc {
11467 name: "myetc2",
11468 sub_dir: "mysubdir",
11469 src: "myprebuilt",
11470 filename: "myfilename",
11471 }
11472 `, withFiles(android.MockFS{
11473 "packages/modules/common/build/allowed_deps.txt": nil,
11474 }))
11475
11476 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11477 data := android.AndroidMkDataForTest(t, ctx, ab)
11478 var builder strings.Builder
11479 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11480 androidMk := builder.String()
11481
11482 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11483 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11484}
Spandan Das50801e22024-05-13 18:29:45 +000011485
11486func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011487 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011488 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11489 args := module.Rule("apexRule").Args
11490 optFlags := args["opt_flags"]
11491 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11492 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11493 }
11494 }
11495
11496 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11497 t.Helper()
11498 found := false
11499 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11500 if dep == wantDep {
11501 found = true
11502 }
11503 })
11504 if !found {
11505 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11506 }
11507 }
11508
11509 ctx := testApex(t, `
11510 apex {
11511 name: "com.android.apex30",
11512 min_sdk_version: "30",
11513 key: "apex30.key",
11514 java_libs: ["javalib"],
11515 }
11516
11517 java_library {
11518 name: "javalib",
11519 srcs: ["A.java"],
11520 apex_available: ["com.android.apex30"],
11521 min_sdk_version: "30",
11522 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011523 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011524 }
11525
11526 override_apex {
11527 name: "com.mycompany.android.apex30",
11528 base: "com.android.apex30",
11529 }
11530
11531 override_apex {
11532 name: "com.mycompany.android.apex31",
11533 base: "com.android.apex30",
11534 min_sdk_version: "31",
11535 }
11536
11537 apex_key {
11538 name: "apex30.key",
11539 public_key: "testkey.avbpubkey",
11540 private_key: "testkey.pem",
11541 }
11542
11543 `, android.FixtureMergeMockFs(android.MockFS{
11544 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11545 }),
11546 )
11547
11548 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11549 checkMinSdkVersion(t, baseModule, "30")
11550
11551 // Override module, but uses same min_sdk_version
11552 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11553 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11554 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11555 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11556
11557 // Override module, uses different min_sdk_version
11558 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11559 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11560 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11561 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11562}
Spandan Das0b28fa02024-05-28 23:40:17 +000011563
11564func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011565 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011566 context := android.GroupFixturePreparers(
11567 android.PrepareForIntegrationTestWithAndroid,
11568 PrepareForTestWithApexBuildComponents,
11569 android.FixtureMergeMockFs(android.MockFS{
11570 "system/sepolicy/apex/foo-file_contexts": nil,
11571 }),
11572 )
11573 res := context.RunTestWithBp(t, `
11574 apex {
11575 name: "foo",
11576 key: "myapex.key",
11577 apex_available_name: "com.android.foo",
11578 variant_version: "0",
11579 updatable: false,
11580 }
11581 apex_key {
11582 name: "myapex.key",
11583 public_key: "testkey.avbpubkey",
11584 private_key: "testkey.pem",
11585 }
11586 prebuilt_apex {
11587 name: "foo",
11588 src: "foo.apex",
11589 prefer: true,
11590 }
11591 override_apex {
11592 name: "myoverrideapex",
11593 base: "foo",
11594 }
11595 `)
11596
11597 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11598}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011599
11600func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011601 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011602 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`, `
11603 apex {
11604 name: "myapex",
11605 key: "myapex.key",
11606 updatable: true,
11607 min_sdk_version: "current",
11608 }
11609
11610 apex_key {
11611 name: "myapex.key",
11612 public_key: "testkey.avbpubkey",
11613 private_key: "testkey.pem",
11614 }
11615 `)
11616}
Spandan Das2f68f192024-07-22 19:25:50 +000011617
11618func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011619 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011620 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11621 result := android.GroupFixturePreparers(
11622 prepareForApexTest,
11623 android.PrepareForTestWithAndroidMk,
11624 android.PrepareForTestWithMakevars,
11625 android.FixtureMergeMockFs(fs),
11626 ).RunTest(t)
11627
11628 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011629 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011630
11631 installRules := result.InstallMakeRulesForTesting(t)
11632
11633 var installedlibRule *android.InstallMakeRule
11634 for i, rule := range installRules {
11635 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11636 if installedlibRule != nil {
11637 t.Errorf("Duplicate install rules for %s", rule.Target)
11638 }
11639 installedlibRule = &installRules[i]
11640 }
11641 }
11642 if installedlibRule == nil {
11643 t.Errorf("No install rule found for installedlib")
11644 return
11645 }
11646
11647 if expectLibfooOnSystemLib {
11648 android.AssertStringListContains(t,
11649 "installedlib doesn't have install dependency on libfoo impl",
11650 installedlibRule.OrderOnlyDeps,
11651 "out/target/product/test_device/system/lib/libfoo.so")
11652 } else {
11653 android.AssertStringListDoesNotContain(t,
11654 "installedlib has install dependency on libfoo stub",
11655 installedlibRule.Deps,
11656 "out/target/product/test_device/system/lib/libfoo.so")
11657 android.AssertStringListDoesNotContain(t,
11658 "installedlib has order-only install dependency on libfoo stub",
11659 installedlibRule.OrderOnlyDeps,
11660 "out/target/product/test_device/system/lib/libfoo.so")
11661 }
11662 }
11663
11664 prebuiltLibfooBp := []byte(`
11665 cc_prebuilt_library {
11666 name: "libfoo",
11667 prefer: true,
11668 srcs: ["libfoo.so"],
11669 stubs: {
11670 versions: ["1"],
11671 },
11672 apex_available: ["apexfoo"],
11673 }
11674 `)
11675
11676 apexfooBp := []byte(`
11677 apex {
11678 name: "apexfoo",
11679 key: "apexfoo.key",
11680 native_shared_libs: ["libfoo"],
11681 updatable: false,
11682 compile_multilib: "both",
11683 }
11684 apex_key {
11685 name: "apexfoo.key",
11686 public_key: "testkey.avbpubkey",
11687 private_key: "testkey.pem",
11688 }
11689 `)
11690
11691 installedlibBp := []byte(`
11692 cc_library {
11693 name: "installedlib",
11694 shared_libs: ["libfoo"],
11695 }
11696 `)
11697
11698 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011699 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011700 testFunc(
11701 t,
11702 /*expectLibfooOnSystemLib=*/ false,
11703 android.MockFS{
11704 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11705 "apexfoo/Android.bp": apexfooBp,
11706 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11707 "Android.bp": installedlibBp,
11708 },
11709 )
11710 })
11711
11712 disabledSourceLibfooBp := []byte(`
11713 cc_library {
11714 name: "libfoo",
11715 enabled: false,
11716 stubs: {
11717 versions: ["1"],
11718 },
11719 apex_available: ["apexfoo"],
11720 }
11721 `)
11722
11723 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011724 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011725 testFunc(
11726 t,
11727 /*expectLibfooOnSystemLib=*/ false,
11728 android.MockFS{
11729 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11730 "impl/Android.bp": disabledSourceLibfooBp,
11731 "apexfoo/Android.bp": apexfooBp,
11732 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11733 "Android.bp": installedlibBp,
11734 },
11735 )
11736 })
11737}
Jihoon Kange246bb72024-09-18 22:26:22 +000011738
11739func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011740 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011741 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11742 // in libs of android_app and java_library does not lead to class loader context device/host
11743 // path mismatch errors.
11744 android.GroupFixturePreparers(
11745 prepareForApexTest,
11746 android.PrepareForIntegrationTestWithAndroid,
11747 PrepareForTestWithApexBuildComponents,
11748 android.FixtureModifyEnv(func(env map[string]string) {
11749 env["DISABLE_CONTAINER_CHECK"] = "true"
11750 }),
11751 withFiles(filesForSdkLibrary),
11752 android.FixtureMergeMockFs(android.MockFS{
11753 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11754 }),
11755 ).RunTestWithBp(t, `
11756 apex {
11757 name: "com.android.foo30",
11758 key: "myapex.key",
11759 updatable: true,
11760 bootclasspath_fragments: [
11761 "foo-bootclasspath-fragment",
11762 ],
11763 java_libs: [
11764 "bar",
11765 ],
11766 apps: [
11767 "bar-app",
11768 ],
11769 min_sdk_version: "30",
11770 }
11771 apex_key {
11772 name: "myapex.key",
11773 public_key: "testkey.avbpubkey",
11774 private_key: "testkey.pem",
11775 }
11776 bootclasspath_fragment {
11777 name: "foo-bootclasspath-fragment",
11778 contents: [
11779 "framework-foo",
11780 ],
11781 apex_available: [
11782 "com.android.foo30",
11783 ],
11784 hidden_api: {
11785 split_packages: ["*"]
11786 },
11787 }
11788
11789 java_sdk_library {
11790 name: "framework-foo",
11791 srcs: [
11792 "A.java"
11793 ],
11794 unsafe_ignore_missing_latest_api: true,
11795 apex_available: [
11796 "com.android.foo30",
11797 ],
11798 compile_dex: true,
11799 sdk_version: "core_current",
11800 shared_library: false,
11801 }
11802
11803 java_library {
11804 name: "bar",
11805 srcs: [
11806 "A.java"
11807 ],
11808 libs: [
11809 "framework-foo.impl",
11810 ],
11811 apex_available: [
11812 "com.android.foo30",
11813 ],
11814 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011815 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011816 }
11817
11818 java_library {
11819 name: "baz",
11820 srcs: [
11821 "A.java"
11822 ],
11823 libs: [
11824 "bar",
11825 ],
11826 sdk_version: "core_current",
11827 }
11828
11829 android_app {
11830 name: "bar-app",
11831 srcs: [
11832 "A.java"
11833 ],
11834 libs: [
11835 "baz",
11836 "framework-foo.impl",
11837 ],
11838 apex_available: [
11839 "com.android.foo30",
11840 ],
11841 sdk_version: "core_current",
11842 min_sdk_version: "30",
11843 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011844 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011845 }
11846 `)
11847}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011848
11849// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11850func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011851 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011852 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11853 apex {
11854 name: "myapex",
11855 key: "myapex.key",
11856 systemserverclasspath_fragments: [
11857 "mysystemserverclasspathfragment",
11858 ],
11859 min_sdk_version: "29",
11860 updatable: true,
11861 system_ext_specific: true,
11862 }
11863
11864 apex_key {
11865 name: "myapex.key",
11866 public_key: "testkey.avbpubkey",
11867 private_key: "testkey.pem",
11868 }
11869
11870 java_library {
11871 name: "foo",
11872 srcs: ["b.java"],
11873 min_sdk_version: "29",
11874 installable: true,
11875 apex_available: [
11876 "myapex",
11877 ],
11878 sdk_version: "current",
11879 }
11880
11881 systemserverclasspath_fragment {
11882 name: "mysystemserverclasspathfragment",
11883 contents: [
11884 "foo",
11885 ],
11886 apex_available: [
11887 "myapex",
11888 ],
11889 }
11890 `,
11891 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11892 )
11893}
Spandan Das72d86c62024-10-15 19:27:41 +000011894
11895// partitions should not package the artifacts that are included inside the apex.
11896func TestFilesystemWithApexDeps(t *testing.T) {
11897 t.Parallel()
11898 result := testApex(t, `
11899 android_filesystem {
11900 name: "myfilesystem",
11901 deps: ["myapex"],
11902 }
11903 apex {
11904 name: "myapex",
11905 key: "myapex.key",
11906 binaries: ["binfoo"],
11907 native_shared_libs: ["libfoo"],
11908 apps: ["appfoo"],
11909 updatable: false,
11910 }
11911 apex_key {
11912 name: "myapex.key",
11913 }
11914 cc_binary {
11915 name: "binfoo",
11916 apex_available: ["myapex"],
11917 }
11918 cc_library {
11919 name: "libfoo",
11920 apex_available: ["myapex"],
11921 }
11922 android_app {
11923 name: "appfoo",
11924 sdk_version: "current",
11925 apex_available: ["myapex"],
11926 }
11927 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11928
11929 partition := result.ModuleForTests("myfilesystem", "android_common")
11930 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11931 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11932}
Colin Crossb614cd42024-10-11 12:52:21 -070011933
11934func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11935 t.Parallel()
11936
11937 extractDepenencyPathFromErrors := func(errs []error) []string {
11938 i := slices.IndexFunc(errs, func(err error) bool {
11939 return strings.Contains(err.Error(), "dependency path:")
11940 })
11941 if i < 0 {
11942 return nil
11943 }
11944 var dependencyPath []string
11945 for _, err := range errs[i+1:] {
11946 s := err.Error()
11947 lastSpace := strings.LastIndexByte(s, ' ')
11948 if lastSpace >= 0 {
11949 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11950 }
11951 }
11952 return dependencyPath
11953 }
11954
11955 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11956 return func(t *testing.T, result *android.TestResult) {
11957 t.Helper()
11958 if len(result.Errs) == 0 {
11959 t.Fatalf("expected errors")
11960 }
11961 t.Log("found errors:")
11962 for _, err := range result.Errs {
11963 t.Log(err)
11964 }
11965 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11966 t.Fatalf("expected error %q, got %q", w, g)
11967 }
11968 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11969 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11970 t.Errorf("expected dependency path %q, got %q", w, g)
11971 }
11972 }
11973 }
11974
11975 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11976 return func(bp *bpmodify.Blueprint) {
11977 m := bp.ModulesByName(module)
11978 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11979 if err != nil {
11980 panic(err)
11981 }
11982 props.AddStringToList(lib)
11983 }
11984 }
11985
11986 bpTemplate := `
11987 apex {
11988 name: "myapex",
11989 key: "myapex.key",
11990 native_shared_libs: ["mylib"],
11991 rust_dyn_libs: ["libmyrust"],
11992 binaries: ["mybin", "myrustbin"],
11993 jni_libs: ["libjni"],
11994 apps: ["myapp"],
11995 updatable: false,
11996 }
11997
11998 apex {
11999 name: "otherapex",
12000 key: "myapex.key",
12001 native_shared_libs: ["libotherapex"],
12002 updatable: false,
12003 }
12004
12005 apex_key {
12006 name: "myapex.key",
12007 public_key: "testkey.avbpubkey",
12008 private_key: "testkey.pem",
12009 }
12010
12011 cc_library {
12012 name: "mylib",
12013 srcs: ["foo.cpp"],
12014 apex_available: ["myapex"],
12015 }
12016
12017 cc_binary {
12018 name: "mybin",
12019 srcs: ["foo.cpp"],
12020 apex_available: ["myapex"],
12021 }
12022
12023 rust_library {
12024 name: "libmyrust",
12025 crate_name: "myrust",
12026 srcs: ["src/lib.rs"],
12027 rustlibs: ["libmyrust_transitive_dylib"],
12028 rlibs: ["libmyrust_transitive_rlib"],
12029 apex_available: ["myapex"],
12030 }
12031
12032 rust_library{
12033 name: "libmyrust_transitive_dylib",
12034 crate_name: "myrust_transitive_dylib",
12035 srcs: ["src/lib.rs"],
12036 apex_available: ["myapex"],
12037 }
12038
12039 rust_library {
12040 name: "libmyrust_transitive_rlib",
12041 crate_name: "myrust_transitive_rlib",
12042 srcs: ["src/lib.rs"],
12043 apex_available: ["myapex"],
12044 }
12045
12046 rust_binary {
12047 name: "myrustbin",
12048 srcs: ["src/main.rs"],
12049 apex_available: ["myapex"],
12050 }
12051
12052 cc_library {
12053 name: "libbar",
12054 sdk_version: "current",
12055 srcs: ["bar.cpp"],
12056 apex_available: ["myapex"],
12057 stl: "none",
12058 }
12059
12060 android_app {
12061 name: "myapp",
12062 jni_libs: ["libembeddedjni"],
12063 use_embedded_native_libs: true,
12064 sdk_version: "current",
12065 apex_available: ["myapex"],
12066 }
12067
12068 cc_library {
12069 name: "libembeddedjni",
12070 sdk_version: "current",
12071 srcs: ["bar.cpp"],
12072 apex_available: ["myapex"],
12073 stl: "none",
12074 }
12075
12076 cc_library {
12077 name: "libjni",
12078 sdk_version: "current",
12079 srcs: ["bar.cpp"],
12080 apex_available: ["myapex"],
12081 stl: "none",
12082 }
12083
12084 cc_library {
12085 name: "libotherapex",
12086 sdk_version: "current",
12087 srcs: ["otherapex.cpp"],
12088 apex_available: ["otherapex"],
12089 stubs: {
12090 symbol_file: "libotherapex.map.txt",
12091 versions: ["1", "2", "3"],
12092 },
12093 stl: "none",
12094 }
12095
12096 cc_library {
12097 name: "libplatform",
12098 sdk_version: "current",
12099 srcs: ["libplatform.cpp"],
12100 stubs: {
12101 symbol_file: "libplatform.map.txt",
12102 versions: ["1", "2", "3"],
12103 },
12104 stl: "none",
12105 system_shared_libs: [],
12106 }
12107 `
12108
12109 testCases := []struct {
12110 name string
12111 bpModifier func(bp *bpmodify.Blueprint)
12112 dependencyPath []string
12113 }{
12114 {
12115 name: "library dependency in other apex",
12116 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12117 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12118 },
12119 {
12120 name: "transitive library dependency in other apex",
12121 bpModifier: func(bp *bpmodify.Blueprint) {
12122 addToSharedLibs("mylib", "libbar")(bp)
12123 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12124 },
12125 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12126 },
12127 {
12128 name: "library dependency in platform",
12129 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12130 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12131 },
12132 {
12133 name: "jni library dependency in other apex",
12134 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12135 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12136 },
12137 {
12138 name: "transitive jni library dependency in other apex",
12139 bpModifier: func(bp *bpmodify.Blueprint) {
12140 addToSharedLibs("libjni", "libbar")(bp)
12141 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12142 },
12143 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12144 },
12145 {
12146 name: "jni library dependency in platform",
12147 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12148 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12149 },
12150 {
12151 name: "transitive jni library dependency in platform",
12152 bpModifier: func(bp *bpmodify.Blueprint) {
12153 addToSharedLibs("libjni", "libbar")(bp)
12154 addToSharedLibs("libbar", "libplatform#impl")(bp)
12155 },
12156 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12157 },
Spandan Das10c41362024-12-03 01:33:09 +000012158 {
12159 name: "app jni library dependency in other apex",
12160 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12161 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12162 },
12163 {
12164 name: "transitive app jni library dependency in other apex",
12165 bpModifier: func(bp *bpmodify.Blueprint) {
12166 addToSharedLibs("libembeddedjni", "libbar")(bp)
12167 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12168 },
12169 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12170 },
12171 {
12172 name: "app jni library dependency in platform",
12173 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12174 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12175 },
12176 {
12177 name: "transitive app jni library dependency in platform",
12178 bpModifier: func(bp *bpmodify.Blueprint) {
12179 addToSharedLibs("libembeddedjni", "libbar")(bp)
12180 addToSharedLibs("libbar", "libplatform#impl")(bp)
12181 },
12182 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12183 },
Colin Crossb614cd42024-10-11 12:52:21 -070012184 {
12185 name: "binary dependency in other apex",
12186 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12187 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12188 },
12189 {
12190 name: "transitive binary dependency in other apex",
12191 bpModifier: func(bp *bpmodify.Blueprint) {
12192 addToSharedLibs("mybin", "libbar")(bp)
12193 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12194 },
12195 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12196 },
12197 {
12198 name: "binary dependency in platform",
12199 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12200 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12201 },
12202 {
12203 name: "transitive binary dependency in platform",
12204 bpModifier: func(bp *bpmodify.Blueprint) {
12205 addToSharedLibs("mybin", "libbar")(bp)
12206 addToSharedLibs("libbar", "libplatform#impl")(bp)
12207 },
12208 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12209 },
12210
12211 {
12212 name: "rust library dependency in other apex",
12213 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12214 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12215 },
12216 {
12217 name: "transitive rust library dependency in other apex",
12218 bpModifier: func(bp *bpmodify.Blueprint) {
12219 addToSharedLibs("libmyrust", "libbar")(bp)
12220 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12221 },
12222 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12223 },
12224 {
12225 name: "rust library dependency in platform",
12226 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12227 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12228 },
12229 {
12230 name: "transitive rust library dependency in platform",
12231 bpModifier: func(bp *bpmodify.Blueprint) {
12232 addToSharedLibs("libmyrust", "libbar")(bp)
12233 addToSharedLibs("libbar", "libplatform#impl")(bp)
12234 },
12235 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12236 },
12237 {
12238 name: "transitive rust library dylib dependency in other apex",
12239 bpModifier: func(bp *bpmodify.Blueprint) {
12240 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12241 },
12242 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12243 },
12244 {
12245 name: "transitive rust library dylib dependency in platform",
12246 bpModifier: func(bp *bpmodify.Blueprint) {
12247 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12248 },
12249 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12250 },
12251 {
12252 name: "transitive rust library rlib dependency in other apex",
12253 bpModifier: func(bp *bpmodify.Blueprint) {
12254 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12255 },
12256 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12257 },
12258 {
12259 name: "transitive rust library rlib dependency in platform",
12260 bpModifier: func(bp *bpmodify.Blueprint) {
12261 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12262 },
12263 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12264 },
12265 {
12266 name: "rust binary dependency in other apex",
12267 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12268 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12269 },
12270 {
12271 name: "transitive rust binary dependency in other apex",
12272 bpModifier: func(bp *bpmodify.Blueprint) {
12273 addToSharedLibs("myrustbin", "libbar")(bp)
12274 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12275 },
12276 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12277 },
12278 {
12279 name: "rust binary dependency in platform",
12280 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12281 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12282 },
12283 {
12284 name: "transitive rust binary dependency in platform",
12285 bpModifier: func(bp *bpmodify.Blueprint) {
12286 addToSharedLibs("myrustbin", "libbar")(bp)
12287 addToSharedLibs("libbar", "libplatform#impl")(bp)
12288 },
12289 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12290 },
12291 }
12292
12293 for _, testCase := range testCases {
12294 t.Run(testCase.name, func(t *testing.T) {
12295 t.Parallel()
12296 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12297 if err != nil {
12298 t.Fatal(err)
12299 }
12300 if testCase.bpModifier != nil {
12301 func() {
12302 defer func() {
12303 if r := recover(); r != nil {
12304 t.Fatalf("panic in bpModifier: %v", r)
12305 }
12306 }()
12307 testCase.bpModifier(bp)
12308 }()
12309 }
12310 android.GroupFixturePreparers(
12311 android.PrepareForTestWithAndroidBuildComponents,
12312 cc.PrepareForTestWithCcBuildComponents,
12313 java.PrepareForTestWithDexpreopt,
12314 rust.PrepareForTestWithRustDefaultModules,
12315 PrepareForTestWithApexBuildComponents,
12316 prepareForTestWithMyapex,
12317 prepareForTestWithOtherapex,
12318 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12319 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12320 }),
12321 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12322 RunTestWithBp(t, bp.String())
12323 })
12324 }
12325}