blob: 65a4ec71b3e05ccabf7812b13a9b640f7f8d3b89 [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"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
221 variables.DeviceVndkVersion = proptools.StringPtr("current")
222 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
223 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
224 variables.Platform_sdk_codename = proptools.StringPtr("Q")
225 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000226 // "Tiramisu" needs to be in the next line for compatibility with soong code,
227 // not because of these tests specifically (it's not used by the tests)
228 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900229 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000230 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000231 }),
232)
233
Paul Duffin52bfaa42021-03-23 23:40:12 +0000234var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
235 "system/sepolicy/apex/myapex-file_contexts": nil,
236})
237
Jooyung Han643adc42020-02-27 13:50:06 +0900238// ensure that 'result' equals 'expected'
239func ensureEquals(t *testing.T, result string, expected string) {
240 t.Helper()
241 if result != expected {
242 t.Errorf("%q != %q", expected, result)
243 }
244}
245
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246// ensure that 'result' contains 'expected'
247func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900248 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if !strings.Contains(result, expected) {
250 t.Errorf("%q is not found in %q", expected, result)
251 }
252}
253
Liz Kammer5bd365f2020-05-27 15:15:11 -0700254// ensure that 'result' contains 'expected' exactly one time
255func ensureContainsOnce(t *testing.T, result string, expected string) {
256 t.Helper()
257 count := strings.Count(result, expected)
258 if count != 1 {
259 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
260 }
261}
262
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263// ensures that 'result' does not contain 'notExpected'
264func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900265 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266 if strings.Contains(result, notExpected) {
267 t.Errorf("%q is found in %q", notExpected, result)
268 }
269}
270
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271func ensureMatches(t *testing.T, result string, expectedRex string) {
272 ok, err := regexp.MatchString(expectedRex, result)
273 if err != nil {
274 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
275 return
276 }
277 if !ok {
278 t.Errorf("%s does not match regular expession %s", result, expectedRex)
279 }
280}
281
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900283 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284 if !android.InList(expected, result) {
285 t.Errorf("%q is not found in %v", expected, result)
286 }
287}
288
289func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if android.InList(notExpected, result) {
292 t.Errorf("%q is found in %v", notExpected, result)
293 }
294}
295
Jooyung Hane1633032019-08-01 17:41:43 +0900296func ensureListEmpty(t *testing.T, result []string) {
297 t.Helper()
298 if len(result) > 0 {
299 t.Errorf("%q is expected to be empty", result)
300 }
301}
302
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000303func ensureListNotEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) == 0 {
306 t.Errorf("%q is expected to be not empty", result)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310// Minimal test
311func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800312 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900313 apex_defaults {
314 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900315 manifest: ":myapex.manifest",
316 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900318 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900319 native_shared_libs: [
320 "mylib",
321 "libfoo.ffi",
322 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900323 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800324 multilib: {
325 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900326 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800327 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900328 },
Jiyong Park77acec62020-06-01 21:39:15 +0900329 java_libs: [
330 "myjar",
331 "myjar_dex",
332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000333 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 shared_libs: [
361 "mylib2",
362 "libbar.ffi",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 system_shared_libs: [],
365 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000366 // TODO: remove //apex_available:platform
367 apex_available: [
368 "//apex_available:platform",
369 "myapex",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 }
372
Alex Light3d673592019-01-18 14:37:31 -0800373 cc_binary {
374 name: "foo",
375 srcs: ["mylib.cpp"],
376 compile_multilib: "both",
377 multilib: {
378 lib32: {
379 suffix: "32",
380 },
381 lib64: {
382 suffix: "64",
383 },
384 },
385 symlinks: ["foo_link_"],
386 symlink_preferred_arch: true,
387 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800388 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700389 apex_available: [ "myapex", "com.android.gki.*" ],
390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400396 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900405 shared_libs: ["libfoo.shared_from_rust"],
406 }
407
408 cc_library_shared {
409 name: "libfoo.shared_from_rust",
410 srcs: ["mylib.cpp"],
411 system_shared_libs: [],
412 stl: "none",
413 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900414 }
415
416 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000417 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900423 rust_ffi_shared {
424 name: "libfoo.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
430 rust_ffi_shared {
431 name: "libbar.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "bar",
434 apex_available: ["myapex"],
435 }
436
Yifan Hongd22a84a2020-07-28 17:37:46 -0700437 apex {
438 name: "com.android.gki.fake",
439 binaries: ["foo"],
440 key: "myapex.key",
441 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000442 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800443 }
444
Paul Duffindddd5462020-04-07 15:25:44 +0100445 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900446 name: "mylib2",
447 srcs: ["mylib.cpp"],
448 system_shared_libs: [],
449 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900450 static_libs: ["libstatic"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Paul Duffindddd5462020-04-07 15:25:44 +0100458 cc_prebuilt_library_shared {
459 name: "mylib2",
460 srcs: ["prebuilt.so"],
461 // TODO: remove //apex_available:platform
462 apex_available: [
463 "//apex_available:platform",
464 "myapex",
465 ],
466 }
467
Jiyong Park9918e1a2020-03-17 19:16:40 +0900468 cc_library_static {
469 name: "libstatic",
470 srcs: ["mylib.cpp"],
471 system_shared_libs: [],
472 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479
480 java_library {
481 name: "myjar",
482 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900483 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 sdk_version: "none",
485 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900487 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900493 }
494
Jiyong Park77acec62020-06-01 21:39:15 +0900495 dex_import {
496 name: "myjar_dex",
497 jars: ["prebuilt.jar"],
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
502 }
503
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 java_library {
505 name: "myotherjar",
506 srcs: ["foo/bar/MyClass.java"],
507 sdk_version: "none",
508 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900509 // TODO: remove //apex_available:platform
510 apex_available: [
511 "//apex_available:platform",
512 "myapex",
513 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900515
516 java_library {
517 name: "mysharedjar",
518 srcs: ["foo/bar/MyClass.java"],
519 sdk_version: "none",
520 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900521 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900522 `)
523
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900525
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900527 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700528 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900529 var builder strings.Builder
530 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
531
532 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000533 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
535
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536 optFlags := apexRule.Args["opt_flags"]
537 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700538 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900539 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900540
Jiyong Park25fc6a92018-11-18 18:02:45 +0900541 copyCmds := apexRule.Args["copy_commands"]
542
543 // Ensure that main rule creates an output
544 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
545
546 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700554 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560
561 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900565 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
568 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900569 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 // .. but not for java libs
571 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800573
Colin Cross7113d202019-11-20 16:39:12 -0800574 // Ensure that the platform variant ends with _shared or _common
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
576 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
578 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
580
581 // Ensure that dynamic dependency to java libs are not included
582 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800583
584 // Ensure that all symlinks are present.
585 found_foo_link_64 := false
586 found_foo := false
587 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900588 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800589 if strings.HasSuffix(cmd, "bin/foo") {
590 found_foo = true
591 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
592 found_foo_link_64 = true
593 }
594 }
595 }
596 good := found_foo && found_foo_link_64
597 if !good {
598 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
599 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900600
Colin Crossf61d03d2023-11-02 16:56:39 -0700601 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
602 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
605 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
606 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800626 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800680 name: "netdTest",
681 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900686 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000690 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800694 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
Jooyung Hana0503a52023-08-23 13:12:50 +0900713 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Jihoon Kang842b9992024-02-08 01:41:51 +0000793func TestApexWithDessertSha(t *testing.T) {
794 ctx := testApex(t, `
795 apex_defaults {
796 name: "my_defaults",
797 key: "myapex.key",
798 product_specific: true,
799 file_contexts: ":my-file-contexts",
800 updatable: false,
801 }
802 apex {
803 name: "myapex_30",
804 min_sdk_version: "30",
805 defaults: ["my_defaults"],
806 }
807
808 apex {
809 name: "myapex_current",
810 min_sdk_version: "current",
811 defaults: ["my_defaults"],
812 }
813
814 apex {
815 name: "myapex_none",
816 defaults: ["my_defaults"],
817 }
818
819 apex_key {
820 name: "myapex.key",
821 public_key: "testkey.avbpubkey",
822 private_key: "testkey.pem",
823 }
824
825 filegroup {
826 name: "my-file-contexts",
827 srcs: ["product_specific_file_contexts"],
828 }
829 `, withFiles(map[string][]byte{
830 "product_specific_file_contexts": nil,
831 }), android.FixtureModifyProductVariables(
832 func(variables android.FixtureProductVariables) {
833 variables.Unbundled_build = proptools.BoolPtr(true)
834 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
835 }), android.FixtureMergeEnv(map[string]string{
836 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
837 }))
838
839 testCases := []struct {
840 module string
841 minSdkVersion string
842 }{
843 {
844 module: "myapex_30",
845 minSdkVersion: "30",
846 },
847 {
848 module: "myapex_current",
849 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 },
851 {
852 module: "myapex_none",
853 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
854 },
855 }
856 for _, tc := range testCases {
857 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
858 args := module.Rule("apexRule").Args
859 optFlags := args["opt_flags"]
860 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
861 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
862 }
863 }
864}
865
Jooyung Hanaf730952023-02-28 14:13:38 +0900866func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900867 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900868 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900869 if vendor {
870 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 }
872 ctx := testApex(t, `
873 apex {
874 name: "myapex",
875 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900876 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900877 `+prop+`
878 }
879
880 apex_key {
881 name: "myapex.key",
882 public_key: "testkey.avbpubkey",
883 private_key: "testkey.pem",
884 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900885 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900886
Jooyung Hana0503a52023-08-23 13:12:50 +0900887 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900888 if vendor {
889 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
890 rule.RuleParams.Command,
891 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900892 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900893 android.AssertStringDoesContain(t, "should force-label as system_file",
894 rule.RuleParams.Command,
895 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900896 }
897 }
898}
899
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800901 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902 apex {
903 name: "myapex",
904 key: "myapex.key",
905 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900906 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000907 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 shared_libs: ["mylib2", "mylib3"],
920 system_shared_libs: [],
921 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000922 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 }
924
925 cc_library {
926 name: "mylib2",
927 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900928 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 system_shared_libs: [],
930 stl: "none",
931 stubs: {
932 versions: ["1", "2", "3"],
933 },
934 }
935
936 cc_library {
937 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900938 srcs: ["mylib.cpp"],
939 shared_libs: ["mylib4"],
940 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 stl: "none",
942 stubs: {
943 versions: ["10", "11", "12"],
944 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000945 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900946 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900947
948 cc_library {
949 name: "mylib4",
950 srcs: ["mylib.cpp"],
951 system_shared_libs: [],
952 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000953 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 }
Jiyong Park105dc322021-06-11 17:22:09 +0900955
956 rust_binary {
957 name: "foo.rust",
958 srcs: ["foo.rs"],
959 shared_libs: ["libfoo.shared_from_rust"],
960 prefer_rlib: true,
961 apex_available: ["myapex"],
962 }
963
964 cc_library_shared {
965 name: "libfoo.shared_from_rust",
966 srcs: ["mylib.cpp"],
967 system_shared_libs: [],
968 stl: "none",
969 stubs: {
970 versions: ["10", "11", "12"],
971 },
972 }
973
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974 `)
975
Jooyung Hana0503a52023-08-23 13:12:50 +0900976 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977 copyCmds := apexRule.Args["copy_commands"]
978
979 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800980 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900981
982 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800983 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984
985 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800986 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987
Colin Crossaede88c2020-08-11 12:17:01 -0700988 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989
990 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900991 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900993 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900994
995 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700996 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900997 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700998 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900999
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001000 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1001 // is replaced by sharing of "cFlags" in cc/builder.go.
1002 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1003 // module variable representing "cflags". So it was not detected by ensureNotContains.
1004 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1005 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1006 // including the original cflags's "-include mylib.h".
1007 //
Jiyong Park64379952018-12-13 18:37:29 +09001008 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001009 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1010 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001011
Jiyong Park85cc35a2022-07-17 11:30:47 +09001012 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1013 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1014 // Ensure that genstub for apex-provided lib is invoked with --apex
1015 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001016
Jooyung Hana0503a52023-08-23 13:12:50 +09001017 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001018 "lib64/mylib.so",
1019 "lib64/mylib3.so",
1020 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001021 "bin/foo.rust",
1022 "lib64/libc++.so", // by the implicit dependency from foo.rust
1023 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001024 })
Jiyong Park105dc322021-06-11 17:22:09 +09001025
1026 // Ensure that stub dependency from a rust module is not included
1027 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1028 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001029 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001030 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1031 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001032
Jooyung Hana0503a52023-08-23 13:12:50 +09001033 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001034 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001035}
1036
Jooyung Han20348752023-12-05 15:23:56 +09001037func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1038 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1039 apex {
1040 name: "myapex",
1041 key: "myapex.key",
1042 vendor: true,
1043 updatable: false,
1044 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1045 }
1046
1047 apex_key {
1048 name: "myapex.key",
1049 public_key: "testkey.avbpubkey",
1050 private_key: "testkey.pem",
1051 }
1052
1053 cc_library {
1054 name: "libbar",
1055 srcs: ["mylib.cpp"],
1056 llndk: {
1057 symbol_file: "libbar.map.txt",
1058 }
1059 }
1060 `)
1061}
1062
Jiyong Park1bc84122021-06-22 20:23:05 +09001063func TestApexCanUsePrivateApis(t *testing.T) {
1064 ctx := testApex(t, `
1065 apex {
1066 name: "myapex",
1067 key: "myapex.key",
1068 native_shared_libs: ["mylib"],
1069 binaries: ["foo.rust"],
1070 updatable: false,
1071 platform_apis: true,
1072 }
1073
1074 apex_key {
1075 name: "myapex.key",
1076 public_key: "testkey.avbpubkey",
1077 private_key: "testkey.pem",
1078 }
1079
1080 cc_library {
1081 name: "mylib",
1082 srcs: ["mylib.cpp"],
1083 shared_libs: ["mylib2"],
1084 system_shared_libs: [],
1085 stl: "none",
1086 apex_available: [ "myapex" ],
1087 }
1088
1089 cc_library {
1090 name: "mylib2",
1091 srcs: ["mylib.cpp"],
1092 cflags: ["-include mylib.h"],
1093 system_shared_libs: [],
1094 stl: "none",
1095 stubs: {
1096 versions: ["1", "2", "3"],
1097 },
1098 }
1099
1100 rust_binary {
1101 name: "foo.rust",
1102 srcs: ["foo.rs"],
1103 shared_libs: ["libfoo.shared_from_rust"],
1104 prefer_rlib: true,
1105 apex_available: ["myapex"],
1106 }
1107
1108 cc_library_shared {
1109 name: "libfoo.shared_from_rust",
1110 srcs: ["mylib.cpp"],
1111 system_shared_libs: [],
1112 stl: "none",
1113 stubs: {
1114 versions: ["10", "11", "12"],
1115 },
1116 }
1117 `)
1118
Jooyung Hana0503a52023-08-23 13:12:50 +09001119 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001120 copyCmds := apexRule.Args["copy_commands"]
1121
1122 // Ensure that indirect stubs dep is not included
1123 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1124 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1125
1126 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1127 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001128 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001129 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1130 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001131 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001132 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1133 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1134}
1135
Colin Cross7812fd32020-09-25 12:35:10 -07001136func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1137 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001138 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001139 apex {
1140 name: "myapex",
1141 key: "myapex.key",
1142 native_shared_libs: ["mylib", "mylib3"],
1143 min_sdk_version: "29",
1144 }
1145
1146 apex_key {
1147 name: "myapex.key",
1148 public_key: "testkey.avbpubkey",
1149 private_key: "testkey.pem",
1150 }
1151
1152 cc_library {
1153 name: "mylib",
1154 srcs: ["mylib.cpp"],
1155 shared_libs: ["mylib2", "mylib3"],
1156 system_shared_libs: [],
1157 stl: "none",
1158 apex_available: [ "myapex" ],
1159 min_sdk_version: "28",
1160 }
1161
1162 cc_library {
1163 name: "mylib2",
1164 srcs: ["mylib.cpp"],
1165 cflags: ["-include mylib.h"],
1166 system_shared_libs: [],
1167 stl: "none",
1168 stubs: {
1169 versions: ["28", "29", "30", "current"],
1170 },
1171 min_sdk_version: "28",
1172 }
1173
1174 cc_library {
1175 name: "mylib3",
1176 srcs: ["mylib.cpp"],
1177 shared_libs: ["mylib4"],
1178 system_shared_libs: [],
1179 stl: "none",
1180 stubs: {
1181 versions: ["28", "29", "30", "current"],
1182 },
1183 apex_available: [ "myapex" ],
1184 min_sdk_version: "28",
1185 }
1186
1187 cc_library {
1188 name: "mylib4",
1189 srcs: ["mylib.cpp"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 apex_available: [ "myapex" ],
1193 min_sdk_version: "28",
1194 }
1195 `)
1196
Jooyung Hana0503a52023-08-23 13:12:50 +09001197 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001198 copyCmds := apexRule.Args["copy_commands"]
1199
1200 // Ensure that direct non-stubs dep is always included
1201 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1202
1203 // Ensure that indirect stubs dep is not included
1204 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1205
1206 // Ensure that direct stubs dep is included
1207 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1208
1209 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib is linking with the latest version of stub for mylib2
1212 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001213 // ... and not linking to the non-stub (impl) variant of mylib2
1214 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1215
1216 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1217 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1218 // .. and not linking to the stubs variant of mylib3
1219 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1220
1221 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001222 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001223 ensureNotContains(t, mylib2Cflags, "-include ")
1224
Jiyong Park85cc35a2022-07-17 11:30:47 +09001225 // Ensure that genstub is invoked with --systemapi
1226 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001227
Jooyung Hana0503a52023-08-23 13:12:50 +09001228 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001229 "lib64/mylib.so",
1230 "lib64/mylib3.so",
1231 "lib64/mylib4.so",
1232 })
1233}
1234
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001235func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1236 t.Parallel()
1237 // myapex (Z)
1238 // mylib -----------------.
1239 // |
1240 // otherapex (29) |
1241 // libstub's versions: 29 Z current
1242 // |
1243 // <platform> |
1244 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001245 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246 apex {
1247 name: "myapex",
1248 key: "myapex.key",
1249 native_shared_libs: ["mylib"],
1250 min_sdk_version: "Z", // non-final
1251 }
1252
1253 cc_library {
1254 name: "mylib",
1255 srcs: ["mylib.cpp"],
1256 shared_libs: ["libstub"],
1257 apex_available: ["myapex"],
1258 min_sdk_version: "Z",
1259 }
1260
1261 apex_key {
1262 name: "myapex.key",
1263 public_key: "testkey.avbpubkey",
1264 private_key: "testkey.pem",
1265 }
1266
1267 apex {
1268 name: "otherapex",
1269 key: "myapex.key",
1270 native_shared_libs: ["libstub"],
1271 min_sdk_version: "29",
1272 }
1273
1274 cc_library {
1275 name: "libstub",
1276 srcs: ["mylib.cpp"],
1277 stubs: {
1278 versions: ["29", "Z", "current"],
1279 },
1280 apex_available: ["otherapex"],
1281 min_sdk_version: "29",
1282 }
1283
1284 // platform module depending on libstub from otherapex should use the latest stub("current")
1285 cc_library {
1286 name: "libplatform",
1287 srcs: ["mylib.cpp"],
1288 shared_libs: ["libstub"],
1289 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001290 `,
1291 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1292 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1293 variables.Platform_sdk_final = proptools.BoolPtr(false)
1294 variables.Platform_version_active_codenames = []string{"Z"}
1295 }),
1296 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297
Jiyong Park55549df2021-02-26 23:57:23 +09001298 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001300 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001301 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001302 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001303
1304 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1305 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1306 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1307 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1308 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1309}
1310
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001312 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001313 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 name: "myapex2",
1315 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001317 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001318 }
1319
1320 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001321 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001322 public_key: "testkey.avbpubkey",
1323 private_key: "testkey.pem",
1324 }
1325
1326 cc_library {
1327 name: "mylib",
1328 srcs: ["mylib.cpp"],
1329 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001330 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331 system_shared_libs: [],
1332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001333 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334 }
1335
1336 cc_library {
1337 name: "libfoo",
1338 srcs: ["mylib.cpp"],
1339 shared_libs: ["libbar"],
1340 system_shared_libs: [],
1341 stl: "none",
1342 stubs: {
1343 versions: ["10", "20", "30"],
1344 },
1345 }
1346
1347 cc_library {
1348 name: "libbar",
1349 srcs: ["mylib.cpp"],
1350 system_shared_libs: [],
1351 stl: "none",
1352 }
1353
Jiyong Park678c8812020-02-07 17:25:49 +09001354 cc_library_static {
1355 name: "libbaz",
1356 srcs: ["mylib.cpp"],
1357 system_shared_libs: [],
1358 stl: "none",
1359 apex_available: [ "myapex2" ],
1360 }
1361
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001362 `)
1363
Jooyung Hana0503a52023-08-23 13:12:50 +09001364 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 copyCmds := apexRule.Args["copy_commands"]
1366
1367 // Ensure that direct non-stubs dep is always included
1368 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1369
1370 // Ensure that indirect stubs dep is not included
1371 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1372
1373 // Ensure that dependency of stubs is not included
1374 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1375
Colin Crossaede88c2020-08-11 12:17:01 -07001376 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001377
1378 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001379 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001380 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001381 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001382
Jiyong Park3ff16992019-12-27 14:11:47 +09001383 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001384
1385 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1386 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001387
Colin Crossf61d03d2023-11-02 16:56:39 -07001388 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1389 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001390 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001391
Colin Crossf61d03d2023-11-02 16:56:39 -07001392 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1393 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001394 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001395}
1396
Jooyung Hand3639552019-08-09 12:57:43 +09001397func TestApexWithRuntimeLibsDependency(t *testing.T) {
1398 /*
1399 myapex
1400 |
1401 v (runtime_libs)
1402 mylib ------+------> libfoo [provides stub]
1403 |
1404 `------> libbar
1405 */
Colin Cross1c460562021-02-16 17:55:47 -08001406 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001407 apex {
1408 name: "myapex",
1409 key: "myapex.key",
1410 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001411 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001412 }
1413
1414 apex_key {
1415 name: "myapex.key",
1416 public_key: "testkey.avbpubkey",
1417 private_key: "testkey.pem",
1418 }
1419
1420 cc_library {
1421 name: "mylib",
1422 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001423 static_libs: ["libstatic"],
1424 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001425 runtime_libs: ["libfoo", "libbar"],
1426 system_shared_libs: [],
1427 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001428 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001429 }
1430
1431 cc_library {
1432 name: "libfoo",
1433 srcs: ["mylib.cpp"],
1434 system_shared_libs: [],
1435 stl: "none",
1436 stubs: {
1437 versions: ["10", "20", "30"],
1438 },
1439 }
1440
1441 cc_library {
1442 name: "libbar",
1443 srcs: ["mylib.cpp"],
1444 system_shared_libs: [],
1445 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001446 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
Liz Kammer5f108fa2023-05-11 14:33:17 -04001449 cc_library {
1450 name: "libstatic",
1451 srcs: ["mylib.cpp"],
1452 system_shared_libs: [],
1453 stl: "none",
1454 apex_available: [ "myapex" ],
1455 runtime_libs: ["libstatic_to_runtime"],
1456 }
1457
1458 cc_library {
1459 name: "libshared",
1460 srcs: ["mylib.cpp"],
1461 system_shared_libs: [],
1462 stl: "none",
1463 apex_available: [ "myapex" ],
1464 runtime_libs: ["libshared_to_runtime"],
1465 }
1466
1467 cc_library {
1468 name: "libstatic_to_runtime",
1469 srcs: ["mylib.cpp"],
1470 system_shared_libs: [],
1471 stl: "none",
1472 apex_available: [ "myapex" ],
1473 }
1474
1475 cc_library {
1476 name: "libshared_to_runtime",
1477 srcs: ["mylib.cpp"],
1478 system_shared_libs: [],
1479 stl: "none",
1480 apex_available: [ "myapex" ],
1481 }
Jooyung Hand3639552019-08-09 12:57:43 +09001482 `)
1483
Jooyung Hana0503a52023-08-23 13:12:50 +09001484 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001485 copyCmds := apexRule.Args["copy_commands"]
1486
1487 // Ensure that direct non-stubs dep is always included
1488 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1489
1490 // Ensure that indirect stubs dep is not included
1491 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1492
1493 // Ensure that runtime_libs dep in included
1494 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001495 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1496 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1497
1498 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001499
Jooyung Hana0503a52023-08-23 13:12:50 +09001500 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001501 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1502 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001503}
1504
Paul Duffina02cae32021-03-09 01:44:06 +00001505var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1506 cc.PrepareForTestWithCcBuildComponents,
1507 PrepareForTestWithApexBuildComponents,
1508 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509 apex {
1510 name: "com.android.runtime",
1511 key: "com.android.runtime.key",
1512 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001513 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514 }
1515
1516 apex_key {
1517 name: "com.android.runtime.key",
1518 public_key: "testkey.avbpubkey",
1519 private_key: "testkey.pem",
1520 }
Paul Duffina02cae32021-03-09 01:44:06 +00001521 `),
1522 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1523)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001524
Paul Duffina02cae32021-03-09 01:44:06 +00001525func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001526 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001527 cc_library {
1528 name: "libc",
1529 no_libcrt: true,
1530 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001531 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001532 stl: "none",
1533 system_shared_libs: [],
1534 stubs: { versions: ["1"] },
1535 apex_available: ["com.android.runtime"],
1536
1537 sanitize: {
1538 hwaddress: true,
1539 }
1540 }
1541
1542 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001543 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 no_libcrt: true,
1545 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001546 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547 stl: "none",
1548 system_shared_libs: [],
1549 srcs: [""],
1550 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001551 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552
1553 sanitize: {
1554 never: true,
1555 },
Spandan Das4de7b492023-05-05 21:13:01 +00001556 apex_available: [
1557 "//apex_available:anyapex",
1558 "//apex_available:platform",
1559 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001560 } `)
1561 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562
Jooyung Hana0503a52023-08-23 13:12:50 +09001563 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001564 "lib64/bionic/libc.so",
1565 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1566 })
1567
Colin Cross4c4c1be2022-02-10 11:41:18 -08001568 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569
1570 installed := hwasan.Description("install libclang_rt.hwasan")
1571 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1572
1573 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1574 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1575 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1576}
1577
1578func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001579 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001580 prepareForTestOfRuntimeApexWithHwasan,
1581 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1582 variables.SanitizeDevice = []string{"hwaddress"}
1583 }),
1584 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001585 cc_library {
1586 name: "libc",
1587 no_libcrt: true,
1588 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001589 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001590 stl: "none",
1591 system_shared_libs: [],
1592 stubs: { versions: ["1"] },
1593 apex_available: ["com.android.runtime"],
1594 }
1595
1596 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001597 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598 no_libcrt: true,
1599 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001600 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001601 stl: "none",
1602 system_shared_libs: [],
1603 srcs: [""],
1604 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001605 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001606
1607 sanitize: {
1608 never: true,
1609 },
Spandan Das4de7b492023-05-05 21:13:01 +00001610 apex_available: [
1611 "//apex_available:anyapex",
1612 "//apex_available:platform",
1613 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001614 }
Paul Duffina02cae32021-03-09 01:44:06 +00001615 `)
1616 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001617
Jooyung Hana0503a52023-08-23 13:12:50 +09001618 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001619 "lib64/bionic/libc.so",
1620 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1621 })
1622
Colin Cross4c4c1be2022-02-10 11:41:18 -08001623 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001624
1625 installed := hwasan.Description("install libclang_rt.hwasan")
1626 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1627
1628 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1629 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1630 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1631}
1632
Jooyung Han61b66e92020-03-21 14:21:46 +00001633func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1634 testcases := []struct {
1635 name string
1636 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001637 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001638 shouldLink string
1639 shouldNotLink []string
1640 }{
1641 {
Jiyong Park55549df2021-02-26 23:57:23 +09001642 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001643 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001644 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 shouldLink: "current",
1646 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 },
1648 {
Jiyong Park55549df2021-02-26 23:57:23 +09001649 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001650 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001651 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001652 shouldLink: "current",
1653 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001654 },
1655 }
1656 for _, tc := range testcases {
1657 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001658 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001659 apex {
1660 name: "myapex",
1661 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001662 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001663 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001664 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001665 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001666
Jooyung Han61b66e92020-03-21 14:21:46 +00001667 apex_key {
1668 name: "myapex.key",
1669 public_key: "testkey.avbpubkey",
1670 private_key: "testkey.pem",
1671 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001672
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 cc_library {
1674 name: "mylib",
1675 srcs: ["mylib.cpp"],
1676 vendor_available: true,
1677 shared_libs: ["libbar"],
1678 system_shared_libs: [],
1679 stl: "none",
1680 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001681 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001683
Jooyung Han61b66e92020-03-21 14:21:46 +00001684 cc_library {
1685 name: "libbar",
1686 srcs: ["mylib.cpp"],
1687 system_shared_libs: [],
1688 stl: "none",
1689 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001690 llndk: {
1691 symbol_file: "libbar.map.txt",
1692 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001694 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001695 withUnbundledBuild,
1696 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001697
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001699 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 "lib64/mylib.so",
1701 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001702
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001704 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001705 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1706 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001707
Steven Moreland2c4000c2021-04-27 02:08:49 +00001708 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1709 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001711 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001713
Steven Moreland2c4000c2021-04-27 02:08:49 +00001714 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001715 ver := tc.shouldLink
1716 if tc.shouldLink == "current" {
1717 ver = strconv.Itoa(android.FutureApiLevelInt)
1718 }
1719 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001720 })
1721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722}
1723
Jiyong Park25fc6a92018-11-18 18:02:45 +09001724func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001725 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 apex {
1727 name: "myapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001730 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "mylib",
1741 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001742 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001743 shared_libs: ["libdl#27"],
1744 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001745 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001746 }
1747
1748 cc_library_shared {
1749 name: "mylib_shared",
1750 srcs: ["mylib.cpp"],
1751 shared_libs: ["libdl#27"],
1752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001753 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001754 }
1755
1756 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001757 name: "libBootstrap",
1758 srcs: ["mylib.cpp"],
1759 stl: "none",
1760 bootstrap: true,
1761 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001762 `)
1763
Jooyung Hana0503a52023-08-23 13:12:50 +09001764 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001765 copyCmds := apexRule.Args["copy_commands"]
1766
1767 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001768 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001769 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1770 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771
1772 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001773 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001774
Colin Crossaede88c2020-08-11 12:17:01 -07001775 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1776 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1777 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001778
1779 // For dependency to libc
1780 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001781 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001782 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001783 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001785 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1786 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001787
1788 // For dependency to libm
1789 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001790 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001792 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001793 // ... and is not compiling with the stub
1794 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1795 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1796
1797 // For dependency to libdl
1798 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001799 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001801 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1802 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001803 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001804 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 // ... Cflags from stub is correctly exported to mylib
1806 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1807 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001808
1809 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001810 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1811 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1812 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1813 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001815
Jooyung Han749dc692020-04-15 11:03:39 +09001816func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001817 // there are three links between liba --> libz.
1818 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001819 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001820 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001821 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001822 apex {
1823 name: "myapex",
1824 key: "myapex.key",
1825 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001826 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001827 }
1828
1829 apex {
1830 name: "otherapex",
1831 key: "myapex.key",
1832 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001833 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001834 }
1835
1836 apex_key {
1837 name: "myapex.key",
1838 public_key: "testkey.avbpubkey",
1839 private_key: "testkey.pem",
1840 }
1841
1842 cc_library {
1843 name: "libx",
1844 shared_libs: ["liba"],
1845 system_shared_libs: [],
1846 stl: "none",
1847 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001848 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001849 }
1850
1851 cc_library {
1852 name: "liby",
1853 shared_libs: ["liba"],
1854 system_shared_libs: [],
1855 stl: "none",
1856 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001857 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001858 }
1859
1860 cc_library {
1861 name: "liba",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [
1866 "//apex_available:anyapex",
1867 "//apex_available:platform",
1868 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001869 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001877 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001878 },
1879 }
Jooyung Han749dc692020-04-15 11:03:39 +09001880 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001881
1882 expectLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
1886 expectNoLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
1890 // platform liba is linked to non-stub version
1891 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001892 // liba in myapex is linked to current
1893 expectLink("liba", "shared_apex29", "libz", "shared_current")
1894 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001895 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001896 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001897 // liba in otherapex is linked to current
1898 expectLink("liba", "shared_apex30", "libz", "shared_current")
1899 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001900 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1901 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001902}
1903
Jooyung Hanaed150d2020-04-02 01:41:41 +09001904func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001905 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001906 apex {
1907 name: "myapex",
1908 key: "myapex.key",
1909 native_shared_libs: ["libx"],
1910 min_sdk_version: "R",
1911 }
1912
1913 apex_key {
1914 name: "myapex.key",
1915 public_key: "testkey.avbpubkey",
1916 private_key: "testkey.pem",
1917 }
1918
1919 cc_library {
1920 name: "libx",
1921 shared_libs: ["libz"],
1922 system_shared_libs: [],
1923 stl: "none",
1924 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001925 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001926 }
1927
1928 cc_library {
1929 name: "libz",
1930 system_shared_libs: [],
1931 stl: "none",
1932 stubs: {
1933 versions: ["29", "R"],
1934 },
1935 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001936 `,
1937 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1938 variables.Platform_version_active_codenames = []string{"R"}
1939 }),
1940 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001941
1942 expectLink := func(from, from_variant, to, to_variant string) {
1943 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1944 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1945 }
1946 expectNoLink := func(from, from_variant, to, to_variant string) {
1947 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1948 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1949 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001950 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1951 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001952 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1953 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001954}
1955
Jooyung Han4c4da062021-06-23 10:23:16 +09001956func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1957 testApex(t, `
1958 apex {
1959 name: "myapex",
1960 key: "myapex.key",
1961 java_libs: ["libx"],
1962 min_sdk_version: "S",
1963 }
1964
1965 apex_key {
1966 name: "myapex.key",
1967 public_key: "testkey.avbpubkey",
1968 private_key: "testkey.pem",
1969 }
1970
1971 java_library {
1972 name: "libx",
1973 srcs: ["a.java"],
1974 apex_available: [ "myapex" ],
1975 sdk_version: "current",
1976 min_sdk_version: "S", // should be okay
1977 }
1978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"S"}
1981 variables.Platform_sdk_codename = proptools.StringPtr("S")
1982 }),
1983 )
1984}
1985
Jooyung Han749dc692020-04-15 11:03:39 +09001986func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001987 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001988 apex {
1989 name: "myapex",
1990 key: "myapex.key",
1991 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001992 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001993 }
1994
1995 apex_key {
1996 name: "myapex.key",
1997 public_key: "testkey.avbpubkey",
1998 private_key: "testkey.pem",
1999 }
2000
2001 cc_library {
2002 name: "libx",
2003 shared_libs: ["libz"],
2004 system_shared_libs: [],
2005 stl: "none",
2006 apex_available: [ "myapex" ],
2007 }
2008
2009 cc_library {
2010 name: "libz",
2011 system_shared_libs: [],
2012 stl: "none",
2013 stubs: {
2014 versions: ["1", "2"],
2015 },
2016 }
2017 `)
2018
2019 expectLink := func(from, from_variant, to, to_variant string) {
2020 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2021 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
2023 expectNoLink := func(from, from_variant, to, to_variant string) {
2024 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2025 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2026 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002027 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002028 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002029 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002030 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002031}
2032
Jooyung Handfc864c2023-03-20 18:19:07 +09002033func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002034 ctx := testApex(t, `
2035 apex {
2036 name: "myapex",
2037 key: "myapex.key",
2038 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002039 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002040 vendor: true,
2041 min_sdk_version: "29",
2042 }
2043
2044 apex_key {
2045 name: "myapex.key",
2046 public_key: "testkey.avbpubkey",
2047 private_key: "testkey.pem",
2048 }
2049
2050 cc_library {
2051 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002052 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002053 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002054 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002055 shared_libs: ["libbar"],
2056 }
2057
2058 cc_library {
2059 name: "libbar",
2060 stubs: { versions: ["29", "30"] },
2061 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002062 }
2063 `)
2064
2065 vendorVariant := "android_vendor.29_arm64_armv8-a"
2066
Jooyung Handfc864c2023-03-20 18:19:07 +09002067 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2068
2069 // Ensure that mylib links with "current" LLNDK
2070 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002071 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002072
2073 // Ensure that mylib is targeting 29
2074 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2075 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2076
2077 // Ensure that the correct variant of crtbegin_so is used.
2078 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2079 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080
2081 // Ensure that the crtbegin_so used by the APEX is targeting 29
2082 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2083 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2084}
2085
Jooyung Han4495f842023-04-25 16:39:59 +09002086func TestTrackAllowedDeps(t *testing.T) {
2087 ctx := testApex(t, `
2088 apex {
2089 name: "myapex",
2090 key: "myapex.key",
2091 updatable: true,
2092 native_shared_libs: [
2093 "mylib",
2094 "yourlib",
2095 ],
2096 min_sdk_version: "29",
2097 }
2098
2099 apex {
2100 name: "myapex2",
2101 key: "myapex.key",
2102 updatable: false,
2103 native_shared_libs: ["yourlib"],
2104 }
2105
2106 apex_key {
2107 name: "myapex.key",
2108 public_key: "testkey.avbpubkey",
2109 private_key: "testkey.pem",
2110 }
2111
2112 cc_library {
2113 name: "mylib",
2114 srcs: ["mylib.cpp"],
2115 shared_libs: ["libbar"],
2116 min_sdk_version: "29",
2117 apex_available: ["myapex"],
2118 }
2119
2120 cc_library {
2121 name: "libbar",
2122 stubs: { versions: ["29", "30"] },
2123 }
2124
2125 cc_library {
2126 name: "yourlib",
2127 srcs: ["mylib.cpp"],
2128 min_sdk_version: "29",
2129 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2130 }
2131 `, withFiles(android.MockFS{
2132 "packages/modules/common/build/allowed_deps.txt": nil,
2133 }))
2134
2135 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2136 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2137 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002138 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002139 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002140 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002141
Jooyung Hana0503a52023-08-23 13:12:50 +09002142 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002143 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2144 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002145 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2146 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2147 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2148 flatlist, "mylib:(minSdkVersion:29)")
2149 android.AssertStringListContains(t, "track platform-available lib",
2150 flatlist, "yourlib(minSdkVersion:29)")
2151}
2152
2153func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2154 ctx := testApex(t, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 updatable: true,
2159 min_sdk_version: "29",
2160 }
2161
2162 apex_key {
2163 name: "myapex.key",
2164 public_key: "testkey.avbpubkey",
2165 private_key: "testkey.pem",
2166 }
2167 `)
2168 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2169 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2170 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2171 }
2172}
2173
Jooyung Han03b51852020-02-26 22:45:42 +09002174func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002175 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002176 apex {
2177 name: "myapex",
2178 key: "myapex.key",
2179 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002180 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002181 }
2182
2183 apex_key {
2184 name: "myapex.key",
2185 public_key: "testkey.avbpubkey",
2186 private_key: "testkey.pem",
2187 }
2188
2189 cc_library {
2190 name: "libx",
2191 system_shared_libs: [],
2192 stl: "none",
2193 apex_available: [ "myapex" ],
2194 stubs: {
2195 versions: ["1", "2"],
2196 },
2197 }
2198
2199 cc_library {
2200 name: "libz",
2201 shared_libs: ["libx"],
2202 system_shared_libs: [],
2203 stl: "none",
2204 }
2205 `)
2206
2207 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002208 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002209 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2210 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2211 }
2212 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002213 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002214 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2215 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2216 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002217 expectLink("libz", "shared", "libx", "shared_current")
2218 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002219 expectNoLink("libz", "shared", "libz", "shared_1")
2220 expectNoLink("libz", "shared", "libz", "shared")
2221}
2222
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002223var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2224 func(variables android.FixtureProductVariables) {
2225 variables.SanitizeDevice = []string{"hwaddress"}
2226 },
2227)
2228
Jooyung Han75568392020-03-20 04:29:24 +09002229func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002230 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002231 apex {
2232 name: "myapex",
2233 key: "myapex.key",
2234 native_shared_libs: ["libx"],
2235 min_sdk_version: "29",
2236 }
2237
2238 apex_key {
2239 name: "myapex.key",
2240 public_key: "testkey.avbpubkey",
2241 private_key: "testkey.pem",
2242 }
2243
2244 cc_library {
2245 name: "libx",
2246 shared_libs: ["libbar"],
2247 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002248 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002249 }
2250
2251 cc_library {
2252 name: "libbar",
2253 stubs: {
2254 versions: ["29", "30"],
2255 },
2256 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002257 `,
2258 prepareForTestWithSantitizeHwaddress,
2259 )
Jooyung Han03b51852020-02-26 22:45:42 +09002260 expectLink := func(from, from_variant, to, to_variant string) {
2261 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2262 libFlags := ld.Args["libFlags"]
2263 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2264 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002265 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002266}
2267
Jooyung Han75568392020-03-20 04:29:24 +09002268func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002269 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002270 apex {
2271 name: "myapex",
2272 key: "myapex.key",
2273 native_shared_libs: ["libx"],
2274 min_sdk_version: "29",
2275 }
2276
2277 apex_key {
2278 name: "myapex.key",
2279 public_key: "testkey.avbpubkey",
2280 private_key: "testkey.pem",
2281 }
2282
2283 cc_library {
2284 name: "libx",
2285 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002286 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002287 }
Jooyung Han75568392020-03-20 04:29:24 +09002288 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002289
2290 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002291 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002292 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002293 // note that platform variant is not.
2294 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002295 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002296}
2297
Jooyung Han749dc692020-04-15 11:03:39 +09002298func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2299 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002300 apex {
2301 name: "myapex",
2302 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002303 native_shared_libs: ["mylib"],
2304 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002305 }
2306
2307 apex_key {
2308 name: "myapex.key",
2309 public_key: "testkey.avbpubkey",
2310 private_key: "testkey.pem",
2311 }
Jooyung Han749dc692020-04-15 11:03:39 +09002312
2313 cc_library {
2314 name: "mylib",
2315 srcs: ["mylib.cpp"],
2316 system_shared_libs: [],
2317 stl: "none",
2318 apex_available: [
2319 "myapex",
2320 ],
2321 min_sdk_version: "30",
2322 }
2323 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002324
2325 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2326 apex {
2327 name: "myapex",
2328 key: "myapex.key",
2329 native_shared_libs: ["libfoo.ffi"],
2330 min_sdk_version: "29",
2331 }
2332
2333 apex_key {
2334 name: "myapex.key",
2335 public_key: "testkey.avbpubkey",
2336 private_key: "testkey.pem",
2337 }
2338
2339 rust_ffi_shared {
2340 name: "libfoo.ffi",
2341 srcs: ["foo.rs"],
2342 crate_name: "foo",
2343 apex_available: [
2344 "myapex",
2345 ],
2346 min_sdk_version: "30",
2347 }
2348 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002349
2350 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2351 apex {
2352 name: "myapex",
2353 key: "myapex.key",
2354 java_libs: ["libfoo"],
2355 min_sdk_version: "29",
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 java_import {
2365 name: "libfoo",
2366 jars: ["libfoo.jar"],
2367 apex_available: [
2368 "myapex",
2369 ],
2370 min_sdk_version: "30",
2371 }
2372 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002373
2374 // Skip check for modules compiling against core API surface
2375 testApex(t, `
2376 apex {
2377 name: "myapex",
2378 key: "myapex.key",
2379 java_libs: ["libfoo"],
2380 min_sdk_version: "29",
2381 }
2382
2383 apex_key {
2384 name: "myapex.key",
2385 public_key: "testkey.avbpubkey",
2386 private_key: "testkey.pem",
2387 }
2388
2389 java_library {
2390 name: "libfoo",
2391 srcs: ["Foo.java"],
2392 apex_available: [
2393 "myapex",
2394 ],
2395 // Compile against core API surface
2396 sdk_version: "core_current",
2397 min_sdk_version: "30",
2398 }
2399 `)
2400
Jooyung Han749dc692020-04-15 11:03:39 +09002401}
2402
2403func TestApexMinSdkVersion_Okay(t *testing.T) {
2404 testApex(t, `
2405 apex {
2406 name: "myapex",
2407 key: "myapex.key",
2408 native_shared_libs: ["libfoo"],
2409 java_libs: ["libbar"],
2410 min_sdk_version: "29",
2411 }
2412
2413 apex_key {
2414 name: "myapex.key",
2415 public_key: "testkey.avbpubkey",
2416 private_key: "testkey.pem",
2417 }
2418
2419 cc_library {
2420 name: "libfoo",
2421 srcs: ["mylib.cpp"],
2422 shared_libs: ["libfoo_dep"],
2423 apex_available: ["myapex"],
2424 min_sdk_version: "29",
2425 }
2426
2427 cc_library {
2428 name: "libfoo_dep",
2429 srcs: ["mylib.cpp"],
2430 apex_available: ["myapex"],
2431 min_sdk_version: "29",
2432 }
2433
2434 java_library {
2435 name: "libbar",
2436 sdk_version: "current",
2437 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002438 static_libs: [
2439 "libbar_dep",
2440 "libbar_import_dep",
2441 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002442 apex_available: ["myapex"],
2443 min_sdk_version: "29",
2444 }
2445
2446 java_library {
2447 name: "libbar_dep",
2448 sdk_version: "current",
2449 srcs: ["a.java"],
2450 apex_available: ["myapex"],
2451 min_sdk_version: "29",
2452 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002453
2454 java_import {
2455 name: "libbar_import_dep",
2456 jars: ["libbar.jar"],
2457 apex_available: ["myapex"],
2458 min_sdk_version: "29",
2459 }
Jooyung Han03b51852020-02-26 22:45:42 +09002460 `)
2461}
2462
Colin Cross8ca61c12022-10-06 21:00:14 -07002463func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2464 // Tests that an apex dependency with min_sdk_version higher than the
2465 // min_sdk_version of the apex is allowed as long as the dependency's
2466 // min_sdk_version is less than or equal to the api level that the
2467 // architecture was introduced in. In this case, arm64 didn't exist
2468 // until api level 21, so the arm64 code will never need to run on
2469 // an api level 20 device, even if other architectures of the apex
2470 // will.
2471 testApex(t, `
2472 apex {
2473 name: "myapex",
2474 key: "myapex.key",
2475 native_shared_libs: ["libfoo"],
2476 min_sdk_version: "20",
2477 }
2478
2479 apex_key {
2480 name: "myapex.key",
2481 public_key: "testkey.avbpubkey",
2482 private_key: "testkey.pem",
2483 }
2484
2485 cc_library {
2486 name: "libfoo",
2487 srcs: ["mylib.cpp"],
2488 apex_available: ["myapex"],
2489 min_sdk_version: "21",
2490 stl: "none",
2491 }
2492 `)
2493}
2494
Artur Satayev8cf899a2020-04-15 17:29:42 +01002495func TestJavaStableSdkVersion(t *testing.T) {
2496 testCases := []struct {
2497 name string
2498 expectedError string
2499 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002500 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002501 }{
2502 {
2503 name: "Non-updatable apex with non-stable dep",
2504 bp: `
2505 apex {
2506 name: "myapex",
2507 java_libs: ["myjar"],
2508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002509 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 }
2511 apex_key {
2512 name: "myapex.key",
2513 public_key: "testkey.avbpubkey",
2514 private_key: "testkey.pem",
2515 }
2516 java_library {
2517 name: "myjar",
2518 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002519 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002520 apex_available: ["myapex"],
2521 }
2522 `,
2523 },
2524 {
2525 name: "Updatable apex with stable dep",
2526 bp: `
2527 apex {
2528 name: "myapex",
2529 java_libs: ["myjar"],
2530 key: "myapex.key",
2531 updatable: true,
2532 min_sdk_version: "29",
2533 }
2534 apex_key {
2535 name: "myapex.key",
2536 public_key: "testkey.avbpubkey",
2537 private_key: "testkey.pem",
2538 }
2539 java_library {
2540 name: "myjar",
2541 srcs: ["foo/bar/MyClass.java"],
2542 sdk_version: "current",
2543 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002544 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002545 }
2546 `,
2547 },
2548 {
2549 name: "Updatable apex with non-stable dep",
2550 expectedError: "cannot depend on \"myjar\"",
2551 bp: `
2552 apex {
2553 name: "myapex",
2554 java_libs: ["myjar"],
2555 key: "myapex.key",
2556 updatable: true,
2557 }
2558 apex_key {
2559 name: "myapex.key",
2560 public_key: "testkey.avbpubkey",
2561 private_key: "testkey.pem",
2562 }
2563 java_library {
2564 name: "myjar",
2565 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002566 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002567 apex_available: ["myapex"],
2568 }
2569 `,
2570 },
2571 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002572 name: "Updatable apex with non-stable legacy core platform dep",
2573 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2574 bp: `
2575 apex {
2576 name: "myapex",
2577 java_libs: ["myjar-uses-legacy"],
2578 key: "myapex.key",
2579 updatable: true,
2580 }
2581 apex_key {
2582 name: "myapex.key",
2583 public_key: "testkey.avbpubkey",
2584 private_key: "testkey.pem",
2585 }
2586 java_library {
2587 name: "myjar-uses-legacy",
2588 srcs: ["foo/bar/MyClass.java"],
2589 sdk_version: "core_platform",
2590 apex_available: ["myapex"],
2591 }
2592 `,
2593 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2594 },
2595 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002596 name: "Updatable apex with non-stable transitive dep",
2597 // This is not actually detecting that the transitive dependency is unstable, rather it is
2598 // detecting that the transitive dependency is building against a wider API surface than the
2599 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002600 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002601 bp: `
2602 apex {
2603 name: "myapex",
2604 java_libs: ["myjar"],
2605 key: "myapex.key",
2606 updatable: true,
2607 }
2608 apex_key {
2609 name: "myapex.key",
2610 public_key: "testkey.avbpubkey",
2611 private_key: "testkey.pem",
2612 }
2613 java_library {
2614 name: "myjar",
2615 srcs: ["foo/bar/MyClass.java"],
2616 sdk_version: "current",
2617 apex_available: ["myapex"],
2618 static_libs: ["transitive-jar"],
2619 }
2620 java_library {
2621 name: "transitive-jar",
2622 srcs: ["foo/bar/MyClass.java"],
2623 sdk_version: "core_platform",
2624 apex_available: ["myapex"],
2625 }
2626 `,
2627 },
2628 }
2629
2630 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002631 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2632 continue
2633 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002634 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002635 errorHandler := android.FixtureExpectsNoErrors
2636 if test.expectedError != "" {
2637 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002638 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002639 android.GroupFixturePreparers(
2640 java.PrepareForTestWithJavaDefaultModules,
2641 PrepareForTestWithApexBuildComponents,
2642 prepareForTestWithMyapex,
2643 android.OptionalFixturePreparer(test.preparer),
2644 ).
2645 ExtendWithErrorHandler(errorHandler).
2646 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002647 })
2648 }
2649}
2650
Jooyung Han749dc692020-04-15 11:03:39 +09002651func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2652 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2653 apex {
2654 name: "myapex",
2655 key: "myapex.key",
2656 native_shared_libs: ["mylib"],
2657 min_sdk_version: "29",
2658 }
2659
2660 apex_key {
2661 name: "myapex.key",
2662 public_key: "testkey.avbpubkey",
2663 private_key: "testkey.pem",
2664 }
2665
2666 cc_library {
2667 name: "mylib",
2668 srcs: ["mylib.cpp"],
2669 shared_libs: ["mylib2"],
2670 system_shared_libs: [],
2671 stl: "none",
2672 apex_available: [
2673 "myapex",
2674 ],
2675 min_sdk_version: "29",
2676 }
2677
2678 // indirect part of the apex
2679 cc_library {
2680 name: "mylib2",
2681 srcs: ["mylib.cpp"],
2682 system_shared_libs: [],
2683 stl: "none",
2684 apex_available: [
2685 "myapex",
2686 ],
2687 min_sdk_version: "30",
2688 }
2689 `)
2690}
2691
2692func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2693 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2694 apex {
2695 name: "myapex",
2696 key: "myapex.key",
2697 apps: ["AppFoo"],
2698 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002699 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002700 }
2701
2702 apex_key {
2703 name: "myapex.key",
2704 public_key: "testkey.avbpubkey",
2705 private_key: "testkey.pem",
2706 }
2707
2708 android_app {
2709 name: "AppFoo",
2710 srcs: ["foo/bar/MyClass.java"],
2711 sdk_version: "current",
2712 min_sdk_version: "29",
2713 system_modules: "none",
2714 stl: "none",
2715 static_libs: ["bar"],
2716 apex_available: [ "myapex" ],
2717 }
2718
2719 java_library {
2720 name: "bar",
2721 sdk_version: "current",
2722 srcs: ["a.java"],
2723 apex_available: [ "myapex" ],
2724 }
2725 `)
2726}
2727
2728func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002729 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002730 apex {
2731 name: "myapex",
2732 key: "myapex.key",
2733 native_shared_libs: ["mylib"],
2734 min_sdk_version: "29",
2735 }
2736
2737 apex_key {
2738 name: "myapex.key",
2739 public_key: "testkey.avbpubkey",
2740 private_key: "testkey.pem",
2741 }
2742
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002743 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002744 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2745 cc_library {
2746 name: "mylib",
2747 srcs: ["mylib.cpp"],
2748 shared_libs: ["mylib2"],
2749 system_shared_libs: [],
2750 stl: "none",
2751 apex_available: ["myapex", "otherapex"],
2752 min_sdk_version: "29",
2753 }
2754
2755 cc_library {
2756 name: "mylib2",
2757 srcs: ["mylib.cpp"],
2758 system_shared_libs: [],
2759 stl: "none",
2760 apex_available: ["otherapex"],
2761 stubs: { versions: ["29", "30"] },
2762 min_sdk_version: "30",
2763 }
2764
2765 apex {
2766 name: "otherapex",
2767 key: "myapex.key",
2768 native_shared_libs: ["mylib", "mylib2"],
2769 min_sdk_version: "30",
2770 }
2771 `)
2772 expectLink := func(from, from_variant, to, to_variant string) {
2773 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2774 libFlags := ld.Args["libFlags"]
2775 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2776 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002777 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002778 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002779}
2780
Jooyung Haned124c32021-01-26 11:43:46 +09002781func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002782 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2783 func(variables android.FixtureProductVariables) {
2784 variables.Platform_sdk_codename = proptools.StringPtr("S")
2785 variables.Platform_version_active_codenames = []string{"S"}
2786 },
2787 )
Jooyung Haned124c32021-01-26 11:43:46 +09002788 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2789 apex {
2790 name: "myapex",
2791 key: "myapex.key",
2792 native_shared_libs: ["libfoo"],
2793 min_sdk_version: "S",
2794 }
2795 apex_key {
2796 name: "myapex.key",
2797 public_key: "testkey.avbpubkey",
2798 private_key: "testkey.pem",
2799 }
2800 cc_library {
2801 name: "libfoo",
2802 shared_libs: ["libbar"],
2803 apex_available: ["myapex"],
2804 min_sdk_version: "29",
2805 }
2806 cc_library {
2807 name: "libbar",
2808 apex_available: ["myapex"],
2809 }
2810 `, withSAsActiveCodeNames)
2811}
2812
2813func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002814 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2815 variables.Platform_sdk_codename = proptools.StringPtr("S")
2816 variables.Platform_version_active_codenames = []string{"S", "T"}
2817 })
Colin Cross1c460562021-02-16 17:55:47 -08002818 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002819 apex {
2820 name: "myapex",
2821 key: "myapex.key",
2822 native_shared_libs: ["libfoo"],
2823 min_sdk_version: "S",
2824 }
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830 cc_library {
2831 name: "libfoo",
2832 shared_libs: ["libbar"],
2833 apex_available: ["myapex"],
2834 min_sdk_version: "S",
2835 }
2836 cc_library {
2837 name: "libbar",
2838 stubs: {
2839 symbol_file: "libbar.map.txt",
2840 versions: ["30", "S", "T"],
2841 },
2842 }
2843 `, withSAsActiveCodeNames)
2844
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002845 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002846 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2847 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002848 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002849}
2850
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002852 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002853 apex {
2854 name: "myapex",
2855 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002856 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002857 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002858 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002859 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002860 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 prebuilt_etc {
2870 name: "myetc",
2871 src: "myprebuilt",
2872 sub_dir: "foo/bar",
2873 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002874
2875 cc_library {
2876 name: "mylib",
2877 srcs: ["mylib.cpp"],
2878 relative_install_path: "foo/bar",
2879 system_shared_libs: [],
2880 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002881 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002882 }
2883
2884 cc_binary {
2885 name: "mybin",
2886 srcs: ["mylib.cpp"],
2887 relative_install_path: "foo/bar",
2888 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002889 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002890 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002891 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002892
2893 rust_binary {
2894 name: "mybin.rust",
2895 srcs: ["foo.rs"],
2896 relative_install_path: "rust_subdir",
2897 apex_available: [ "myapex" ],
2898 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002899 `)
2900
Jooyung Hana0503a52023-08-23 13:12:50 +09002901 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002902 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002903
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002904 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002905 ensureContains(t, cmd, "/etc ")
2906 ensureContains(t, cmd, "/etc/foo ")
2907 ensureContains(t, cmd, "/etc/foo/bar ")
2908 ensureContains(t, cmd, "/lib64 ")
2909 ensureContains(t, cmd, "/lib64/foo ")
2910 ensureContains(t, cmd, "/lib64/foo/bar ")
2911 ensureContains(t, cmd, "/lib ")
2912 ensureContains(t, cmd, "/lib/foo ")
2913 ensureContains(t, cmd, "/lib/foo/bar ")
2914 ensureContains(t, cmd, "/bin ")
2915 ensureContains(t, cmd, "/bin/foo ")
2916 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002917 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002918}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002919
Jooyung Han35155c42020-02-06 17:33:20 +09002920func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002921 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002922 apex {
2923 name: "myapex",
2924 key: "myapex.key",
2925 multilib: {
2926 both: {
2927 native_shared_libs: ["mylib"],
2928 binaries: ["mybin"],
2929 },
2930 },
2931 compile_multilib: "both",
2932 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002933 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002934 }
2935
2936 apex_key {
2937 name: "myapex.key",
2938 public_key: "testkey.avbpubkey",
2939 private_key: "testkey.pem",
2940 }
2941
2942 cc_library {
2943 name: "mylib",
2944 relative_install_path: "foo/bar",
2945 system_shared_libs: [],
2946 stl: "none",
2947 apex_available: [ "myapex" ],
2948 native_bridge_supported: true,
2949 }
2950
2951 cc_binary {
2952 name: "mybin",
2953 relative_install_path: "foo/bar",
2954 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002955 stl: "none",
2956 apex_available: [ "myapex" ],
2957 native_bridge_supported: true,
2958 compile_multilib: "both", // default is "first" for binary
2959 multilib: {
2960 lib64: {
2961 suffix: "64",
2962 },
2963 },
2964 }
2965 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002966 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002967 "bin/foo/bar/mybin",
2968 "bin/foo/bar/mybin64",
2969 "bin/arm/foo/bar/mybin",
2970 "bin/arm64/foo/bar/mybin64",
2971 "lib/foo/bar/mylib.so",
2972 "lib/arm/foo/bar/mylib.so",
2973 "lib64/foo/bar/mylib.so",
2974 "lib64/arm64/foo/bar/mylib.so",
2975 })
2976}
2977
Jooyung Han85d61762020-06-24 23:50:26 +09002978func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002979 result := android.GroupFixturePreparers(
2980 prepareForApexTest,
2981 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2982 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002983 apex {
2984 name: "myapex",
2985 key: "myapex.key",
2986 binaries: ["mybin"],
2987 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002988 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002989 }
2990 apex_key {
2991 name: "myapex.key",
2992 public_key: "testkey.avbpubkey",
2993 private_key: "testkey.pem",
2994 }
2995 cc_binary {
2996 name: "mybin",
2997 vendor: true,
2998 shared_libs: ["libfoo"],
2999 }
3000 cc_library {
3001 name: "libfoo",
3002 proprietary: true,
3003 }
3004 `)
3005
Jooyung Hana0503a52023-08-23 13:12:50 +09003006 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003007 "bin/mybin",
3008 "lib64/libfoo.so",
3009 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3010 "lib64/libc++.so",
3011 })
3012
Jooyung Hana0503a52023-08-23 13:12:50 +09003013 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003014 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003015 name := apexBundle.BaseModuleName()
3016 prefix := "TARGET_"
3017 var builder strings.Builder
3018 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003019 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003020 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003021 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003022
Jooyung Hana0503a52023-08-23 13:12:50 +09003023 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003024 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3025 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003026}
3027
Jooyung Hanc5a96762022-02-04 11:54:50 +09003028func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
3029 testApexError(t, `Trying to include a VNDK library`, `
3030 apex {
3031 name: "myapex",
3032 key: "myapex.key",
3033 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
3034 vendor: true,
3035 use_vndk_as_stable: true,
3036 updatable: false,
3037 }
3038 apex_key {
3039 name: "myapex.key",
3040 public_key: "testkey.avbpubkey",
3041 private_key: "testkey.pem",
3042 }`)
3043}
3044
Jooyung Handf78e212020-07-22 15:54:47 +09003045func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09003046 // myapex myapex2
3047 // | |
3048 // mybin ------. mybin2
3049 // \ \ / |
3050 // (stable) .---\--------` |
3051 // \ / \ |
3052 // \ / \ /
3053 // libvndk libvendor
3054 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08003055 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09003056 apex {
3057 name: "myapex",
3058 key: "myapex.key",
3059 binaries: ["mybin"],
3060 vendor: true,
3061 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003062 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09003063 }
3064 apex_key {
3065 name: "myapex.key",
3066 public_key: "testkey.avbpubkey",
3067 private_key: "testkey.pem",
3068 }
3069 cc_binary {
3070 name: "mybin",
3071 vendor: true,
3072 shared_libs: ["libvndk", "libvendor"],
3073 }
3074 cc_library {
3075 name: "libvndk",
3076 vndk: {
3077 enabled: true,
3078 },
3079 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003080 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003081 }
3082 cc_library {
3083 name: "libvendor",
3084 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003085 stl: "none",
3086 }
3087 apex {
3088 name: "myapex2",
3089 key: "myapex.key",
3090 binaries: ["mybin2"],
3091 vendor: true,
3092 use_vndk_as_stable: false,
3093 updatable: false,
3094 }
3095 cc_binary {
3096 name: "mybin2",
3097 vendor: true,
3098 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003099 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003100 `,
3101 android.FixtureModifyConfig(func(config android.Config) {
3102 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3103 }),
3104 )
Jooyung Handf78e212020-07-22 15:54:47 +09003105
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003106 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003107
Jooyung Han91f92032022-02-04 12:36:33 +09003108 for _, tc := range []struct {
3109 name string
3110 apexName string
3111 moduleName string
3112 moduleVariant string
3113 libs []string
3114 contents []string
3115 requireVndkNamespace bool
3116 }{
3117 {
3118 name: "use_vndk_as_stable",
3119 apexName: "myapex",
3120 moduleName: "mybin",
3121 moduleVariant: vendorVariant + "_apex10000",
3122 libs: []string{
3123 // should link with vendor variants of VNDK libs(libvndk/libc++)
3124 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3125 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3126 // unstable Vendor libs as APEX variant
3127 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3128 },
3129 contents: []string{
3130 "bin/mybin",
3131 "lib64/libvendor.so",
3132 // VNDK libs (libvndk/libc++) are not included
3133 },
3134 requireVndkNamespace: true,
3135 },
3136 {
3137 name: "!use_vndk_as_stable",
3138 apexName: "myapex2",
3139 moduleName: "mybin2",
3140 moduleVariant: vendorVariant + "_myapex2",
3141 libs: []string{
3142 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3143 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3144 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3145 // unstable vendor libs have "merged" APEX variants
3146 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3147 },
3148 contents: []string{
3149 "bin/mybin2",
3150 "lib64/libvendor.so",
3151 // VNDK libs are included as well
3152 "lib64/libvndk.so",
3153 "lib64/libc++.so",
3154 },
3155 requireVndkNamespace: false,
3156 },
3157 } {
3158 t.Run(tc.name, func(t *testing.T) {
3159 // Check linked libs
3160 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3161 libs := names(ldRule.Args["libFlags"])
3162 for _, lib := range tc.libs {
3163 ensureListContains(t, libs, lib)
3164 }
3165 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003166 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003167
Jooyung Han91f92032022-02-04 12:36:33 +09003168 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003169 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003170 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3171 if tc.requireVndkNamespace {
3172 ensureListContains(t, requireNativeLibs, ":vndk")
3173 } else {
3174 ensureListNotContains(t, requireNativeLibs, ":vndk")
3175 }
3176 })
3177 }
Jooyung Handf78e212020-07-22 15:54:47 +09003178}
3179
Justin Yun13decfb2021-03-08 19:25:55 +09003180func TestProductVariant(t *testing.T) {
3181 ctx := testApex(t, `
3182 apex {
3183 name: "myapex",
3184 key: "myapex.key",
3185 updatable: false,
3186 product_specific: true,
3187 binaries: ["foo"],
3188 }
3189
3190 apex_key {
3191 name: "myapex.key",
3192 public_key: "testkey.avbpubkey",
3193 private_key: "testkey.pem",
3194 }
3195
3196 cc_binary {
3197 name: "foo",
3198 product_available: true,
3199 apex_available: ["myapex"],
3200 srcs: ["foo.cpp"],
3201 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003202 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003203
3204 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003205 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003206 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3207 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3208 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3209 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3210}
3211
Jooyung Han8e5685d2020-09-21 11:02:57 +09003212func TestApex_withPrebuiltFirmware(t *testing.T) {
3213 testCases := []struct {
3214 name string
3215 additionalProp string
3216 }{
3217 {"system apex with prebuilt_firmware", ""},
3218 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3219 }
3220 for _, tc := range testCases {
3221 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003222 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003223 apex {
3224 name: "myapex",
3225 key: "myapex.key",
3226 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003227 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003228 `+tc.additionalProp+`
3229 }
3230 apex_key {
3231 name: "myapex.key",
3232 public_key: "testkey.avbpubkey",
3233 private_key: "testkey.pem",
3234 }
3235 prebuilt_firmware {
3236 name: "myfirmware",
3237 src: "myfirmware.bin",
3238 filename_from_src: true,
3239 `+tc.additionalProp+`
3240 }
3241 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003242 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003243 "etc/firmware/myfirmware.bin",
3244 })
3245 })
3246 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003247}
3248
Jooyung Hanefb184e2020-06-25 17:14:25 +09003249func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003251 apex {
3252 name: "myapex",
3253 key: "myapex.key",
3254 vendor: true,
3255 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003256 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003257 }
3258
3259 apex_key {
3260 name: "myapex.key",
3261 public_key: "testkey.avbpubkey",
3262 private_key: "testkey.pem",
3263 }
3264
3265 cc_library {
3266 name: "mylib",
3267 vendor_available: true,
3268 }
3269 `)
3270
Jooyung Hana0503a52023-08-23 13:12:50 +09003271 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003272 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003273 name := apexBundle.BaseModuleName()
3274 prefix := "TARGET_"
3275 var builder strings.Builder
3276 data.Custom(&builder, name, prefix, "", data)
3277 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003278 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 +09003279}
3280
Jooyung Han2ed99d02020-06-24 23:26:26 +09003281func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003282 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003283 apex {
3284 name: "myapex",
3285 key: "myapex.key",
3286 vintf_fragments: ["fragment.xml"],
3287 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003288 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003289 }
3290 apex_key {
3291 name: "myapex.key",
3292 public_key: "testkey.avbpubkey",
3293 private_key: "testkey.pem",
3294 }
3295 cc_binary {
3296 name: "mybin",
3297 }
3298 `)
3299
Jooyung Hana0503a52023-08-23 13:12:50 +09003300 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003301 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003302 name := apexBundle.BaseModuleName()
3303 prefix := "TARGET_"
3304 var builder strings.Builder
3305 data.Custom(&builder, name, prefix, "", data)
3306 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003307 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003308 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003309}
3310
Jiyong Park16e91a02018-12-20 18:18:08 +09003311func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003312 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003313 apex {
3314 name: "myapex",
3315 key: "myapex.key",
3316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003317 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003318 }
3319
3320 apex_key {
3321 name: "myapex.key",
3322 public_key: "testkey.avbpubkey",
3323 private_key: "testkey.pem",
3324 }
3325
3326 cc_library {
3327 name: "mylib",
3328 srcs: ["mylib.cpp"],
3329 system_shared_libs: [],
3330 stl: "none",
3331 stubs: {
3332 versions: ["1", "2", "3"],
3333 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003334 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003335 }
3336
3337 cc_binary {
3338 name: "not_in_apex",
3339 srcs: ["mylib.cpp"],
3340 static_libs: ["mylib"],
3341 static_executable: true,
3342 system_shared_libs: [],
3343 stl: "none",
3344 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003345 `)
3346
Colin Cross7113d202019-11-20 16:39:12 -08003347 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003348
3349 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003350 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003351}
Jiyong Park9335a262018-12-24 11:31:58 +09003352
3353func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003354 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003355 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003356 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003357 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003358 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003359 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003360 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003361 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003362 }
3363
3364 cc_library {
3365 name: "mylib",
3366 srcs: ["mylib.cpp"],
3367 system_shared_libs: [],
3368 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003369 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003370 }
3371
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003378 android_app_certificate {
3379 name: "myapex.certificate",
3380 certificate: "testkey",
3381 }
3382
3383 android_app_certificate {
3384 name: "myapex.certificate.override",
3385 certificate: "testkey.override",
3386 }
3387
Jiyong Park9335a262018-12-24 11:31:58 +09003388 `)
3389
3390 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003391 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003392
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003393 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3394 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003395 "vendor/foo/devkeys/testkey.avbpubkey")
3396 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003397 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3398 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003399 "vendor/foo/devkeys/testkey.pem")
3400 }
3401
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003402 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003403 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003404 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003405 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003406 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003407 }
3408}
Jiyong Park58e364a2019-01-19 19:24:06 +09003409
Jooyung Hanf121a652019-12-17 14:30:11 +09003410func TestCertificate(t *testing.T) {
3411 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003412 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003413 apex {
3414 name: "myapex",
3415 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003423 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003424 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3425 if actual := rule.Args["certificates"]; actual != expected {
3426 t.Errorf("certificates should be %q, not %q", expected, actual)
3427 }
3428 })
3429 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003430 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003431 apex {
3432 name: "myapex_keytest",
3433 key: "myapex.key",
3434 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003435 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 }
3437 apex_key {
3438 name: "myapex.key",
3439 public_key: "testkey.avbpubkey",
3440 private_key: "testkey.pem",
3441 }
3442 android_app_certificate {
3443 name: "myapex.certificate.override",
3444 certificate: "testkey.override",
3445 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003446 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 expected := "testkey.override.x509.pem testkey.override.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003453 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003454 apex {
3455 name: "myapex",
3456 key: "myapex.key",
3457 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003458 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003459 }
3460 apex_key {
3461 name: "myapex.key",
3462 public_key: "testkey.avbpubkey",
3463 private_key: "testkey.pem",
3464 }
3465 android_app_certificate {
3466 name: "myapex.certificate",
3467 certificate: "testkey",
3468 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003469 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003470 expected := "testkey.x509.pem testkey.pk8"
3471 if actual := rule.Args["certificates"]; actual != expected {
3472 t.Errorf("certificates should be %q, not %q", expected, actual)
3473 }
3474 })
3475 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003477 apex {
3478 name: "myapex_keytest",
3479 key: "myapex.key",
3480 file_contexts: ":myapex-file_contexts",
3481 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003482 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 }
3484 apex_key {
3485 name: "myapex.key",
3486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489 android_app_certificate {
3490 name: "myapex.certificate.override",
3491 certificate: "testkey.override",
3492 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003493 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003494 expected := "testkey.override.x509.pem testkey.override.pk8"
3495 if actual := rule.Args["certificates"]; actual != expected {
3496 t.Errorf("certificates should be %q, not %q", expected, actual)
3497 }
3498 })
3499 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003500 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003501 apex {
3502 name: "myapex",
3503 key: "myapex.key",
3504 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003505 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 }
3507 apex_key {
3508 name: "myapex.key",
3509 public_key: "testkey.avbpubkey",
3510 private_key: "testkey.pem",
3511 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003512 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003513 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3514 if actual := rule.Args["certificates"]; actual != expected {
3515 t.Errorf("certificates should be %q, not %q", expected, actual)
3516 }
3517 })
3518 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003519 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003520 apex {
3521 name: "myapex_keytest",
3522 key: "myapex.key",
3523 file_contexts: ":myapex-file_contexts",
3524 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003525 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003526 }
3527 apex_key {
3528 name: "myapex.key",
3529 public_key: "testkey.avbpubkey",
3530 private_key: "testkey.pem",
3531 }
3532 android_app_certificate {
3533 name: "myapex.certificate.override",
3534 certificate: "testkey.override",
3535 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003536 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003537 expected := "testkey.override.x509.pem testkey.override.pk8"
3538 if actual := rule.Args["certificates"]; actual != expected {
3539 t.Errorf("certificates should be %q, not %q", expected, actual)
3540 }
3541 })
3542}
3543
Jiyong Park58e364a2019-01-19 19:24:06 +09003544func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003545 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003546 apex {
3547 name: "myapex",
3548 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003549 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003550 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003551 }
3552
3553 apex {
3554 name: "otherapex",
3555 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003556 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003557 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003558 }
3559
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565
3566 cc_library {
3567 name: "mylib",
3568 srcs: ["mylib.cpp"],
3569 system_shared_libs: [],
3570 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003571 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003572 "myapex",
3573 "otherapex",
3574 ],
Jooyung Han24282772020-03-21 23:20:55 +09003575 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003576 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003577 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003578 cc_library {
3579 name: "mylib2",
3580 srcs: ["mylib.cpp"],
3581 system_shared_libs: [],
3582 stl: "none",
3583 apex_available: [
3584 "myapex",
3585 "otherapex",
3586 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003587 static_libs: ["mylib3"],
3588 recovery_available: true,
3589 min_sdk_version: "29",
3590 }
3591 cc_library {
3592 name: "mylib3",
3593 srcs: ["mylib.cpp"],
3594 system_shared_libs: [],
3595 stl: "none",
3596 apex_available: [
3597 "myapex",
3598 "otherapex",
3599 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003600 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003601 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003602 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003603 `)
3604
Jooyung Hanc87a0592020-03-02 17:44:33 +09003605 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003606 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003607 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003608
Vinh Tranf9754732023-01-19 22:41:46 -05003609 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003610 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003611 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003612
Vinh Tranf9754732023-01-19 22:41:46 -05003613 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003614 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003615 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003616
Colin Crossaede88c2020-08-11 12:17:01 -07003617 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3618 // each variant defines additional macros to distinguish which apex variant it is built for
3619
3620 // non-APEX variant does not have __ANDROID_APEX__ defined
3621 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3622 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3623
Vinh Tranf9754732023-01-19 22:41:46 -05003624 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003625 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3626 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003627
Jooyung Hanc87a0592020-03-02 17:44:33 +09003628 // non-APEX variant does not have __ANDROID_APEX__ defined
3629 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3630 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3631
Vinh Tranf9754732023-01-19 22:41:46 -05003632 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003633 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003634 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003635}
Jiyong Park7e636d02019-01-28 16:16:54 +09003636
3637func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003638 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003639 apex {
3640 name: "myapex",
3641 key: "myapex.key",
3642 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003643 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003644 }
3645
3646 apex_key {
3647 name: "myapex.key",
3648 public_key: "testkey.avbpubkey",
3649 private_key: "testkey.pem",
3650 }
3651
3652 cc_library_headers {
3653 name: "mylib_headers",
3654 export_include_dirs: ["my_include"],
3655 system_shared_libs: [],
3656 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003657 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003658 }
3659
3660 cc_library {
3661 name: "mylib",
3662 srcs: ["mylib.cpp"],
3663 system_shared_libs: [],
3664 stl: "none",
3665 header_libs: ["mylib_headers"],
3666 export_header_lib_headers: ["mylib_headers"],
3667 stubs: {
3668 versions: ["1", "2", "3"],
3669 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003670 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003671 }
3672
3673 cc_library {
3674 name: "otherlib",
3675 srcs: ["mylib.cpp"],
3676 system_shared_libs: [],
3677 stl: "none",
3678 shared_libs: ["mylib"],
3679 }
3680 `)
3681
Colin Cross7113d202019-11-20 16:39:12 -08003682 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003683
3684 // Ensure that the include path of the header lib is exported to 'otherlib'
3685 ensureContains(t, cFlags, "-Imy_include")
3686}
Alex Light9670d332019-01-29 18:07:33 -08003687
Jiyong Park7cd10e32020-01-14 09:22:18 +09003688type fileInApex struct {
3689 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003690 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003691 isLink bool
3692}
3693
Jooyung Han1724d582022-12-21 10:17:44 +09003694func (f fileInApex) String() string {
3695 return f.src + ":" + f.path
3696}
3697
3698func (f fileInApex) match(expectation string) bool {
3699 parts := strings.Split(expectation, ":")
3700 if len(parts) == 1 {
3701 match, _ := path.Match(parts[0], f.path)
3702 return match
3703 }
3704 if len(parts) == 2 {
3705 matchSrc, _ := path.Match(parts[0], f.src)
3706 matchDst, _ := path.Match(parts[1], f.path)
3707 return matchSrc && matchDst
3708 }
3709 panic("invalid expected file specification: " + expectation)
3710}
3711
Jooyung Hana57af4a2020-01-23 05:36:59 +00003712func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003714 module := ctx.ModuleForTests(moduleName, variant)
3715 apexRule := module.MaybeRule("apexRule")
3716 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003718 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 for _, cmd := range strings.Split(copyCmds, "&&") {
3720 cmd = strings.TrimSpace(cmd)
3721 if cmd == "" {
3722 continue
3723 }
3724 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003725 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003726 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003727 switch terms[0] {
3728 case "mkdir":
3729 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003730 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 t.Fatal("copyCmds contains invalid cp command", cmd)
3732 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003733 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003734 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003735 isLink = false
3736 case "ln":
3737 if len(terms) != 3 && len(terms) != 4 {
3738 // ln LINK TARGET or ln -s LINK TARGET
3739 t.Fatal("copyCmds contains invalid ln command", cmd)
3740 }
3741 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003742 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003743 isLink = true
3744 default:
3745 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3746 }
3747 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003748 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003749 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003750 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 }
Jooyung Han1724d582022-12-21 10:17:44 +09003752 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003753 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003754 }
3755 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003756 return ret
3757}
3758
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003759func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003760 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003761 var failed bool
3762 var surplus []string
3763 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003764 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003765 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003766 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003767 if file.match(expected) {
3768 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003769 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003770 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 }
3772 }
Jooyung Han1724d582022-12-21 10:17:44 +09003773 if !matchFound {
3774 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003775 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003776 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003777
Jooyung Han31c470b2019-10-18 16:26:59 +09003778 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003779 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 t.Log("surplus files", surplus)
3781 failed = true
3782 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003783
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003784 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003785 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003786 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003787 if !filesMatched[expected] {
3788 missing = append(missing, expected)
3789 }
3790 }
3791 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003792 t.Log("missing files", missing)
3793 failed = true
3794 }
3795 if failed {
3796 t.Fail()
3797 }
3798}
3799
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003800func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3801 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3802}
3803
3804func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003805 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003806 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3807 if deapexer.Output != nil {
3808 outputs = append(outputs, deapexer.Output.String())
3809 }
3810 for _, output := range deapexer.ImplicitOutputs {
3811 outputs = append(outputs, output.String())
3812 }
3813 actualFiles := make([]fileInApex, 0, len(outputs))
3814 for _, output := range outputs {
3815 dir := "/deapexer/"
3816 pos := strings.LastIndex(output, dir)
3817 if pos == -1 {
3818 t.Fatal("Unknown deapexer output ", output)
3819 }
3820 path := output[pos+len(dir):]
3821 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3822 }
3823 assertFileListEquals(t, files, actualFiles)
3824}
3825
Jooyung Han344d5432019-08-23 11:17:39 +09003826func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003827 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003828 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003829 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003830 "etc/llndk.libraries.29.txt",
3831 "etc/vndkcore.libraries.29.txt",
3832 "etc/vndksp.libraries.29.txt",
3833 "etc/vndkprivate.libraries.29.txt",
3834 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003835 }
3836 testCases := []struct {
3837 vndkVersion string
3838 expectedFiles []string
3839 }{
3840 {
3841 vndkVersion: "current",
3842 expectedFiles: append(commonFiles,
3843 "lib/libvndk.so",
3844 "lib/libvndksp.so",
3845 "lib64/libvndk.so",
3846 "lib64/libvndksp.so"),
3847 },
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003848 }
3849 for _, tc := range testCases {
3850 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3851 ctx := testApex(t, `
3852 apex_vndk {
3853 name: "com.android.vndk.current",
3854 key: "com.android.vndk.current.key",
3855 updatable: false,
3856 }
3857
3858 apex_key {
3859 name: "com.android.vndk.current.key",
3860 public_key: "testkey.avbpubkey",
3861 private_key: "testkey.pem",
3862 }
3863
3864 cc_library {
3865 name: "libvndk",
3866 srcs: ["mylib.cpp"],
3867 vendor_available: true,
3868 product_available: true,
3869 vndk: {
3870 enabled: true,
3871 },
3872 system_shared_libs: [],
3873 stl: "none",
3874 apex_available: [ "com.android.vndk.current" ],
3875 }
3876
3877 cc_library {
3878 name: "libvndksp",
3879 srcs: ["mylib.cpp"],
3880 vendor_available: true,
3881 product_available: true,
3882 vndk: {
3883 enabled: true,
3884 support_system_process: true,
3885 },
3886 system_shared_libs: [],
3887 stl: "none",
3888 apex_available: [ "com.android.vndk.current" ],
3889 }
3890
3891 // VNDK-Ext should not cause any problems
3892
3893 cc_library {
3894 name: "libvndk.ext",
3895 srcs: ["mylib2.cpp"],
3896 vendor: true,
3897 vndk: {
3898 enabled: true,
3899 extends: "libvndk",
3900 },
3901 system_shared_libs: [],
3902 stl: "none",
3903 }
3904
3905 cc_library {
3906 name: "libvndksp.ext",
3907 srcs: ["mylib2.cpp"],
3908 vendor: true,
3909 vndk: {
3910 enabled: true,
3911 support_system_process: true,
3912 extends: "libvndksp",
3913 },
3914 system_shared_libs: [],
3915 stl: "none",
3916 }
3917 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3918 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003919 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003920 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003921 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003922 })
3923 }
Jooyung Han344d5432019-08-23 11:17:39 +09003924}
3925
3926func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003927 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003928 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003929 name: "com.android.vndk.current",
3930 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003932 }
3933
3934 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003935 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003936 public_key: "testkey.avbpubkey",
3937 private_key: "testkey.pem",
3938 }
3939
3940 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 name: "libvndk",
3942 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003943 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003944 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003945 vndk: {
3946 enabled: true,
3947 },
3948 system_shared_libs: [],
3949 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003950 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003951 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003952
3953 cc_prebuilt_library_shared {
3954 name: "libvndk.arm",
3955 srcs: ["libvndk.arm.so"],
3956 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003957 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003958 vndk: {
3959 enabled: true,
3960 },
3961 enabled: false,
3962 arch: {
3963 arm: {
3964 enabled: true,
3965 },
3966 },
3967 system_shared_libs: [],
3968 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003969 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003971 `+vndkLibrariesTxtFiles("current"),
3972 withFiles(map[string][]byte{
3973 "libvndk.so": nil,
3974 "libvndk.arm.so": nil,
3975 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003976 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003977 "lib/libvndk.so",
3978 "lib/libvndk.arm.so",
3979 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003980 "lib/libc++.so",
3981 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003982 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 })
Jooyung Han344d5432019-08-23 11:17:39 +09003984}
3985
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986func vndkLibrariesTxtFiles(vers ...string) (result string) {
3987 for _, v := range vers {
3988 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003989 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003990 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003991 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003992 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003993 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }
3995 `
3996 }
Justin Yund5784122023-10-25 13:25:32 +09003997 result += `
3998 llndk_libraries_txt {
3999 name: "llndk.libraries.txt",
4000 }
4001 llndk_libraries_txt_for_apex {
4002 name: "llndk.libraries.txt.apex",
4003 stem: "llndk.libraries.txt",
4004 insert_vndk_version: true,
4005 }
4006 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09004008 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004009 result += `
4010 prebuilt_etc {
4011 name: "` + txt + `.libraries.` + v + `.txt",
4012 src: "dummy.txt",
4013 }
4014 `
4015 }
4016 }
4017 }
4018 return
4019}
4020
Jooyung Han344d5432019-08-23 11:17:39 +09004021func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004022 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004023 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004024 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004025 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004026 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004027 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004029 }
4030
4031 apex_key {
4032 name: "myapex.key",
4033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
Jooyung Han31c470b2019-10-18 16:26:59 +09004037 vndk_prebuilt_shared {
4038 name: "libvndk27",
4039 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004040 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004041 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004042 vndk: {
4043 enabled: true,
4044 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 target_arch: "arm64",
4046 arch: {
4047 arm: {
4048 srcs: ["libvndk27_arm.so"],
4049 },
4050 arm64: {
4051 srcs: ["libvndk27_arm64.so"],
4052 },
4053 },
Colin Cross2807f002021-03-02 10:15:29 -08004054 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004055 }
4056
4057 vndk_prebuilt_shared {
4058 name: "libvndk27",
4059 version: "27",
4060 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004061 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004062 vndk: {
4063 enabled: true,
4064 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 target_arch: "x86_64",
4066 arch: {
4067 x86: {
4068 srcs: ["libvndk27_x86.so"],
4069 },
4070 x86_64: {
4071 srcs: ["libvndk27_x86_64.so"],
4072 },
4073 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004074 }
4075 `+vndkLibrariesTxtFiles("27"),
4076 withFiles(map[string][]byte{
4077 "libvndk27_arm.so": nil,
4078 "libvndk27_arm64.so": nil,
4079 "libvndk27_x86.so": nil,
4080 "libvndk27_x86_64.so": nil,
4081 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004082
Jooyung Hana0503a52023-08-23 13:12:50 +09004083 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 "lib/libvndk27_arm.so",
4085 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004086 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 })
Jooyung Han344d5432019-08-23 11:17:39 +09004088}
4089
Jooyung Han90eee022019-10-01 20:02:42 +09004090func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004091 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004092 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004093 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004094 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004095 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004096 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004097 }
4098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004100 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004102 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004103 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004104 }
4105 apex_key {
4106 name: "myapex.key",
4107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004109 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004110
4111 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004112 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004113 apexManifestRule := module.Rule("apexManifestRule")
4114 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004115 }
4116
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004117 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004118 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004119}
4120
Jooyung Han344d5432019-08-23 11:17:39 +09004121func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004122 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004123 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004124 name: "com.android.vndk.current",
4125 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004126 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004127 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004128 }
4129
4130 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004131 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004132 public_key: "testkey.avbpubkey",
4133 private_key: "testkey.pem",
4134 }
4135
4136 cc_library {
4137 name: "libvndk",
4138 srcs: ["mylib.cpp"],
4139 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004140 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004141 native_bridge_supported: true,
4142 host_supported: true,
4143 vndk: {
4144 enabled: true,
4145 },
4146 system_shared_libs: [],
4147 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004148 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004149 }
Colin Cross2807f002021-03-02 10:15:29 -08004150 `+vndkLibrariesTxtFiles("current"),
4151 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004152
Jooyung Hana0503a52023-08-23 13:12:50 +09004153 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004154 "lib/libvndk.so",
4155 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004156 "lib/libc++.so",
4157 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004158 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004159 })
Jooyung Han344d5432019-08-23 11:17:39 +09004160}
4161
4162func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004163 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004164 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004165 name: "com.android.vndk.current",
4166 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004167 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004168 native_bridge_supported: true,
4169 }
4170
4171 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004172 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004173 public_key: "testkey.avbpubkey",
4174 private_key: "testkey.pem",
4175 }
4176
4177 cc_library {
4178 name: "libvndk",
4179 srcs: ["mylib.cpp"],
4180 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004181 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004182 native_bridge_supported: true,
4183 host_supported: true,
4184 vndk: {
4185 enabled: true,
4186 },
4187 system_shared_libs: [],
4188 stl: "none",
4189 }
4190 `)
4191}
4192
Jooyung Han31c470b2019-10-18 16:26:59 +09004193func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004194 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004195 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004196 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004197 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004198 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004199 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004200 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004201 }
4202
4203 apex_key {
4204 name: "myapex.key",
4205 public_key: "testkey.avbpubkey",
4206 private_key: "testkey.pem",
4207 }
4208
4209 vndk_prebuilt_shared {
4210 name: "libvndk27",
4211 version: "27",
4212 target_arch: "arm",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004215 vndk: {
4216 enabled: true,
4217 },
4218 arch: {
4219 arm: {
4220 srcs: ["libvndk27.so"],
4221 }
4222 },
4223 }
4224
4225 vndk_prebuilt_shared {
4226 name: "libvndk27",
4227 version: "27",
4228 target_arch: "arm",
4229 binder32bit: true,
4230 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004231 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004232 vndk: {
4233 enabled: true,
4234 },
4235 arch: {
4236 arm: {
4237 srcs: ["libvndk27binder32.so"],
4238 }
4239 },
Colin Cross2807f002021-03-02 10:15:29 -08004240 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004241 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004242 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004243 withFiles(map[string][]byte{
4244 "libvndk27.so": nil,
4245 "libvndk27binder32.so": nil,
4246 }),
4247 withBinder32bit,
4248 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004249 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004250 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4251 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004252 },
4253 }),
4254 )
4255
Jooyung Hana0503a52023-08-23 13:12:50 +09004256 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004257 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004258 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004259 })
4260}
4261
Jooyung Han45a96772020-06-15 14:59:42 +09004262func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004263 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004264 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004265 name: "com.android.vndk.current",
4266 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004267 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004268 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004269 }
4270
4271 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004272 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004273 public_key: "testkey.avbpubkey",
4274 private_key: "testkey.pem",
4275 }
4276
4277 cc_library {
4278 name: "libz",
4279 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004280 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004281 vndk: {
4282 enabled: true,
4283 },
4284 stubs: {
4285 symbol_file: "libz.map.txt",
4286 versions: ["30"],
4287 }
4288 }
4289 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4290 "libz.map.txt": nil,
4291 }))
4292
Jooyung Hana0503a52023-08-23 13:12:50 +09004293 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004294 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4295 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004296 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004297 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4298 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4299 "*/*",
4300 })
Jooyung Han45a96772020-06-15 14:59:42 +09004301}
4302
Jooyung Hane3f02812023-05-08 13:54:50 +09004303func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4304 ctx := testApex(t, "",
4305 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4306 variables.DeviceVndkVersion = proptools.StringPtr("27")
4307 }),
4308 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4309 cc.RegisterVendorSnapshotModules(ctx)
4310 }),
4311 withFiles(map[string][]byte{
4312 "vendor/foo/Android.bp": []byte(`
4313 apex {
4314 name: "myapex",
4315 binaries: ["foo"],
4316 key: "myapex.key",
4317 min_sdk_version: "27",
4318 vendor: true,
4319 }
4320
4321 cc_binary {
4322 name: "foo",
4323 vendor: true,
4324 srcs: ["abc.cpp"],
4325 shared_libs: [
4326 "libllndk",
4327 "libvndk",
4328 ],
4329 nocrt: true,
4330 system_shared_libs: [],
4331 min_sdk_version: "27",
4332 }
4333
4334 apex_key {
4335 name: "myapex.key",
4336 public_key: "testkey.avbpubkey",
4337 private_key: "testkey.pem",
4338 }
4339 `),
4340 // Simulate VNDK prebuilts with vendor_snapshot
4341 "prebuilts/vndk/Android.bp": []byte(`
4342 vndk_prebuilt_shared {
4343 name: "libllndk",
4344 version: "27",
4345 vendor_available: true,
4346 product_available: true,
4347 target_arch: "arm64",
4348 arch: {
4349 arm64: {
4350 srcs: ["libllndk.so"],
4351 },
4352 },
4353 }
4354
4355 vndk_prebuilt_shared {
4356 name: "libvndk",
4357 version: "27",
4358 vendor_available: true,
4359 product_available: true,
4360 target_arch: "arm64",
4361 arch: {
4362 arm64: {
4363 srcs: ["libvndk.so"],
4364 },
4365 },
4366 vndk: {
4367 enabled: true,
4368 },
4369 min_sdk_version: "27",
4370 }
4371
4372 vndk_prebuilt_shared {
4373 name: "libc++",
4374 version: "27",
4375 target_arch: "arm64",
4376 vendor_available: true,
4377 product_available: true,
4378 vndk: {
4379 enabled: true,
4380 support_system_process: true,
4381 },
4382 arch: {
4383 arm64: {
4384 srcs: ["libc++.so"],
4385 },
4386 },
4387 min_sdk_version: "apex_inherit",
4388 }
4389
4390 vendor_snapshot {
4391 name: "vendor_snapshot",
4392 version: "27",
4393 arch: {
4394 arm64: {
4395 vndk_libs: [
4396 "libc++",
4397 "libllndk",
4398 "libvndk",
4399 ],
4400 static_libs: [
4401 "libc++demangle",
4402 "libclang_rt.builtins",
4403 "libunwind",
4404 ],
4405 },
4406 }
4407 }
4408
4409 vendor_snapshot_static {
4410 name: "libclang_rt.builtins",
4411 version: "27",
4412 target_arch: "arm64",
4413 vendor: true,
4414 arch: {
4415 arm64: {
4416 src: "libclang_rt.builtins-aarch64-android.a",
4417 },
4418 },
4419 }
4420
4421 vendor_snapshot_static {
4422 name: "libc++demangle",
4423 version: "27",
4424 target_arch: "arm64",
4425 compile_multilib: "64",
4426 vendor: true,
4427 arch: {
4428 arm64: {
4429 src: "libc++demangle.a",
4430 },
4431 },
4432 min_sdk_version: "apex_inherit",
4433 }
4434
4435 vendor_snapshot_static {
4436 name: "libunwind",
4437 version: "27",
4438 target_arch: "arm64",
4439 compile_multilib: "64",
4440 vendor: true,
4441 arch: {
4442 arm64: {
4443 src: "libunwind.a",
4444 },
4445 },
4446 min_sdk_version: "apex_inherit",
4447 }
4448 `),
4449 }))
4450
4451 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004452 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004453 "bin/foo",
4454 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4455 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4456 })
4457
4458 // Should link foo with prebuilt libraries (shared/static)
4459 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4460 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4461 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4462 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4463 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4464
4465 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004466 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004467 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4468 ensureListContains(t, requireNativeLibs, "libllndk.so")
4469}
4470
Jooyung Hane1633032019-08-01 17:41:43 +09004471func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004472 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004473 apex {
4474 name: "myapex_nodep",
4475 key: "myapex.key",
4476 native_shared_libs: ["lib_nodep"],
4477 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004478 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004479 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004480 }
4481
4482 apex {
4483 name: "myapex_dep",
4484 key: "myapex.key",
4485 native_shared_libs: ["lib_dep"],
4486 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004487 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004488 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004489 }
4490
4491 apex {
4492 name: "myapex_provider",
4493 key: "myapex.key",
4494 native_shared_libs: ["libfoo"],
4495 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004496 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004497 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004498 }
4499
4500 apex {
4501 name: "myapex_selfcontained",
4502 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004503 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004504 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004505 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004506 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004507 }
4508
4509 apex_key {
4510 name: "myapex.key",
4511 public_key: "testkey.avbpubkey",
4512 private_key: "testkey.pem",
4513 }
4514
4515 cc_library {
4516 name: "lib_nodep",
4517 srcs: ["mylib.cpp"],
4518 system_shared_libs: [],
4519 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004520 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004521 }
4522
4523 cc_library {
4524 name: "lib_dep",
4525 srcs: ["mylib.cpp"],
4526 shared_libs: ["libfoo"],
4527 system_shared_libs: [],
4528 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004529 apex_available: [
4530 "myapex_dep",
4531 "myapex_provider",
4532 "myapex_selfcontained",
4533 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004534 }
4535
4536 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004537 name: "lib_dep_on_bar",
4538 srcs: ["mylib.cpp"],
4539 shared_libs: ["libbar"],
4540 system_shared_libs: [],
4541 stl: "none",
4542 apex_available: [
4543 "myapex_selfcontained",
4544 ],
4545 }
4546
4547
4548 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004549 name: "libfoo",
4550 srcs: ["mytest.cpp"],
4551 stubs: {
4552 versions: ["1"],
4553 },
4554 system_shared_libs: [],
4555 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004556 apex_available: [
4557 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004558 ],
4559 }
4560
4561 cc_library {
4562 name: "libbar",
4563 srcs: ["mytest.cpp"],
4564 stubs: {
4565 versions: ["1"],
4566 },
4567 system_shared_libs: [],
4568 stl: "none",
4569 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004570 "myapex_selfcontained",
4571 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004572 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004573
Jooyung Hane1633032019-08-01 17:41:43 +09004574 `)
4575
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004576 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004577 var provideNativeLibs, requireNativeLibs []string
4578
Jooyung Hana0503a52023-08-23 13:12:50 +09004579 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004580 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4581 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004582 ensureListEmpty(t, provideNativeLibs)
4583 ensureListEmpty(t, requireNativeLibs)
4584
Jooyung Hana0503a52023-08-23 13:12:50 +09004585 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004586 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4587 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004588 ensureListEmpty(t, provideNativeLibs)
4589 ensureListContains(t, requireNativeLibs, "libfoo.so")
4590
Jooyung Hana0503a52023-08-23 13:12:50 +09004591 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004592 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4593 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004594 ensureListContains(t, provideNativeLibs, "libfoo.so")
4595 ensureListEmpty(t, requireNativeLibs)
4596
Jooyung Hana0503a52023-08-23 13:12:50 +09004597 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004598 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4599 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004600 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004601 ensureListEmpty(t, requireNativeLibs)
4602}
4603
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004604func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4605 ctx := testApex(t, `
4606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004609 native_shared_libs: ["mylib"],
4610 updatable: false,
4611 }
4612
4613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
4618
4619 cc_library {
4620 name: "mylib",
4621 srcs: ["mylib.cpp"],
4622 system_shared_libs: [],
4623 stl: "none",
4624 apex_available: [
4625 "//apex_available:platform",
4626 "myapex",
4627 ],
4628 }
4629 `, android.FixtureMergeEnv(map[string]string{
4630 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4631 }))
4632
Jooyung Hana0503a52023-08-23 13:12:50 +09004633 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004634 apexManifestRule := module.Rule("apexManifestRule")
4635 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4636}
4637
Vinh Tran8f5310f2022-10-07 18:16:47 -04004638func TestCompileMultilibProp(t *testing.T) {
4639 testCases := []struct {
4640 compileMultiLibProp string
4641 containedLibs []string
4642 notContainedLibs []string
4643 }{
4644 {
4645 containedLibs: []string{
4646 "image.apex/lib64/mylib.so",
4647 "image.apex/lib/mylib.so",
4648 },
4649 compileMultiLibProp: `compile_multilib: "both",`,
4650 },
4651 {
4652 containedLibs: []string{"image.apex/lib64/mylib.so"},
4653 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4654 compileMultiLibProp: `compile_multilib: "first",`,
4655 },
4656 {
4657 containedLibs: []string{"image.apex/lib64/mylib.so"},
4658 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4659 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4660 },
4661 {
4662 containedLibs: []string{"image.apex/lib64/mylib.so"},
4663 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4664 compileMultiLibProp: `compile_multilib: "64",`,
4665 },
4666 {
4667 containedLibs: []string{"image.apex/lib/mylib.so"},
4668 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4669 compileMultiLibProp: `compile_multilib: "32",`,
4670 },
4671 }
4672 for _, testCase := range testCases {
4673 ctx := testApex(t, fmt.Sprintf(`
4674 apex {
4675 name: "myapex",
4676 key: "myapex.key",
4677 %s
4678 native_shared_libs: ["mylib"],
4679 updatable: false,
4680 }
4681 apex_key {
4682 name: "myapex.key",
4683 public_key: "testkey.avbpubkey",
4684 private_key: "testkey.pem",
4685 }
4686 cc_library {
4687 name: "mylib",
4688 srcs: ["mylib.cpp"],
4689 apex_available: [
4690 "//apex_available:platform",
4691 "myapex",
4692 ],
4693 }
4694 `, testCase.compileMultiLibProp),
4695 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004696 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004697 apexRule := module.Rule("apexRule")
4698 copyCmds := apexRule.Args["copy_commands"]
4699 for _, containedLib := range testCase.containedLibs {
4700 ensureContains(t, copyCmds, containedLib)
4701 }
4702 for _, notContainedLib := range testCase.notContainedLibs {
4703 ensureNotContains(t, copyCmds, notContainedLib)
4704 }
4705 }
4706}
4707
Alex Light0851b882019-02-07 13:20:53 -08004708func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004709 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
4713 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004714 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004715 }
4716
4717 apex_key {
4718 name: "myapex.key",
4719 public_key: "testkey.avbpubkey",
4720 private_key: "testkey.pem",
4721 }
4722
4723 cc_library {
4724 name: "mylib_common",
4725 srcs: ["mylib.cpp"],
4726 system_shared_libs: [],
4727 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004728 apex_available: [
4729 "//apex_available:platform",
4730 "myapex",
4731 ],
Alex Light0851b882019-02-07 13:20:53 -08004732 }
4733 `)
4734
Jooyung Hana0503a52023-08-23 13:12:50 +09004735 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004736 apexRule := module.Rule("apexRule")
4737 copyCmds := apexRule.Args["copy_commands"]
4738
4739 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4740 t.Log("Apex was a test apex!")
4741 t.Fail()
4742 }
4743 // Ensure that main rule creates an output
4744 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4745
4746 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004747 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004748
4749 // Ensure that both direct and indirect deps are copied into apex
4750 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4751
Colin Cross7113d202019-11-20 16:39:12 -08004752 // Ensure that the platform variant ends with _shared
4753 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004754
Colin Cross56a83212020-09-15 18:30:11 -07004755 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004756 t.Log("Found mylib_common not in any apex!")
4757 t.Fail()
4758 }
4759}
4760
4761func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004762 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004763 apex_test {
4764 name: "myapex",
4765 key: "myapex.key",
4766 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004767 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004768 }
4769
4770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775
4776 cc_library {
4777 name: "mylib_common_test",
4778 srcs: ["mylib.cpp"],
4779 system_shared_libs: [],
4780 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004781 // TODO: remove //apex_available:platform
4782 apex_available: [
4783 "//apex_available:platform",
4784 "myapex",
4785 ],
Alex Light0851b882019-02-07 13:20:53 -08004786 }
4787 `)
4788
Jooyung Hana0503a52023-08-23 13:12:50 +09004789 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004790 apexRule := module.Rule("apexRule")
4791 copyCmds := apexRule.Args["copy_commands"]
4792
4793 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4794 t.Log("Apex was not a test apex!")
4795 t.Fail()
4796 }
4797 // Ensure that main rule creates an output
4798 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4799
4800 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004802
4803 // Ensure that both direct and indirect deps are copied into apex
4804 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4805
Colin Cross7113d202019-11-20 16:39:12 -08004806 // Ensure that the platform variant ends with _shared
4807 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004808}
4809
Jooyung Han85707de2023-12-01 14:21:13 +09004810func TestLibzVendorIsntStable(t *testing.T) {
4811 ctx := testApex(t, `
4812 apex {
4813 name: "myapex",
4814 key: "myapex.key",
4815 updatable: false,
4816 binaries: ["mybin"],
4817 }
4818 apex {
4819 name: "myvendorapex",
4820 key: "myapex.key",
4821 file_contexts: "myvendorapex_file_contexts",
4822 vendor: true,
4823 updatable: false,
4824 binaries: ["mybin"],
4825 }
4826 apex_key {
4827 name: "myapex.key",
4828 public_key: "testkey.avbpubkey",
4829 private_key: "testkey.pem",
4830 }
4831 cc_binary {
4832 name: "mybin",
4833 vendor_available: true,
4834 system_shared_libs: [],
4835 stl: "none",
4836 shared_libs: ["libz"],
4837 apex_available: ["//apex_available:anyapex"],
4838 }
4839 cc_library {
4840 name: "libz",
4841 vendor_available: true,
4842 system_shared_libs: [],
4843 stl: "none",
4844 stubs: {
4845 versions: ["28", "30"],
4846 },
4847 target: {
4848 vendor: {
4849 no_stubs: true,
4850 },
4851 },
4852 }
4853 `, withFiles(map[string][]byte{
4854 "myvendorapex_file_contexts": nil,
4855 }))
4856
4857 // libz provides stubs for core variant.
4858 {
4859 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4860 "bin/mybin",
4861 })
4862 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4863 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4864 }
4865 // libz doesn't provide stubs for vendor variant.
4866 {
4867 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4868 "bin/mybin",
4869 "lib64/libz.so",
4870 })
4871 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4872 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4873 }
4874}
4875
Alex Light9670d332019-01-29 18:07:33 -08004876func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004877 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004878 apex {
4879 name: "myapex",
4880 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004881 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004882 multilib: {
4883 first: {
4884 native_shared_libs: ["mylib_common"],
4885 }
4886 },
4887 target: {
4888 android: {
4889 multilib: {
4890 first: {
4891 native_shared_libs: ["mylib"],
4892 }
4893 }
4894 },
4895 host: {
4896 multilib: {
4897 first: {
4898 native_shared_libs: ["mylib2"],
4899 }
4900 }
4901 }
4902 }
4903 }
4904
4905 apex_key {
4906 name: "myapex.key",
4907 public_key: "testkey.avbpubkey",
4908 private_key: "testkey.pem",
4909 }
4910
4911 cc_library {
4912 name: "mylib",
4913 srcs: ["mylib.cpp"],
4914 system_shared_libs: [],
4915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004916 // TODO: remove //apex_available:platform
4917 apex_available: [
4918 "//apex_available:platform",
4919 "myapex",
4920 ],
Alex Light9670d332019-01-29 18:07:33 -08004921 }
4922
4923 cc_library {
4924 name: "mylib_common",
4925 srcs: ["mylib.cpp"],
4926 system_shared_libs: [],
4927 stl: "none",
4928 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004929 // TODO: remove //apex_available:platform
4930 apex_available: [
4931 "//apex_available:platform",
4932 "myapex",
4933 ],
Alex Light9670d332019-01-29 18:07:33 -08004934 }
4935
4936 cc_library {
4937 name: "mylib2",
4938 srcs: ["mylib.cpp"],
4939 system_shared_libs: [],
4940 stl: "none",
4941 compile_multilib: "first",
4942 }
4943 `)
4944
Jooyung Hana0503a52023-08-23 13:12:50 +09004945 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004946 copyCmds := apexRule.Args["copy_commands"]
4947
4948 // Ensure that main rule creates an output
4949 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4950
4951 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004952 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4953 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4954 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004955
4956 // Ensure that both direct and indirect deps are copied into apex
4957 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4958 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4960
Colin Cross7113d202019-11-20 16:39:12 -08004961 // Ensure that the platform variant ends with _shared
4962 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4964 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004965}
Jiyong Park04480cf2019-02-06 00:16:29 +09004966
Jiyong Park59140302020-12-14 18:44:04 +09004967func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004968 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004969 apex {
4970 name: "myapex",
4971 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004972 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004973 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004974 arch: {
4975 arm64: {
4976 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004977 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004978 },
4979 x86_64: {
4980 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004981 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004982 },
4983 }
4984 }
4985
4986 apex_key {
4987 name: "myapex.key",
4988 public_key: "testkey.avbpubkey",
4989 private_key: "testkey.pem",
4990 }
4991
4992 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004993 name: "mylib.generic",
4994 srcs: ["mylib.cpp"],
4995 system_shared_libs: [],
4996 stl: "none",
4997 // TODO: remove //apex_available:platform
4998 apex_available: [
4999 "//apex_available:platform",
5000 "myapex",
5001 ],
5002 }
5003
5004 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09005005 name: "mylib.arm64",
5006 srcs: ["mylib.cpp"],
5007 system_shared_libs: [],
5008 stl: "none",
5009 // TODO: remove //apex_available:platform
5010 apex_available: [
5011 "//apex_available:platform",
5012 "myapex",
5013 ],
5014 }
5015
5016 cc_library {
5017 name: "mylib.x64",
5018 srcs: ["mylib.cpp"],
5019 system_shared_libs: [],
5020 stl: "none",
5021 // TODO: remove //apex_available:platform
5022 apex_available: [
5023 "//apex_available:platform",
5024 "myapex",
5025 ],
5026 }
5027 `)
5028
Jooyung Hana0503a52023-08-23 13:12:50 +09005029 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09005030 copyCmds := apexRule.Args["copy_commands"]
5031
5032 // Ensure that apex variant is created for the direct dep
5033 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07005034 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09005035 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
5036
5037 // Ensure that both direct and indirect deps are copied into apex
5038 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
5039 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
5040}
5041
Jiyong Park04480cf2019-02-06 00:16:29 +09005042func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005043 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09005044 apex {
5045 name: "myapex",
5046 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00005047 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005048 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00005049 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09005050 }
5051
5052 apex_key {
5053 name: "myapex.key",
5054 public_key: "testkey.avbpubkey",
5055 private_key: "testkey.pem",
5056 }
5057
5058 sh_binary {
5059 name: "myscript",
5060 src: "mylib.cpp",
5061 filename: "myscript.sh",
5062 sub_dir: "script",
5063 }
5064 `)
5065
Jooyung Hana0503a52023-08-23 13:12:50 +09005066 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09005067 copyCmds := apexRule.Args["copy_commands"]
5068
5069 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
5070}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005071
Jooyung Han91df2082019-11-20 01:49:42 +09005072func TestApexInVariousPartition(t *testing.T) {
5073 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005074 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005075 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005076 {"", "system"},
5077 {"product_specific: true", "product"},
5078 {"soc_specific: true", "vendor"},
5079 {"proprietary: true", "vendor"},
5080 {"vendor: true", "vendor"},
5081 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005082 }
5083 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005084 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005085 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005086 apex {
5087 name: "myapex",
5088 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005089 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005090 `+tc.propName+`
5091 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005092
Jooyung Han91df2082019-11-20 01:49:42 +09005093 apex_key {
5094 name: "myapex.key",
5095 public_key: "testkey.avbpubkey",
5096 private_key: "testkey.pem",
5097 }
5098 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005099
Jooyung Hana0503a52023-08-23 13:12:50 +09005100 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005101 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005102 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005103 if actual != expected {
5104 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5105 }
Jooyung Han91df2082019-11-20 01:49:42 +09005106 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005107 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005108}
Jiyong Park67882562019-03-21 01:11:21 +09005109
Jooyung Han580eb4f2020-06-24 19:33:06 +09005110func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005111 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 apex {
5113 name: "myapex",
5114 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005115 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005117
Jooyung Han580eb4f2020-06-24 19:33:06 +09005118 apex_key {
5119 name: "myapex.key",
5120 public_key: "testkey.avbpubkey",
5121 private_key: "testkey.pem",
5122 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005123 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005124 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 rule := module.Output("file_contexts")
5126 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5127}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005128
Jooyung Han580eb4f2020-06-24 19:33:06 +09005129func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005130 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005131 apex {
5132 name: "myapex",
5133 key: "myapex.key",
5134 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005135 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005136 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005137
Jooyung Han580eb4f2020-06-24 19:33:06 +09005138 apex_key {
5139 name: "myapex.key",
5140 public_key: "testkey.avbpubkey",
5141 private_key: "testkey.pem",
5142 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005143 `, withFiles(map[string][]byte{
5144 "my_own_file_contexts": nil,
5145 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005146}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005147
Jooyung Han580eb4f2020-06-24 19:33:06 +09005148func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005149 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005150 apex {
5151 name: "myapex",
5152 key: "myapex.key",
5153 product_specific: true,
5154 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005155 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005156 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005157
Jooyung Han580eb4f2020-06-24 19:33:06 +09005158 apex_key {
5159 name: "myapex.key",
5160 public_key: "testkey.avbpubkey",
5161 private_key: "testkey.pem",
5162 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005163 `)
5164
Colin Cross1c460562021-02-16 17:55:47 -08005165 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005166 apex {
5167 name: "myapex",
5168 key: "myapex.key",
5169 product_specific: true,
5170 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005171 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005172 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005173
Jooyung Han580eb4f2020-06-24 19:33:06 +09005174 apex_key {
5175 name: "myapex.key",
5176 public_key: "testkey.avbpubkey",
5177 private_key: "testkey.pem",
5178 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005179 `, withFiles(map[string][]byte{
5180 "product_specific_file_contexts": nil,
5181 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005182 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005183 rule := module.Output("file_contexts")
5184 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5185}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005186
Jooyung Han580eb4f2020-06-24 19:33:06 +09005187func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005188 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005189 apex {
5190 name: "myapex",
5191 key: "myapex.key",
5192 product_specific: true,
5193 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005194 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005195 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005196
Jooyung Han580eb4f2020-06-24 19:33:06 +09005197 apex_key {
5198 name: "myapex.key",
5199 public_key: "testkey.avbpubkey",
5200 private_key: "testkey.pem",
5201 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005202
Jooyung Han580eb4f2020-06-24 19:33:06 +09005203 filegroup {
5204 name: "my-file-contexts",
5205 srcs: ["product_specific_file_contexts"],
5206 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005207 `, withFiles(map[string][]byte{
5208 "product_specific_file_contexts": nil,
5209 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005210 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005211 rule := module.Output("file_contexts")
5212 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005213}
5214
Jiyong Park67882562019-03-21 01:11:21 +09005215func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005217 apex_key {
5218 name: "myapex.key",
5219 public_key: ":my.avbpubkey",
5220 private_key: ":my.pem",
5221 product_specific: true,
5222 }
5223
5224 filegroup {
5225 name: "my.avbpubkey",
5226 srcs: ["testkey2.avbpubkey"],
5227 }
5228
5229 filegroup {
5230 name: "my.pem",
5231 srcs: ["testkey2.pem"],
5232 }
5233 `)
5234
5235 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5236 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005237 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005238 if actual_pubkey != expected_pubkey {
5239 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5240 }
5241 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005242 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005243 if actual_privkey != expected_privkey {
5244 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5245 }
5246}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005247
5248func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005249 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005250 prebuilt_apex {
5251 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005252 arch: {
5253 arm64: {
5254 src: "myapex-arm64.apex",
5255 },
5256 arm: {
5257 src: "myapex-arm.apex",
5258 },
5259 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005260 }
5261 `)
5262
Wei Li340ee8e2022-03-18 17:33:24 -07005263 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5264 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005265
Jiyong Parkc95714e2019-03-29 14:23:10 +09005266 expectedInput := "myapex-arm64.apex"
5267 if prebuilt.inputApex.String() != expectedInput {
5268 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5269 }
Wei Li340ee8e2022-03-18 17:33:24 -07005270 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5271 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5272 rule := testingModule.Rule("genProvenanceMetaData")
5273 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5274 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5275 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5276 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005277
5278 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5279 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005280}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005281
Paul Duffinc0609c62021-03-01 17:27:16 +00005282func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005283 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005284 prebuilt_apex {
5285 name: "myapex",
5286 }
5287 `)
5288}
5289
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005290func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005291 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005292 prebuilt_apex {
5293 name: "myapex",
5294 src: "myapex-arm.apex",
5295 filename: "notmyapex.apex",
5296 }
5297 `)
5298
Wei Li340ee8e2022-03-18 17:33:24 -07005299 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5300 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005301
5302 expected := "notmyapex.apex"
5303 if p.installFilename != expected {
5304 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5305 }
Wei Li340ee8e2022-03-18 17:33:24 -07005306 rule := testingModule.Rule("genProvenanceMetaData")
5307 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5308 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5309 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5310 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005311}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005312
Samiul Islam7c02e262021-09-08 17:48:28 +01005313func TestApexSetFilenameOverride(t *testing.T) {
5314 testApex(t, `
5315 apex_set {
5316 name: "com.company.android.myapex",
5317 apex_name: "com.android.myapex",
5318 set: "company-myapex.apks",
5319 filename: "com.company.android.myapex.apex"
5320 }
5321 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5322
5323 testApex(t, `
5324 apex_set {
5325 name: "com.company.android.myapex",
5326 apex_name: "com.android.myapex",
5327 set: "company-myapex.apks",
5328 filename: "com.company.android.myapex.capex"
5329 }
5330 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5331
5332 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5333 apex_set {
5334 name: "com.company.android.myapex",
5335 apex_name: "com.android.myapex",
5336 set: "company-myapex.apks",
5337 filename: "some-random-suffix"
5338 }
5339 `)
5340}
5341
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005342func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005343 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005344 prebuilt_apex {
5345 name: "myapex.prebuilt",
5346 src: "myapex-arm.apex",
5347 overrides: [
5348 "myapex",
5349 ],
5350 }
5351 `)
5352
Wei Li340ee8e2022-03-18 17:33:24 -07005353 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5354 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005355
5356 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005357 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005358 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005359 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005360 }
Wei Li340ee8e2022-03-18 17:33:24 -07005361 rule := testingModule.Rule("genProvenanceMetaData")
5362 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5363 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5364 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5365 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005366}
5367
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005368func TestPrebuiltApexName(t *testing.T) {
5369 testApex(t, `
5370 prebuilt_apex {
5371 name: "com.company.android.myapex",
5372 apex_name: "com.android.myapex",
5373 src: "company-myapex-arm.apex",
5374 }
5375 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5376
5377 testApex(t, `
5378 apex_set {
5379 name: "com.company.android.myapex",
5380 apex_name: "com.android.myapex",
5381 set: "company-myapex.apks",
5382 }
5383 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5384}
5385
5386func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5387 _ = android.GroupFixturePreparers(
5388 java.PrepareForTestWithJavaDefaultModules,
5389 PrepareForTestWithApexBuildComponents,
5390 android.FixtureWithRootAndroidBp(`
5391 platform_bootclasspath {
5392 name: "platform-bootclasspath",
5393 fragments: [
5394 {
5395 apex: "com.android.art",
5396 module: "art-bootclasspath-fragment",
5397 },
5398 ],
5399 }
5400
5401 prebuilt_apex {
5402 name: "com.company.android.art",
5403 apex_name: "com.android.art",
5404 src: "com.company.android.art-arm.apex",
5405 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5406 }
5407
5408 prebuilt_bootclasspath_fragment {
5409 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005410 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005411 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005412 hidden_api: {
5413 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5414 metadata: "my-bootclasspath-fragment/metadata.csv",
5415 index: "my-bootclasspath-fragment/index.csv",
5416 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5417 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5418 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005419 }
5420
5421 java_import {
5422 name: "core-oj",
5423 jars: ["prebuilt.jar"],
5424 }
5425 `),
5426 ).RunTest(t)
5427}
5428
Spandan Das59a4a2b2024-01-09 21:35:56 +00005429// A minimal context object for use with DexJarBuildPath
5430type moduleErrorfTestCtx struct {
5431}
5432
5433func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5434}
5435
Paul Duffin092153d2021-01-26 11:42:39 +00005436// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5437// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005438func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005439 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005440
Paul Duffin89886cb2021-02-05 16:44:03 +00005441 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005442 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005443 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005444 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005445 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005446 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005447 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005448 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 android.NormalizePathForTesting(dexJarBuildPath))
5450 }
5451
5452 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005453 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005454 // Make sure the import has been given the correct path to the dex jar.
5455 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5456 dexJarBuildPath := p.DexJarInstallPath()
5457 stem := android.RemoveOptionalPrebuiltPrefix(name)
5458 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5459 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5460 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005461 }
5462
Paul Duffin39853512021-02-26 11:09:39 +00005463 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005464 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005465 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005466 android.AssertArrayString(t, "Check if there is no source variant",
5467 []string{"android_common"},
5468 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005469 }
5470
5471 t.Run("prebuilt only", func(t *testing.T) {
5472 bp := `
5473 prebuilt_apex {
5474 name: "myapex",
5475 arch: {
5476 arm64: {
5477 src: "myapex-arm64.apex",
5478 },
5479 arm: {
5480 src: "myapex-arm.apex",
5481 },
5482 },
Paul Duffin39853512021-02-26 11:09:39 +00005483 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005484 }
5485
5486 java_import {
5487 name: "libfoo",
5488 jars: ["libfoo.jar"],
5489 }
Paul Duffin39853512021-02-26 11:09:39 +00005490
5491 java_sdk_library_import {
5492 name: "libbar",
5493 public: {
5494 jars: ["libbar.jar"],
5495 },
5496 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005497 `
5498
5499 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5500 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5501
Spandan Das3576e762024-01-03 18:57:03 +00005502 deapexerName := deapexerModuleName("prebuilt_myapex")
5503 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005504
Paul Duffinf6932af2021-02-26 18:21:56 +00005505 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005506 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005507 rule := deapexer.Rule("deapexer")
5508 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5509 t.Errorf("expected: %q, found: %q", expected, actual)
5510 }
5511
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005512 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005513 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005514 rule = prebuiltApex.Rule("android/soong/android.Cp")
5515 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5516 t.Errorf("expected: %q, found: %q", expected, actual)
5517 }
5518
Paul Duffin89886cb2021-02-05 16:44:03 +00005519 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005520 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005521
5522 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005523 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005524 })
5525
5526 t.Run("prebuilt with source preferred", func(t *testing.T) {
5527
5528 bp := `
5529 prebuilt_apex {
5530 name: "myapex",
5531 arch: {
5532 arm64: {
5533 src: "myapex-arm64.apex",
5534 },
5535 arm: {
5536 src: "myapex-arm.apex",
5537 },
5538 },
Paul Duffin39853512021-02-26 11:09:39 +00005539 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005540 }
5541
5542 java_import {
5543 name: "libfoo",
5544 jars: ["libfoo.jar"],
5545 }
5546
5547 java_library {
5548 name: "libfoo",
5549 }
Paul Duffin39853512021-02-26 11:09:39 +00005550
5551 java_sdk_library_import {
5552 name: "libbar",
5553 public: {
5554 jars: ["libbar.jar"],
5555 },
5556 }
5557
5558 java_sdk_library {
5559 name: "libbar",
5560 srcs: ["foo/bar/MyClass.java"],
5561 unsafe_ignore_missing_latest_api: true,
5562 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005563 `
5564
5565 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5566 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5567
Paul Duffin89886cb2021-02-05 16:44:03 +00005568 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005569 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005570 ensureNoSourceVariant(t, ctx, "libfoo")
5571
5572 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005573 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005574 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005575 })
5576
5577 t.Run("prebuilt preferred with source", func(t *testing.T) {
5578 bp := `
5579 prebuilt_apex {
5580 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005581 arch: {
5582 arm64: {
5583 src: "myapex-arm64.apex",
5584 },
5585 arm: {
5586 src: "myapex-arm.apex",
5587 },
5588 },
Paul Duffin39853512021-02-26 11:09:39 +00005589 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005590 }
5591
5592 java_import {
5593 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005594 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005595 jars: ["libfoo.jar"],
5596 }
5597
5598 java_library {
5599 name: "libfoo",
5600 }
Paul Duffin39853512021-02-26 11:09:39 +00005601
5602 java_sdk_library_import {
5603 name: "libbar",
5604 prefer: true,
5605 public: {
5606 jars: ["libbar.jar"],
5607 },
5608 }
5609
5610 java_sdk_library {
5611 name: "libbar",
5612 srcs: ["foo/bar/MyClass.java"],
5613 unsafe_ignore_missing_latest_api: true,
5614 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005615 `
5616
5617 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5618 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5619
Paul Duffin89886cb2021-02-05 16:44:03 +00005620 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005621 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005622 ensureNoSourceVariant(t, ctx, "libfoo")
5623
5624 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005625 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005626 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005627 })
5628}
5629
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005630func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005631 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005632 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005633 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5634 // is disabled.
5635 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5636 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005637
Paul Duffin37856732021-02-26 14:24:15 +00005638 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5639 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005640 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005641 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005642 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005644 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 foundLibfooJar = true
5646 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005647 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005648 }
5649 }
5650 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005651 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 }
5653 }
5654
Paul Duffin40a3f652021-07-19 13:11:24 +01005655 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005656 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005657 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005658 var rule android.TestingBuildParams
5659
5660 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5661 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005662 }
5663
Paul Duffin40a3f652021-07-19 13:11:24 +01005664 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5665 t.Helper()
5666 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5667 var rule android.TestingBuildParams
5668
5669 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5670 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5671 }
5672
Paul Duffin89f570a2021-06-16 01:42:33 +01005673 fragment := java.ApexVariantReference{
5674 Apex: proptools.StringPtr("myapex"),
5675 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5676 }
5677
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005678 t.Run("prebuilt only", func(t *testing.T) {
5679 bp := `
5680 prebuilt_apex {
5681 name: "myapex",
5682 arch: {
5683 arm64: {
5684 src: "myapex-arm64.apex",
5685 },
5686 arm: {
5687 src: "myapex-arm.apex",
5688 },
5689 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5691 }
5692
5693 prebuilt_bootclasspath_fragment {
5694 name: "my-bootclasspath-fragment",
5695 contents: ["libfoo", "libbar"],
5696 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005697 hidden_api: {
5698 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5699 metadata: "my-bootclasspath-fragment/metadata.csv",
5700 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005701 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5702 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5703 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005704 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705 }
5706
5707 java_import {
5708 name: "libfoo",
5709 jars: ["libfoo.jar"],
5710 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005711 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005712 }
Paul Duffin37856732021-02-26 14:24:15 +00005713
5714 java_sdk_library_import {
5715 name: "libbar",
5716 public: {
5717 jars: ["libbar.jar"],
5718 },
5719 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005720 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005721 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005722 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005723 `
5724
Paul Duffin89f570a2021-06-16 01:42:33 +01005725 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005726 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5727 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005728
Paul Duffin537ea3d2021-05-14 10:38:00 +01005729 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005730 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005731 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005732 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005733 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005734 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 +01005735 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005736 })
5737
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005738 t.Run("apex_set only", func(t *testing.T) {
5739 bp := `
5740 apex_set {
5741 name: "myapex",
5742 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005743 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005744 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005745 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5746 }
5747
5748 java_import {
5749 name: "myjavalib",
5750 jars: ["myjavalib.jar"],
5751 apex_available: ["myapex"],
5752 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005753 }
5754
5755 prebuilt_bootclasspath_fragment {
5756 name: "my-bootclasspath-fragment",
5757 contents: ["libfoo", "libbar"],
5758 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005759 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",
Paul Duffin191be3a2021-08-10 16:14:16 +01005763 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5764 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5765 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005766 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005767 }
5768
Liz Kammer2dc72442023-04-20 10:10:48 -04005769 prebuilt_systemserverclasspath_fragment {
5770 name: "my-systemserverclasspath-fragment",
5771 contents: ["libbaz"],
5772 apex_available: ["myapex"],
5773 }
5774
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005775 java_import {
5776 name: "libfoo",
5777 jars: ["libfoo.jar"],
5778 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005779 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005780 }
5781
5782 java_sdk_library_import {
5783 name: "libbar",
5784 public: {
5785 jars: ["libbar.jar"],
5786 },
5787 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005788 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005789 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005790 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005791
5792 java_sdk_library_import {
5793 name: "libbaz",
5794 public: {
5795 jars: ["libbaz.jar"],
5796 },
5797 apex_available: ["myapex"],
5798 shared_library: false,
5799 permitted_packages: ["baz"],
5800 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005801 `
5802
Paul Duffin89f570a2021-06-16 01:42:33 +01005803 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005804 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5805 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005806
Paul Duffin537ea3d2021-05-14 10:38:00 +01005807 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005808 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005809 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005810 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005811 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 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 +01005813 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005814
5815 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5816
5817 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005818 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005819 "myjavalib.myapex",
5820 "libfoo.myapex",
5821 "libbar.myapex",
5822 "libbaz.myapex",
5823 }
5824 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5825 for i, e := range mkEntries {
5826 g := e.OverrideName
5827 if w := overrideNames[i]; w != g {
5828 t.Errorf("Expected override name %q, got %q", w, g)
5829 }
5830 }
5831
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005832 })
5833
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005834 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5835 bp := `
5836 prebuilt_apex {
5837 name: "myapex",
5838 arch: {
5839 arm64: {
5840 src: "myapex-arm64.apex",
5841 },
5842 arm: {
5843 src: "myapex-arm.apex",
5844 },
5845 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005846 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5847 }
5848
5849 prebuilt_bootclasspath_fragment {
5850 name: "my-bootclasspath-fragment",
5851 contents: ["libfoo", "libbar"],
5852 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005853 hidden_api: {
5854 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5855 metadata: "my-bootclasspath-fragment/metadata.csv",
5856 index: "my-bootclasspath-fragment/index.csv",
5857 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5858 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5859 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005860 }
5861
5862 java_import {
5863 name: "libfoo",
5864 jars: ["libfoo.jar"],
5865 apex_available: ["myapex"],
5866 }
5867
5868 java_library {
5869 name: "libfoo",
5870 srcs: ["foo/bar/MyClass.java"],
5871 apex_available: ["myapex"],
5872 }
Paul Duffin37856732021-02-26 14:24:15 +00005873
5874 java_sdk_library_import {
5875 name: "libbar",
5876 public: {
5877 jars: ["libbar.jar"],
5878 },
5879 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005880 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005881 }
5882
5883 java_sdk_library {
5884 name: "libbar",
5885 srcs: ["foo/bar/MyClass.java"],
5886 unsafe_ignore_missing_latest_api: true,
5887 apex_available: ["myapex"],
5888 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005889 `
5890
5891 // In this test the source (java_library) libfoo is active since the
5892 // prebuilt (java_import) defaults to prefer:false. However the
5893 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5894 // find the dex boot jar in it. We either need to disable the source libfoo
5895 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005896 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005897 // dexbootjar check is skipped if AllowMissingDependencies is true
5898 preparerAllowMissingDeps := android.GroupFixturePreparers(
5899 preparer,
5900 android.PrepareForTestWithAllowMissingDependencies,
5901 )
5902 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005903 })
5904
5905 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5906 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005907 apex {
5908 name: "myapex",
5909 key: "myapex.key",
5910 updatable: false,
5911 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 bootclasspath_fragment {
5921 name: "my-bootclasspath-fragment",
5922 contents: ["libfoo", "libbar"],
5923 apex_available: ["myapex"],
5924 hidden_api: {
5925 split_packages: ["*"],
5926 },
5927 }
5928
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005929 prebuilt_apex {
5930 name: "myapex",
5931 arch: {
5932 arm64: {
5933 src: "myapex-arm64.apex",
5934 },
5935 arm: {
5936 src: "myapex-arm.apex",
5937 },
5938 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005939 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5940 }
5941
5942 prebuilt_bootclasspath_fragment {
5943 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005944 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005945 contents: ["libfoo", "libbar"],
5946 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005947 hidden_api: {
5948 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5949 metadata: "my-bootclasspath-fragment/metadata.csv",
5950 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005951 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5952 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5953 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005954 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005955 }
5956
5957 java_import {
5958 name: "libfoo",
5959 prefer: true,
5960 jars: ["libfoo.jar"],
5961 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005962 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005963 }
5964
5965 java_library {
5966 name: "libfoo",
5967 srcs: ["foo/bar/MyClass.java"],
5968 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005969 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005970 }
Paul Duffin37856732021-02-26 14:24:15 +00005971
5972 java_sdk_library_import {
5973 name: "libbar",
5974 prefer: true,
5975 public: {
5976 jars: ["libbar.jar"],
5977 },
5978 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005979 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005980 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005981 }
5982
5983 java_sdk_library {
5984 name: "libbar",
5985 srcs: ["foo/bar/MyClass.java"],
5986 unsafe_ignore_missing_latest_api: true,
5987 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005988 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005989 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005990 `
5991
Paul Duffin89f570a2021-06-16 01:42:33 +01005992 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005993 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5994 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005995
Paul Duffin537ea3d2021-05-14 10:38:00 +01005996 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005997 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005998 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005999 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006000 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006001 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 +01006002 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006003 })
6004
6005 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
6006 bp := `
6007 apex {
6008 name: "myapex",
6009 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006010 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006011 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006012 }
6013
6014 apex_key {
6015 name: "myapex.key",
6016 public_key: "testkey.avbpubkey",
6017 private_key: "testkey.pem",
6018 }
6019
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006020 bootclasspath_fragment {
6021 name: "my-bootclasspath-fragment",
6022 contents: ["libfoo", "libbar"],
6023 apex_available: ["myapex"],
6024 hidden_api: {
6025 split_packages: ["*"],
6026 },
6027 }
6028
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006029 prebuilt_apex {
6030 name: "myapex",
6031 arch: {
6032 arm64: {
6033 src: "myapex-arm64.apex",
6034 },
6035 arm: {
6036 src: "myapex-arm.apex",
6037 },
6038 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006039 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6040 }
6041
6042 prebuilt_bootclasspath_fragment {
6043 name: "my-bootclasspath-fragment",
6044 contents: ["libfoo", "libbar"],
6045 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006046 hidden_api: {
6047 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6048 metadata: "my-bootclasspath-fragment/metadata.csv",
6049 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006050 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6051 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6052 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006053 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006054 }
6055
6056 java_import {
6057 name: "libfoo",
6058 jars: ["libfoo.jar"],
6059 apex_available: ["myapex"],
6060 }
6061
6062 java_library {
6063 name: "libfoo",
6064 srcs: ["foo/bar/MyClass.java"],
6065 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006066 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006067 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006068 }
Paul Duffin37856732021-02-26 14:24:15 +00006069
6070 java_sdk_library_import {
6071 name: "libbar",
6072 public: {
6073 jars: ["libbar.jar"],
6074 },
6075 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006076 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006077 }
6078
6079 java_sdk_library {
6080 name: "libbar",
6081 srcs: ["foo/bar/MyClass.java"],
6082 unsafe_ignore_missing_latest_api: true,
6083 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006084 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006085 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006086 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006087 `
6088
Paul Duffin89f570a2021-06-16 01:42:33 +01006089 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006090 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6091 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006092
Paul Duffin537ea3d2021-05-14 10:38:00 +01006093 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006094 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006095 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6096 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006097 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6098 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 +01006099 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006100 })
6101
6102 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6103 bp := `
6104 apex {
6105 name: "myapex",
6106 enabled: false,
6107 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006108 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006109 }
6110
6111 apex_key {
6112 name: "myapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006117 bootclasspath_fragment {
6118 name: "my-bootclasspath-fragment",
6119 enabled: false,
6120 contents: ["libfoo", "libbar"],
6121 apex_available: ["myapex"],
6122 hidden_api: {
6123 split_packages: ["*"],
6124 },
6125 }
6126
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006127 prebuilt_apex {
6128 name: "myapex",
6129 arch: {
6130 arm64: {
6131 src: "myapex-arm64.apex",
6132 },
6133 arm: {
6134 src: "myapex-arm.apex",
6135 },
6136 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006137 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6138 }
6139
6140 prebuilt_bootclasspath_fragment {
6141 name: "my-bootclasspath-fragment",
6142 contents: ["libfoo", "libbar"],
6143 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006144 hidden_api: {
6145 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6146 metadata: "my-bootclasspath-fragment/metadata.csv",
6147 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006148 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6149 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6150 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006151 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006152 }
6153
6154 java_import {
6155 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006156 jars: ["libfoo.jar"],
6157 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006158 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006159 }
6160
6161 java_library {
6162 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006163 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006164 srcs: ["foo/bar/MyClass.java"],
6165 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006166 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006167 }
Paul Duffin37856732021-02-26 14:24:15 +00006168
6169 java_sdk_library_import {
6170 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006171 public: {
6172 jars: ["libbar.jar"],
6173 },
6174 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006175 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006176 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006177 }
6178
6179 java_sdk_library {
6180 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006181 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006182 srcs: ["foo/bar/MyClass.java"],
6183 unsafe_ignore_missing_latest_api: true,
6184 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006185 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006186 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006187 `
6188
Paul Duffin89f570a2021-06-16 01:42:33 +01006189 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006190 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6191 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006192
Paul Duffin537ea3d2021-05-14 10:38:00 +01006193 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006194 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006195 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006196 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006197 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006198 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 +01006199 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006200 })
Spandan Das3a392012024-01-17 18:26:27 +00006201
Spandan Dasf2c10572024-02-27 04:49:52 +00006202 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00006203 bp := `
6204 // Source
6205 apex {
6206 name: "myapex",
6207 enabled: false,
6208 key: "myapex.key",
6209 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6210 }
6211
6212 apex_key {
6213 name: "myapex.key",
6214 public_key: "testkey.avbpubkey",
6215 private_key: "testkey.pem",
6216 }
6217
6218 // Prebuilt
6219 prebuilt_apex {
6220 name: "myapex.v1",
6221 source_apex_name: "myapex",
6222 arch: {
6223 arm64: {
6224 src: "myapex-arm64.apex",
6225 },
6226 arm: {
6227 src: "myapex-arm.apex",
6228 },
6229 },
6230 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6231 prefer: true,
6232 }
6233 prebuilt_apex {
6234 name: "myapex.v2",
6235 source_apex_name: "myapex",
6236 arch: {
6237 arm64: {
6238 src: "myapex-arm64.apex",
6239 },
6240 arm: {
6241 src: "myapex-arm.apex",
6242 },
6243 },
6244 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6245 prefer: true,
6246 }
6247
6248 prebuilt_bootclasspath_fragment {
6249 name: "my-bootclasspath-fragment",
6250 contents: ["libfoo", "libbar"],
6251 apex_available: ["myapex"],
6252 hidden_api: {
6253 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6254 metadata: "my-bootclasspath-fragment/metadata.csv",
6255 index: "my-bootclasspath-fragment/index.csv",
6256 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6257 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6258 },
6259 prefer: true,
6260 }
6261
6262 java_import {
6263 name: "libfoo",
6264 jars: ["libfoo.jar"],
6265 apex_available: ["myapex"],
6266 prefer: true,
6267 }
6268 java_import {
6269 name: "libbar",
6270 jars: ["libbar.jar"],
6271 apex_available: ["myapex"],
6272 prefer: true,
6273 }
6274 `
6275
Spandan Dasf2c10572024-02-27 04:49:52 +00006276 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 +00006277 })
6278
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006279}
6280
Roland Levillain630846d2019-06-26 12:48:34 +01006281func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006282 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006283 apex_test {
6284 name: "myapex",
6285 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006286 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006287 tests: [
6288 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006289 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006290 ],
6291 }
6292
6293 apex_key {
6294 name: "myapex.key",
6295 public_key: "testkey.avbpubkey",
6296 private_key: "testkey.pem",
6297 }
6298
Liz Kammer1c14a212020-05-12 15:26:55 -07006299 filegroup {
6300 name: "fg",
6301 srcs: [
6302 "baz",
6303 "bar/baz"
6304 ],
6305 }
6306
Roland Levillain630846d2019-06-26 12:48:34 +01006307 cc_test {
6308 name: "mytest",
6309 gtest: false,
6310 srcs: ["mytest.cpp"],
6311 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006312 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006313 system_shared_libs: [],
6314 static_executable: true,
6315 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006316 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006317 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006318
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006319 cc_library {
6320 name: "mylib",
6321 srcs: ["mylib.cpp"],
6322 system_shared_libs: [],
6323 stl: "none",
6324 }
6325
Liz Kammer5bd365f2020-05-27 15:15:11 -07006326 filegroup {
6327 name: "fg2",
6328 srcs: [
6329 "testdata/baz"
6330 ],
6331 }
6332
Roland Levillain9b5fde92019-06-28 15:41:19 +01006333 cc_test {
6334 name: "mytests",
6335 gtest: false,
6336 srcs: [
6337 "mytest1.cpp",
6338 "mytest2.cpp",
6339 "mytest3.cpp",
6340 ],
6341 test_per_src: true,
6342 relative_install_path: "test",
6343 system_shared_libs: [],
6344 static_executable: true,
6345 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006346 data: [
6347 ":fg",
6348 ":fg2",
6349 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006350 }
Roland Levillain630846d2019-06-26 12:48:34 +01006351 `)
6352
Jooyung Hana0503a52023-08-23 13:12:50 +09006353 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006354 copyCmds := apexRule.Args["copy_commands"]
6355
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006356 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006357 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006358 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006359
Liz Kammer1c14a212020-05-12 15:26:55 -07006360 //Ensure that test data are copied into apex.
6361 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6362 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6363
Roland Levillain9b5fde92019-06-28 15:41:19 +01006364 // Ensure that test deps built with `test_per_src` are copied into apex.
6365 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6366 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6367 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006368
6369 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006370 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006371 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006372 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006373 prefix := "TARGET_"
6374 var builder strings.Builder
6375 data.Custom(&builder, name, prefix, "", data)
6376 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006377 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6378 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6379 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6380 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006381 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006382}
6383
Jooyung Hand48f3c32019-08-23 11:18:57 +09006384func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6385 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6386 apex {
6387 name: "myapex",
6388 key: "myapex.key",
6389 native_shared_libs: ["libfoo"],
6390 }
6391
6392 apex_key {
6393 name: "myapex.key",
6394 public_key: "testkey.avbpubkey",
6395 private_key: "testkey.pem",
6396 }
6397
6398 cc_library {
6399 name: "libfoo",
6400 stl: "none",
6401 system_shared_libs: [],
6402 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006403 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006404 }
6405 `)
6406 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6407 apex {
6408 name: "myapex",
6409 key: "myapex.key",
6410 java_libs: ["myjar"],
6411 }
6412
6413 apex_key {
6414 name: "myapex.key",
6415 public_key: "testkey.avbpubkey",
6416 private_key: "testkey.pem",
6417 }
6418
6419 java_library {
6420 name: "myjar",
6421 srcs: ["foo/bar/MyClass.java"],
6422 sdk_version: "none",
6423 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006424 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006425 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006426 }
6427 `)
6428}
6429
Bill Peckhama41a6962021-01-11 10:58:54 -08006430func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006431 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006432 apex {
6433 name: "myapex",
6434 key: "myapex.key",
6435 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006436 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006437 }
6438
6439 apex_key {
6440 name: "myapex.key",
6441 public_key: "testkey.avbpubkey",
6442 private_key: "testkey.pem",
6443 }
6444
6445 java_import {
6446 name: "myjavaimport",
6447 apex_available: ["myapex"],
6448 jars: ["my.jar"],
6449 compile_dex: true,
6450 }
6451 `)
6452
Jooyung Hana0503a52023-08-23 13:12:50 +09006453 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006454 apexRule := module.Rule("apexRule")
6455 copyCmds := apexRule.Args["copy_commands"]
6456 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6457}
6458
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006459func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006460 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006461 apex {
6462 name: "myapex",
6463 key: "myapex.key",
6464 apps: [
6465 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006466 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006467 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006468 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006469 }
6470
6471 apex_key {
6472 name: "myapex.key",
6473 public_key: "testkey.avbpubkey",
6474 private_key: "testkey.pem",
6475 }
6476
6477 android_app {
6478 name: "AppFoo",
6479 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006480 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006481 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006482 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006483 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006484 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006485 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006486
6487 android_app {
6488 name: "AppFooPriv",
6489 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006490 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006491 system_modules: "none",
6492 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006493 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006494 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006495 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006496 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006497
6498 cc_library_shared {
6499 name: "libjni",
6500 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006501 shared_libs: ["libfoo"],
6502 stl: "none",
6503 system_shared_libs: [],
6504 apex_available: [ "myapex" ],
6505 sdk_version: "current",
6506 }
6507
6508 cc_library_shared {
6509 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006510 stl: "none",
6511 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006512 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006513 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006514 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006515 `)
6516
Jooyung Hana0503a52023-08-23 13:12:50 +09006517 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006518 apexRule := module.Rule("apexRule")
6519 copyCmds := apexRule.Args["copy_commands"]
6520
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006521 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6522 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006523 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006524
Colin Crossaede88c2020-08-11 12:17:01 -07006525 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006526 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006527 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006528 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006529 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006530 // JNI libraries including transitive deps are
6531 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006532 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006533 // ... embedded inside APK (jnilibs.zip)
6534 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6535 // ... and not directly inside the APEX
6536 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6537 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006538
6539 apexBundle := module.Module().(*apexBundle)
6540 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6541 var builder strings.Builder
6542 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6543 androidMk := builder.String()
6544 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6545 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6546 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6547 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6548 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6549 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 +01006550}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006551
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006552func TestApexWithAppImportBuildId(t *testing.T) {
6553 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6554 for _, id := range invalidBuildIds {
6555 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6556 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6557 variables.BuildId = proptools.StringPtr(id)
6558 })
6559 testApexError(t, message, `apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 apps: ["AppFooPrebuilt"],
6563 updatable: false,
6564 }
6565
6566 apex_key {
6567 name: "myapex.key",
6568 public_key: "testkey.avbpubkey",
6569 private_key: "testkey.pem",
6570 }
6571
6572 android_app_import {
6573 name: "AppFooPrebuilt",
6574 apk: "PrebuiltAppFoo.apk",
6575 presigned: true,
6576 apex_available: ["myapex"],
6577 }
6578 `, fixture)
6579 }
6580}
6581
Dario Frenicde2a032019-10-27 00:29:22 +01006582func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006583 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006584 apex {
6585 name: "myapex",
6586 key: "myapex.key",
6587 apps: [
6588 "AppFooPrebuilt",
6589 "AppFooPrivPrebuilt",
6590 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006591 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006592 }
6593
6594 apex_key {
6595 name: "myapex.key",
6596 public_key: "testkey.avbpubkey",
6597 private_key: "testkey.pem",
6598 }
6599
6600 android_app_import {
6601 name: "AppFooPrebuilt",
6602 apk: "PrebuiltAppFoo.apk",
6603 presigned: true,
6604 dex_preopt: {
6605 enabled: false,
6606 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006607 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006608 }
6609
6610 android_app_import {
6611 name: "AppFooPrivPrebuilt",
6612 apk: "PrebuiltAppFooPriv.apk",
6613 privileged: true,
6614 presigned: true,
6615 dex_preopt: {
6616 enabled: false,
6617 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006618 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006619 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006620 }
6621 `)
6622
Jooyung Hana0503a52023-08-23 13:12:50 +09006623 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006624 apexRule := module.Rule("apexRule")
6625 copyCmds := apexRule.Args["copy_commands"]
6626
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006627 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6628 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006629}
6630
6631func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006632 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006633 apex {
6634 name: "myapex",
6635 key: "myapex.key",
6636 apps: [
6637 "AppFoo",
6638 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006639 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006640 }
6641
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647
6648 android_app {
6649 name: "AppFoo",
6650 srcs: ["foo/bar/MyClass.java"],
6651 sdk_version: "none",
6652 system_modules: "none",
6653 apex_available: [ "myapex" ],
6654 }
6655
6656 android_app_import {
6657 name: "AppFoo",
6658 apk: "AppFooPrebuilt.apk",
6659 filename: "AppFooPrebuilt.apk",
6660 presigned: true,
6661 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006662 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006663 }
6664 `, withFiles(map[string][]byte{
6665 "AppFooPrebuilt.apk": nil,
6666 }))
6667
Jooyung Hana0503a52023-08-23 13:12:50 +09006668 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006669 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006670 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006671}
6672
Dario Freni6f3937c2019-12-20 22:58:03 +00006673func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006674 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006675 apex {
6676 name: "myapex",
6677 key: "myapex.key",
6678 apps: [
6679 "TesterHelpAppFoo",
6680 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006681 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006682 }
6683
6684 apex_key {
6685 name: "myapex.key",
6686 public_key: "testkey.avbpubkey",
6687 private_key: "testkey.pem",
6688 }
6689
6690 android_test_helper_app {
6691 name: "TesterHelpAppFoo",
6692 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006693 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006694 }
6695
6696 `)
6697
Jooyung Hana0503a52023-08-23 13:12:50 +09006698 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006699 apexRule := module.Rule("apexRule")
6700 copyCmds := apexRule.Args["copy_commands"]
6701
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006702 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006703}
6704
Jooyung Han18020ea2019-11-13 10:50:48 +09006705func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6706 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006707 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006708 apex {
6709 name: "myapex",
6710 key: "myapex.key",
6711 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006712 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006713 }
6714
6715 apex_key {
6716 name: "myapex.key",
6717 public_key: "testkey.avbpubkey",
6718 private_key: "testkey.pem",
6719 }
6720
6721 apex {
6722 name: "otherapex",
6723 key: "myapex.key",
6724 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006725 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006726 }
6727
6728 cc_defaults {
6729 name: "libfoo-defaults",
6730 apex_available: ["otherapex"],
6731 }
6732
6733 cc_library {
6734 name: "libfoo",
6735 defaults: ["libfoo-defaults"],
6736 stl: "none",
6737 system_shared_libs: [],
6738 }`)
6739}
6740
Paul Duffine52e66f2020-03-30 17:54:29 +01006741func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006742 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006743 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006744 apex {
6745 name: "myapex",
6746 key: "myapex.key",
6747 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006748 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006749 }
6750
6751 apex_key {
6752 name: "myapex.key",
6753 public_key: "testkey.avbpubkey",
6754 private_key: "testkey.pem",
6755 }
6756
6757 apex {
6758 name: "otherapex",
6759 key: "otherapex.key",
6760 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006761 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006762 }
6763
6764 apex_key {
6765 name: "otherapex.key",
6766 public_key: "testkey.avbpubkey",
6767 private_key: "testkey.pem",
6768 }
6769
6770 cc_library {
6771 name: "libfoo",
6772 stl: "none",
6773 system_shared_libs: [],
6774 apex_available: ["otherapex"],
6775 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006776}
Jiyong Park127b40b2019-09-30 16:04:35 +09006777
Paul Duffine52e66f2020-03-30 17:54:29 +01006778func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006779 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006780 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006781.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006782.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006783.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006784.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006785.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006786.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006787 apex {
6788 name: "myapex",
6789 key: "myapex.key",
6790 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006791 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006792 }
6793
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799
Jiyong Park127b40b2019-09-30 16:04:35 +09006800 cc_library {
6801 name: "libfoo",
6802 stl: "none",
6803 shared_libs: ["libbar"],
6804 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006805 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006806 }
6807
6808 cc_library {
6809 name: "libbar",
6810 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006811 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006812 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006813 apex_available: ["myapex"],
6814 }
6815
6816 cc_library {
6817 name: "libbaz",
6818 stl: "none",
6819 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006820 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006821}
Jiyong Park127b40b2019-09-30 16:04:35 +09006822
Liz Kammer5f108fa2023-05-11 14:33:17 -04006823func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6824 testApex(t, `
6825 apex {
6826 name: "myapex",
6827 key: "myapex.key",
6828 native_shared_libs: ["libfoo"],
6829 updatable: false,
6830 }
6831
6832 apex_key {
6833 name: "myapex.key",
6834 public_key: "testkey.avbpubkey",
6835 private_key: "testkey.pem",
6836 }
6837
6838 cc_library {
6839 name: "libfoo",
6840 stl: "none",
6841 static_libs: ["libbar"],
6842 system_shared_libs: [],
6843 apex_available: ["myapex"],
6844 }
6845
6846 cc_library {
6847 name: "libbar",
6848 stl: "none",
6849 shared_libs: ["libbaz"],
6850 system_shared_libs: [],
6851 apex_available: ["myapex"],
6852 }
6853
6854 cc_library {
6855 name: "libbaz",
6856 stl: "none",
6857 system_shared_libs: [],
6858 }`)
6859
6860 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6861 apex {
6862 name: "myapex",
6863 key: "myapex.key",
6864 native_shared_libs: ["libfoo"],
6865 updatable: false,
6866 }
6867
6868 apex_key {
6869 name: "myapex.key",
6870 public_key: "testkey.avbpubkey",
6871 private_key: "testkey.pem",
6872 }
6873
6874 cc_library {
6875 name: "libfoo",
6876 stl: "none",
6877 static_libs: ["libbar"],
6878 system_shared_libs: [],
6879 apex_available: ["myapex"],
6880 }
6881
6882 cc_library {
6883 name: "libbar",
6884 stl: "none",
6885 system_shared_libs: [],
6886 }`)
6887}
6888
Paul Duffine52e66f2020-03-30 17:54:29 +01006889func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006890 testApexError(t, "\"otherapex\" is not a valid module name", `
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006895 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006896 }
6897
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903
6904 cc_library {
6905 name: "libfoo",
6906 stl: "none",
6907 system_shared_libs: [],
6908 apex_available: ["otherapex"],
6909 }`)
6910
Paul Duffine52e66f2020-03-30 17:54:29 +01006911 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
6915 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 }
6918
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "libfoo",
6927 stl: "none",
6928 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006929 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 apex_available: ["myapex"],
6931 }
6932
6933 cc_library {
6934 name: "libbar",
6935 stl: "none",
6936 system_shared_libs: [],
6937 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006938 }
6939
6940 cc_library {
6941 name: "libbaz",
6942 stl: "none",
6943 system_shared_libs: [],
6944 stubs: {
6945 versions: ["10", "20", "30"],
6946 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006947 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006948}
Jiyong Park127b40b2019-09-30 16:04:35 +09006949
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006950func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6951 t.Run("negative variant_version produces error", func(t *testing.T) {
6952 testApexError(t, "expected an integer between 0-9; got -1", `
6953 apex {
6954 name: "myapex",
6955 key: "myapex.key",
6956 apex_available_name: "com.android.foo",
6957 variant_version: "-1",
6958 updatable: false,
6959 }
6960 apex_key {
6961 name: "myapex.key",
6962 public_key: "testkey.avbpubkey",
6963 private_key: "testkey.pem",
6964 }
6965 `)
6966 })
6967
6968 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6969 testApexError(t, "expected an integer between 0-9; got 10", `
6970 apex {
6971 name: "myapex",
6972 key: "myapex.key",
6973 apex_available_name: "com.android.foo",
6974 variant_version: "10",
6975 updatable: false,
6976 }
6977 apex_key {
6978 name: "myapex.key",
6979 public_key: "testkey.avbpubkey",
6980 private_key: "testkey.pem",
6981 }
6982 `)
6983 })
6984}
6985
6986func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6987 context := android.GroupFixturePreparers(
6988 android.PrepareForIntegrationTestWithAndroid,
6989 PrepareForTestWithApexBuildComponents,
6990 android.FixtureMergeMockFs(android.MockFS{
6991 "system/sepolicy/apex/foo-file_contexts": nil,
6992 "system/sepolicy/apex/bar-file_contexts": nil,
6993 }),
6994 )
6995 result := context.RunTestWithBp(t, `
6996 apex {
6997 name: "foo",
6998 key: "myapex.key",
6999 apex_available_name: "com.android.foo",
7000 variant_version: "0",
7001 updatable: false,
7002 }
7003 apex {
7004 name: "bar",
7005 key: "myapex.key",
7006 apex_available_name: "com.android.foo",
7007 variant_version: "3",
7008 updatable: false,
7009 }
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007015 override_apex {
7016 name: "myoverrideapex",
7017 base: "bar",
7018 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007019 `)
7020
Jooyung Hana0503a52023-08-23 13:12:50 +09007021 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007022 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
7023 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
7024 if fooActualDefaultVersion != fooExpectedDefaultVersion {
7025 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
7026 }
7027
Jooyung Hana0503a52023-08-23 13:12:50 +09007028 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007029 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
7030 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
7031 barActualDefaultVersion := barManifestRule.Args["default_version"]
7032 if barActualDefaultVersion != barExpectedDefaultVersion {
7033 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7034 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007035
Jooyung Hana0503a52023-08-23 13:12:50 +09007036 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04007037 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
7038 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
7039 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7040 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007041}
7042
Sam Delmericoca816532023-06-02 14:09:50 -04007043func TestApexAvailable_ApexAvailableName(t *testing.T) {
7044 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
7045 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
7046 apex {
7047 name: "myapex_sminus",
7048 key: "myapex.key",
7049 apps: ["AppFoo"],
7050 apex_available_name: "myapex",
7051 updatable: false,
7052 }
7053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
7056 apps: ["AppFoo"],
7057 updatable: false,
7058 }
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
7064 android_app {
7065 name: "AppFoo",
7066 srcs: ["foo/bar/MyClass.java"],
7067 sdk_version: "none",
7068 system_modules: "none",
7069 apex_available: [ "myapex_sminus" ],
7070 }`,
7071 android.FixtureMergeMockFs(android.MockFS{
7072 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7073 }),
7074 )
7075 })
7076
7077 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7078 testApex(t, `
7079 apex {
7080 name: "myapex_sminus",
7081 key: "myapex.key",
7082 apps: ["AppFoo"],
7083 apex_available_name: "myapex",
7084 updatable: false,
7085 }
7086 apex {
7087 name: "myapex",
7088 key: "myapex.key",
7089 apps: ["AppFoo"],
7090 updatable: false,
7091 }
7092 apex_key {
7093 name: "myapex.key",
7094 public_key: "testkey.avbpubkey",
7095 private_key: "testkey.pem",
7096 }
7097 android_app {
7098 name: "AppFoo",
7099 srcs: ["foo/bar/MyClass.java"],
7100 sdk_version: "none",
7101 system_modules: "none",
7102 apex_available: [ "myapex" ],
7103 }`,
7104 android.FixtureMergeMockFs(android.MockFS{
7105 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7106 }),
7107 )
7108 })
7109
7110 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7111 testApex(t, `
7112 override_apex {
7113 name: "myoverrideapex_sminus",
7114 base: "myapex_sminus",
7115 key: "myapex.key",
7116 apps: ["AppFooOverride"],
7117 }
7118 override_apex {
7119 name: "myoverrideapex",
7120 base: "myapex",
7121 key: "myapex.key",
7122 apps: ["AppFooOverride"],
7123 }
7124 apex {
7125 name: "myapex_sminus",
7126 key: "myapex.key",
7127 apps: ["AppFoo"],
7128 apex_available_name: "myapex",
7129 updatable: false,
7130 }
7131 apex {
7132 name: "myapex",
7133 key: "myapex.key",
7134 apps: ["AppFoo"],
7135 updatable: false,
7136 }
7137 apex_key {
7138 name: "myapex.key",
7139 public_key: "testkey.avbpubkey",
7140 private_key: "testkey.pem",
7141 }
7142 android_app {
7143 name: "AppFooOverride",
7144 srcs: ["foo/bar/MyClass.java"],
7145 sdk_version: "none",
7146 system_modules: "none",
7147 apex_available: [ "myapex" ],
7148 }
7149 android_app {
7150 name: "AppFoo",
7151 srcs: ["foo/bar/MyClass.java"],
7152 sdk_version: "none",
7153 system_modules: "none",
7154 apex_available: [ "myapex" ],
7155 }`,
7156 android.FixtureMergeMockFs(android.MockFS{
7157 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7158 }),
7159 )
7160 })
7161}
7162
7163func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7164 context := android.GroupFixturePreparers(
7165 android.PrepareForIntegrationTestWithAndroid,
7166 PrepareForTestWithApexBuildComponents,
7167 java.PrepareForTestWithDexpreopt,
7168 android.FixtureMergeMockFs(android.MockFS{
7169 "system/sepolicy/apex/myapex-file_contexts": nil,
7170 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7171 }),
7172 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7173 variables.BuildId = proptools.StringPtr("buildid")
7174 }),
7175 )
7176 context.RunTestWithBp(t, `
7177 override_apex {
7178 name: "myoverrideapex_sminus",
7179 base: "myapex_sminus",
7180 }
7181 override_apex {
7182 name: "myoverrideapex",
7183 base: "myapex",
7184 }
7185 apex {
7186 name: "myapex",
7187 key: "myapex.key",
7188 apps: ["AppFoo"],
7189 updatable: false,
7190 }
7191 apex {
7192 name: "myapex_sminus",
7193 apex_available_name: "myapex",
7194 key: "myapex.key",
7195 apps: ["AppFoo_sminus"],
7196 updatable: false,
7197 }
7198 apex_key {
7199 name: "myapex.key",
7200 public_key: "testkey.avbpubkey",
7201 private_key: "testkey.pem",
7202 }
7203 android_app {
7204 name: "AppFoo",
7205 srcs: ["foo/bar/MyClass.java"],
7206 sdk_version: "none",
7207 system_modules: "none",
7208 apex_available: [ "myapex" ],
7209 }
7210 android_app {
7211 name: "AppFoo_sminus",
7212 srcs: ["foo/bar/MyClass.java"],
7213 sdk_version: "none",
7214 min_sdk_version: "29",
7215 system_modules: "none",
7216 apex_available: [ "myapex" ],
7217 }`)
7218}
7219
Jiyong Park89e850a2020-04-07 16:37:39 +09007220func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007221 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007222 apex {
7223 name: "myapex",
7224 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007225 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007226 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007227 }
7228
7229 apex_key {
7230 name: "myapex.key",
7231 public_key: "testkey.avbpubkey",
7232 private_key: "testkey.pem",
7233 }
7234
7235 cc_library {
7236 name: "libfoo",
7237 stl: "none",
7238 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007239 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007240 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007241 }
7242
7243 cc_library {
7244 name: "libfoo2",
7245 stl: "none",
7246 system_shared_libs: [],
7247 shared_libs: ["libbaz"],
7248 apex_available: ["//apex_available:platform"],
7249 }
7250
7251 cc_library {
7252 name: "libbar",
7253 stl: "none",
7254 system_shared_libs: [],
7255 apex_available: ["myapex"],
7256 }
7257
7258 cc_library {
7259 name: "libbaz",
7260 stl: "none",
7261 system_shared_libs: [],
7262 apex_available: ["myapex"],
7263 stubs: {
7264 versions: ["1"],
7265 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007266 }`)
7267
Jiyong Park89e850a2020-04-07 16:37:39 +09007268 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7269 // because it depends on libbar which isn't available to platform
7270 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7271 if libfoo.NotAvailableForPlatform() != true {
7272 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7273 }
7274
7275 // libfoo2 however can be available to platform because it depends on libbaz which provides
7276 // stubs
7277 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7278 if libfoo2.NotAvailableForPlatform() == true {
7279 t.Errorf("%q should be available to platform", libfoo2.String())
7280 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007281}
Jiyong Parka90ca002019-10-07 15:47:24 +09007282
Paul Duffine52e66f2020-03-30 17:54:29 +01007283func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007284 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007285 apex {
7286 name: "myapex",
7287 key: "myapex.key",
7288 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007289 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007290 }
7291
7292 apex_key {
7293 name: "myapex.key",
7294 public_key: "testkey.avbpubkey",
7295 private_key: "testkey.pem",
7296 }
7297
7298 cc_library {
7299 name: "libfoo",
7300 stl: "none",
7301 system_shared_libs: [],
7302 apex_available: ["myapex"],
7303 static: {
7304 apex_available: ["//apex_available:platform"],
7305 },
7306 }`)
7307
Jiyong Park89e850a2020-04-07 16:37:39 +09007308 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7309 if libfooShared.NotAvailableForPlatform() != true {
7310 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7311 }
7312 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7313 if libfooStatic.NotAvailableForPlatform() != false {
7314 t.Errorf("%q should be available to platform", libfooStatic.String())
7315 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007316}
7317
Jiyong Park5d790c32019-11-15 18:40:32 +09007318func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007319 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
7323 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007324 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007325 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007326 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007327 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007328 }
7329
7330 override_apex {
7331 name: "override_myapex",
7332 base: "myapex",
7333 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007334 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007335 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007336 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007337 compile_multilib: "first",
7338 multilib: {
7339 lib32: {
7340 native_shared_libs: ["mylib32"],
7341 },
7342 lib64: {
7343 native_shared_libs: ["mylib64"],
7344 },
7345 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007346 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007347 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007348 key: "mynewapex.key",
7349 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007350 }
7351
7352 apex_key {
7353 name: "myapex.key",
7354 public_key: "testkey.avbpubkey",
7355 private_key: "testkey.pem",
7356 }
7357
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007358 apex_key {
7359 name: "mynewapex.key",
7360 public_key: "testkey2.avbpubkey",
7361 private_key: "testkey2.pem",
7362 }
7363
7364 android_app_certificate {
7365 name: "myapex.certificate",
7366 certificate: "testkey",
7367 }
7368
Jiyong Park5d790c32019-11-15 18:40:32 +09007369 android_app {
7370 name: "app",
7371 srcs: ["foo/bar/MyClass.java"],
7372 package_name: "foo",
7373 sdk_version: "none",
7374 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007375 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007376 }
7377
7378 override_android_app {
7379 name: "override_app",
7380 base: "app",
7381 package_name: "bar",
7382 }
markchien7c803b82021-08-26 22:10:06 +08007383
7384 bpf {
7385 name: "bpf",
7386 srcs: ["bpf.c"],
7387 }
7388
7389 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007390 name: "overrideBpf",
7391 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007392 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007393
7394 prebuilt_etc {
7395 name: "myetc",
7396 src: "myprebuilt",
7397 }
7398
7399 prebuilt_etc {
7400 name: "override_myetc",
7401 src: "override_myprebuilt",
7402 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007403
7404 cc_library {
7405 name: "mylib32",
7406 apex_available: [ "myapex" ],
7407 }
7408
7409 cc_library {
7410 name: "mylib64",
7411 apex_available: [ "myapex" ],
7412 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007413 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007414
Jooyung Hana0503a52023-08-23 13:12:50 +09007415 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7416 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007417 if originalVariant.GetOverriddenBy() != "" {
7418 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7419 }
7420 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7421 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7422 }
7423
Jooyung Hana0503a52023-08-23 13:12:50 +09007424 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007425 apexRule := module.Rule("apexRule")
7426 copyCmds := apexRule.Args["copy_commands"]
7427
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007428 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7429 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007430
markchien7c803b82021-08-26 22:10:06 +08007431 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007432 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007433
Daniel Norman5a3ce132021-08-26 15:44:43 -07007434 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7435 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7436
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007437 apexBundle := module.Module().(*apexBundle)
7438 name := apexBundle.Name()
7439 if name != "override_myapex" {
7440 t.Errorf("name should be \"override_myapex\", but was %q", name)
7441 }
7442
Baligh Uddin004d7172020-02-19 21:29:28 -08007443 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7444 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7445 }
7446
Jiyong Park20bacab2020-03-03 11:45:41 +09007447 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007448 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007449 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7450
7451 signApkRule := module.Rule("signapk")
7452 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007453
Colin Crossaa255532020-07-03 13:18:24 -07007454 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007455 var builder strings.Builder
7456 data.Custom(&builder, name, "TARGET_", "", data)
7457 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007458 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7459 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007460 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007461 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007462 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007463 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007464 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007465 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007466}
7467
Albert Martineefabcf2022-03-21 20:11:16 +00007468func TestMinSdkVersionOverride(t *testing.T) {
7469 // Override from 29 to 31
7470 minSdkOverride31 := "31"
7471 ctx := testApex(t, `
7472 apex {
7473 name: "myapex",
7474 key: "myapex.key",
7475 native_shared_libs: ["mylib"],
7476 updatable: true,
7477 min_sdk_version: "29"
7478 }
7479
7480 override_apex {
7481 name: "override_myapex",
7482 base: "myapex",
7483 logging_parent: "com.foo.bar",
7484 package_name: "test.overridden.package"
7485 }
7486
7487 apex_key {
7488 name: "myapex.key",
7489 public_key: "testkey.avbpubkey",
7490 private_key: "testkey.pem",
7491 }
7492
7493 cc_library {
7494 name: "mylib",
7495 srcs: ["mylib.cpp"],
7496 runtime_libs: ["libbar"],
7497 system_shared_libs: [],
7498 stl: "none",
7499 apex_available: [ "myapex" ],
7500 min_sdk_version: "apex_inherit"
7501 }
7502
7503 cc_library {
7504 name: "libbar",
7505 srcs: ["mylib.cpp"],
7506 system_shared_libs: [],
7507 stl: "none",
7508 apex_available: [ "myapex" ],
7509 min_sdk_version: "apex_inherit"
7510 }
7511
7512 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7513
Jooyung Hana0503a52023-08-23 13:12:50 +09007514 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007515 copyCmds := apexRule.Args["copy_commands"]
7516
7517 // Ensure that direct non-stubs dep is always included
7518 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7519
7520 // Ensure that runtime_libs dep in included
7521 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7522
7523 // Ensure libraries target overridden min_sdk_version value
7524 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7525}
7526
7527func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7528 // Attempt to override from 31 to 29, should be a NOOP
7529 minSdkOverride29 := "29"
7530 ctx := testApex(t, `
7531 apex {
7532 name: "myapex",
7533 key: "myapex.key",
7534 native_shared_libs: ["mylib"],
7535 updatable: true,
7536 min_sdk_version: "31"
7537 }
7538
7539 override_apex {
7540 name: "override_myapex",
7541 base: "myapex",
7542 logging_parent: "com.foo.bar",
7543 package_name: "test.overridden.package"
7544 }
7545
7546 apex_key {
7547 name: "myapex.key",
7548 public_key: "testkey.avbpubkey",
7549 private_key: "testkey.pem",
7550 }
7551
7552 cc_library {
7553 name: "mylib",
7554 srcs: ["mylib.cpp"],
7555 runtime_libs: ["libbar"],
7556 system_shared_libs: [],
7557 stl: "none",
7558 apex_available: [ "myapex" ],
7559 min_sdk_version: "apex_inherit"
7560 }
7561
7562 cc_library {
7563 name: "libbar",
7564 srcs: ["mylib.cpp"],
7565 system_shared_libs: [],
7566 stl: "none",
7567 apex_available: [ "myapex" ],
7568 min_sdk_version: "apex_inherit"
7569 }
7570
7571 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7572
Jooyung Hana0503a52023-08-23 13:12:50 +09007573 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007574 copyCmds := apexRule.Args["copy_commands"]
7575
7576 // Ensure that direct non-stubs dep is always included
7577 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7578
7579 // Ensure that runtime_libs dep in included
7580 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7581
7582 // Ensure libraries target the original min_sdk_version value rather than the overridden
7583 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7584}
7585
Jooyung Han214bf372019-11-12 13:03:50 +09007586func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007587 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007588 apex {
7589 name: "myapex",
7590 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007591 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007592 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007593 }
7594
7595 apex_key {
7596 name: "myapex.key",
7597 public_key: "testkey.avbpubkey",
7598 private_key: "testkey.pem",
7599 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007600
7601 cc_library {
7602 name: "mylib",
7603 srcs: ["mylib.cpp"],
7604 stl: "libc++",
7605 system_shared_libs: [],
7606 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007607 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007608 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007609 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007610
Jooyung Hana0503a52023-08-23 13:12:50 +09007611 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007612 args := module.Rule("apexRule").Args
7613 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007614 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007615
7616 // The copies of the libraries in the apex should have one more dependency than
7617 // the ones outside the apex, namely the unwinder. Ideally we should check
7618 // the dependency names directly here but for some reason the names are blank in
7619 // this test.
7620 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007621 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007622 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7623 if len(apexImplicits) != len(nonApexImplicits)+1 {
7624 t.Errorf("%q missing unwinder dep", lib)
7625 }
7626 }
Jooyung Han214bf372019-11-12 13:03:50 +09007627}
7628
Paul Duffine05480a2021-03-08 15:07:14 +00007629var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007630 "api/current.txt": nil,
7631 "api/removed.txt": nil,
7632 "api/system-current.txt": nil,
7633 "api/system-removed.txt": nil,
7634 "api/test-current.txt": nil,
7635 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007636
Anton Hanssondff2c782020-12-21 17:10:01 +00007637 "100/public/api/foo.txt": nil,
7638 "100/public/api/foo-removed.txt": nil,
7639 "100/system/api/foo.txt": nil,
7640 "100/system/api/foo-removed.txt": nil,
7641
Paul Duffineedc5d52020-06-12 17:46:39 +01007642 // For java_sdk_library_import
7643 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007644}
7645
Jooyung Han58f26ab2019-12-18 15:34:32 +09007646func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007647 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007648 apex {
7649 name: "myapex",
7650 key: "myapex.key",
7651 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007652 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007653 }
7654
7655 apex_key {
7656 name: "myapex.key",
7657 public_key: "testkey.avbpubkey",
7658 private_key: "testkey.pem",
7659 }
7660
7661 java_sdk_library {
7662 name: "foo",
7663 srcs: ["a.java"],
7664 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007665 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007666 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007667
7668 prebuilt_apis {
7669 name: "sdk",
7670 api_dirs: ["100"],
7671 }
Paul Duffin9b879592020-05-26 13:21:35 +01007672 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007673
7674 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007675 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007676 "javalib/foo.jar",
7677 "etc/permissions/foo.xml",
7678 })
7679 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007680 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007681 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09007682}
7683
Paul Duffin9b879592020-05-26 13:21:35 +01007684func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007685 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007686 apex {
7687 name: "myapex",
7688 key: "myapex.key",
7689 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007690 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007691 }
7692
7693 apex_key {
7694 name: "myapex.key",
7695 public_key: "testkey.avbpubkey",
7696 private_key: "testkey.pem",
7697 }
7698
7699 java_sdk_library {
7700 name: "foo",
7701 srcs: ["a.java"],
7702 api_packages: ["foo"],
7703 apex_available: ["myapex"],
7704 sdk_version: "none",
7705 system_modules: "none",
7706 }
7707
7708 java_library {
7709 name: "bar",
7710 srcs: ["a.java"],
7711 libs: ["foo"],
7712 apex_available: ["myapex"],
7713 sdk_version: "none",
7714 system_modules: "none",
7715 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007716
7717 prebuilt_apis {
7718 name: "sdk",
7719 api_dirs: ["100"],
7720 }
Paul Duffin9b879592020-05-26 13:21:35 +01007721 `, withFiles(filesForSdkLibrary))
7722
7723 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007724 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007725 "javalib/bar.jar",
7726 "javalib/foo.jar",
7727 "etc/permissions/foo.xml",
7728 })
7729
7730 // The bar library should depend on the implementation jar.
7731 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007732 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007733 t.Errorf("expected %q, found %#q", expected, actual)
7734 }
7735}
7736
7737func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007738 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007739 apex {
7740 name: "myapex",
7741 key: "myapex.key",
7742 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007743 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007744 }
7745
7746 apex_key {
7747 name: "myapex.key",
7748 public_key: "testkey.avbpubkey",
7749 private_key: "testkey.pem",
7750 }
7751
7752 java_sdk_library {
7753 name: "foo",
7754 srcs: ["a.java"],
7755 api_packages: ["foo"],
7756 apex_available: ["myapex"],
7757 sdk_version: "none",
7758 system_modules: "none",
7759 }
7760
7761 java_library {
7762 name: "bar",
7763 srcs: ["a.java"],
7764 libs: ["foo"],
7765 sdk_version: "none",
7766 system_modules: "none",
7767 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007768
7769 prebuilt_apis {
7770 name: "sdk",
7771 api_dirs: ["100"],
7772 }
Paul Duffin9b879592020-05-26 13:21:35 +01007773 `, withFiles(filesForSdkLibrary))
7774
7775 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007776 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007777 "javalib/foo.jar",
7778 "etc/permissions/foo.xml",
7779 })
7780
7781 // The bar library should depend on the stubs jar.
7782 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007783 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007784 t.Errorf("expected %q, found %#q", expected, actual)
7785 }
7786}
7787
Paul Duffineedc5d52020-06-12 17:46:39 +01007788func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007789 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007790 prebuilt_apis {
7791 name: "sdk",
7792 api_dirs: ["100"],
7793 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007794 withFiles(map[string][]byte{
7795 "apex/a.java": nil,
7796 "apex/apex_manifest.json": nil,
7797 "apex/Android.bp": []byte(`
7798 package {
7799 default_visibility: ["//visibility:private"],
7800 }
7801
7802 apex {
7803 name: "myapex",
7804 key: "myapex.key",
7805 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007806 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007807 }
7808
7809 apex_key {
7810 name: "myapex.key",
7811 public_key: "testkey.avbpubkey",
7812 private_key: "testkey.pem",
7813 }
7814
7815 java_library {
7816 name: "bar",
7817 srcs: ["a.java"],
7818 libs: ["foo"],
7819 apex_available: ["myapex"],
7820 sdk_version: "none",
7821 system_modules: "none",
7822 }
7823`),
7824 "source/a.java": nil,
7825 "source/api/current.txt": nil,
7826 "source/api/removed.txt": nil,
7827 "source/Android.bp": []byte(`
7828 package {
7829 default_visibility: ["//visibility:private"],
7830 }
7831
7832 java_sdk_library {
7833 name: "foo",
7834 visibility: ["//apex"],
7835 srcs: ["a.java"],
7836 api_packages: ["foo"],
7837 apex_available: ["myapex"],
7838 sdk_version: "none",
7839 system_modules: "none",
7840 public: {
7841 enabled: true,
7842 },
7843 }
7844`),
7845 "prebuilt/a.jar": nil,
7846 "prebuilt/Android.bp": []byte(`
7847 package {
7848 default_visibility: ["//visibility:private"],
7849 }
7850
7851 java_sdk_library_import {
7852 name: "foo",
7853 visibility: ["//apex", "//source"],
7854 apex_available: ["myapex"],
7855 prefer: true,
7856 public: {
7857 jars: ["a.jar"],
7858 },
7859 }
7860`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007861 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007862 )
7863
7864 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007865 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007866 "javalib/bar.jar",
7867 "javalib/foo.jar",
7868 "etc/permissions/foo.xml",
7869 })
7870
7871 // The bar library should depend on the implementation jar.
7872 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007873 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007874 t.Errorf("expected %q, found %#q", expected, actual)
7875 }
7876}
7877
7878func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7879 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7880 apex {
7881 name: "myapex",
7882 key: "myapex.key",
7883 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007884 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007885 }
7886
7887 apex_key {
7888 name: "myapex.key",
7889 public_key: "testkey.avbpubkey",
7890 private_key: "testkey.pem",
7891 }
7892
7893 java_sdk_library_import {
7894 name: "foo",
7895 apex_available: ["myapex"],
7896 prefer: true,
7897 public: {
7898 jars: ["a.jar"],
7899 },
7900 }
7901
7902 `, withFiles(filesForSdkLibrary))
7903}
7904
atrost6e126252020-01-27 17:01:16 +00007905func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007906 result := android.GroupFixturePreparers(
7907 prepareForApexTest,
7908 java.PrepareForTestWithPlatformCompatConfig,
7909 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007910 apex {
7911 name: "myapex",
7912 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007913 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007914 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007915 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007916 }
7917
7918 apex_key {
7919 name: "myapex.key",
7920 public_key: "testkey.avbpubkey",
7921 private_key: "testkey.pem",
7922 }
7923
7924 platform_compat_config {
7925 name: "myjar-platform-compat-config",
7926 src: ":myjar",
7927 }
7928
7929 java_library {
7930 name: "myjar",
7931 srcs: ["foo/bar/MyClass.java"],
7932 sdk_version: "none",
7933 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007934 apex_available: [ "myapex" ],
7935 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007936
7937 // Make sure that a preferred prebuilt does not affect the apex contents.
7938 prebuilt_platform_compat_config {
7939 name: "myjar-platform-compat-config",
7940 metadata: "compat-config/metadata.xml",
7941 prefer: true,
7942 }
atrost6e126252020-01-27 17:01:16 +00007943 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007944 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007945 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007946 "etc/compatconfig/myjar-platform-compat-config.xml",
7947 "javalib/myjar.jar",
7948 })
7949}
7950
Jooyung Han862c0d62022-12-21 10:15:37 +09007951func TestNoDupeApexFiles(t *testing.T) {
7952 android.GroupFixturePreparers(
7953 android.PrepareForTestWithAndroidBuildComponents,
7954 PrepareForTestWithApexBuildComponents,
7955 prepareForTestWithMyapex,
7956 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7957 ).
7958 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7959 RunTestWithBp(t, `
7960 apex {
7961 name: "myapex",
7962 key: "myapex.key",
7963 prebuilts: ["foo", "bar"],
7964 updatable: false,
7965 }
7966
7967 apex_key {
7968 name: "myapex.key",
7969 public_key: "testkey.avbpubkey",
7970 private_key: "testkey.pem",
7971 }
7972
7973 prebuilt_etc {
7974 name: "foo",
7975 src: "myprebuilt",
7976 filename_from_src: true,
7977 }
7978
7979 prebuilt_etc {
7980 name: "bar",
7981 src: "myprebuilt",
7982 filename_from_src: true,
7983 }
7984 `)
7985}
7986
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007987func TestApexUnwantedTransitiveDeps(t *testing.T) {
7988 bp := `
7989 apex {
7990 name: "myapex",
7991 key: "myapex.key",
7992 native_shared_libs: ["libfoo"],
7993 updatable: false,
7994 unwanted_transitive_deps: ["libbar"],
7995 }
7996
7997 apex_key {
7998 name: "myapex.key",
7999 public_key: "testkey.avbpubkey",
8000 private_key: "testkey.pem",
8001 }
8002
8003 cc_library {
8004 name: "libfoo",
8005 srcs: ["foo.cpp"],
8006 shared_libs: ["libbar"],
8007 apex_available: ["myapex"],
8008 }
8009
8010 cc_library {
8011 name: "libbar",
8012 srcs: ["bar.cpp"],
8013 apex_available: ["myapex"],
8014 }`
8015 ctx := testApex(t, bp)
8016 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8017 "*/libc++.so",
8018 "*/libfoo.so",
8019 // not libbar.so
8020 })
8021}
8022
Jiyong Park479321d2019-12-16 11:47:12 +09008023func TestRejectNonInstallableJavaLibrary(t *testing.T) {
8024 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8025 apex {
8026 name: "myapex",
8027 key: "myapex.key",
8028 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008029 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008030 }
8031
8032 apex_key {
8033 name: "myapex.key",
8034 public_key: "testkey.avbpubkey",
8035 private_key: "testkey.pem",
8036 }
8037
8038 java_library {
8039 name: "myjar",
8040 srcs: ["foo/bar/MyClass.java"],
8041 sdk_version: "none",
8042 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008043 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008044 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008045 }
8046 `)
8047}
8048
Jiyong Park7afd1072019-12-30 16:56:33 +09008049func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008050 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09008051 apex {
8052 name: "myapex",
8053 key: "myapex.key",
8054 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008055 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09008056 }
8057
8058 apex_key {
8059 name: "myapex.key",
8060 public_key: "testkey.avbpubkey",
8061 private_key: "testkey.pem",
8062 }
8063
8064 cc_library {
8065 name: "mylib",
8066 srcs: ["mylib.cpp"],
8067 system_shared_libs: [],
8068 stl: "none",
8069 required: ["a", "b"],
8070 host_required: ["c", "d"],
8071 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00008072 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09008073 }
8074 `)
8075
Jooyung Hana0503a52023-08-23 13:12:50 +09008076 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008077 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09008078 name := apexBundle.BaseModuleName()
8079 prefix := "TARGET_"
8080 var builder strings.Builder
8081 data.Custom(&builder, name, prefix, "", data)
8082 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008083 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08008084 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
8085 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09008086}
8087
Jiyong Park7cd10e32020-01-14 09:22:18 +09008088func TestSymlinksFromApexToSystem(t *testing.T) {
8089 bp := `
8090 apex {
8091 name: "myapex",
8092 key: "myapex.key",
8093 native_shared_libs: ["mylib"],
8094 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008095 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008096 }
8097
Jiyong Park9d677202020-02-19 16:29:35 +09008098 apex {
8099 name: "myapex.updatable",
8100 key: "myapex.key",
8101 native_shared_libs: ["mylib"],
8102 java_libs: ["myjar"],
8103 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008104 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008105 }
8106
Jiyong Park7cd10e32020-01-14 09:22:18 +09008107 apex_key {
8108 name: "myapex.key",
8109 public_key: "testkey.avbpubkey",
8110 private_key: "testkey.pem",
8111 }
8112
8113 cc_library {
8114 name: "mylib",
8115 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008116 shared_libs: [
8117 "myotherlib",
8118 "myotherlib_ext",
8119 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008120 system_shared_libs: [],
8121 stl: "none",
8122 apex_available: [
8123 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008124 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008125 "//apex_available:platform",
8126 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008127 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008128 }
8129
8130 cc_library {
8131 name: "myotherlib",
8132 srcs: ["mylib.cpp"],
8133 system_shared_libs: [],
8134 stl: "none",
8135 apex_available: [
8136 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008137 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008138 "//apex_available:platform",
8139 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008140 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008141 }
8142
Jiyong Parkce243632023-02-17 18:22:25 +09008143 cc_library {
8144 name: "myotherlib_ext",
8145 srcs: ["mylib.cpp"],
8146 system_shared_libs: [],
8147 system_ext_specific: true,
8148 stl: "none",
8149 apex_available: [
8150 "myapex",
8151 "myapex.updatable",
8152 "//apex_available:platform",
8153 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008154 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008155 }
8156
Jiyong Park7cd10e32020-01-14 09:22:18 +09008157 java_library {
8158 name: "myjar",
8159 srcs: ["foo/bar/MyClass.java"],
8160 sdk_version: "none",
8161 system_modules: "none",
8162 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008163 apex_available: [
8164 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008165 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008166 "//apex_available:platform",
8167 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008168 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008169 }
8170
8171 java_library {
8172 name: "myotherjar",
8173 srcs: ["foo/bar/MyClass.java"],
8174 sdk_version: "none",
8175 system_modules: "none",
8176 apex_available: [
8177 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008178 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008179 "//apex_available:platform",
8180 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008181 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008182 }
8183 `
8184
8185 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8186 for _, f := range files {
8187 if f.path == file {
8188 if f.isLink {
8189 t.Errorf("%q is not a real file", file)
8190 }
8191 return
8192 }
8193 }
8194 t.Errorf("%q is not found", file)
8195 }
8196
Jiyong Parkce243632023-02-17 18:22:25 +09008197 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008198 for _, f := range files {
8199 if f.path == file {
8200 if !f.isLink {
8201 t.Errorf("%q is not a symlink", file)
8202 }
Jiyong Parkce243632023-02-17 18:22:25 +09008203 if f.src != target {
8204 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8205 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008206 return
8207 }
8208 }
8209 t.Errorf("%q is not found", file)
8210 }
8211
Jiyong Park9d677202020-02-19 16:29:35 +09008212 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8213 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008214 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008215 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008216 ensureRealfileExists(t, files, "javalib/myjar.jar")
8217 ensureRealfileExists(t, files, "lib64/mylib.so")
8218 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008219 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008220
Jooyung Hana0503a52023-08-23 13:12:50 +09008221 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008222 ensureRealfileExists(t, files, "javalib/myjar.jar")
8223 ensureRealfileExists(t, files, "lib64/mylib.so")
8224 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008225 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008226
8227 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008228 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008229 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008230 ensureRealfileExists(t, files, "javalib/myjar.jar")
8231 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008232 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8233 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008234
Jooyung Hana0503a52023-08-23 13:12:50 +09008235 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008236 ensureRealfileExists(t, files, "javalib/myjar.jar")
8237 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008238 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8239 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008240}
8241
Yo Chiange8128052020-07-23 20:09:18 +08008242func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008243 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008244 apex {
8245 name: "myapex",
8246 key: "myapex.key",
8247 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008248 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008249 }
8250
8251 apex_key {
8252 name: "myapex.key",
8253 public_key: "testkey.avbpubkey",
8254 private_key: "testkey.pem",
8255 }
8256
8257 cc_library_shared {
8258 name: "mylib",
8259 srcs: ["mylib.cpp"],
8260 shared_libs: ["myotherlib"],
8261 system_shared_libs: [],
8262 stl: "none",
8263 apex_available: [
8264 "myapex",
8265 "//apex_available:platform",
8266 ],
8267 }
8268
8269 cc_prebuilt_library_shared {
8270 name: "myotherlib",
8271 srcs: ["prebuilt.so"],
8272 system_shared_libs: [],
8273 stl: "none",
8274 apex_available: [
8275 "myapex",
8276 "//apex_available:platform",
8277 ],
8278 }
8279 `)
8280
Jooyung Hana0503a52023-08-23 13:12:50 +09008281 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008282 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008283 var builder strings.Builder
8284 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8285 androidMk := builder.String()
8286 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008287 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008288 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8289 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8290 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008291 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008292}
8293
Jooyung Han643adc42020-02-27 13:50:06 +09008294func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008295 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008296 apex {
8297 name: "myapex",
8298 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008299 binaries: ["mybin"],
8300 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008301 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008302 }
8303
8304 apex_key {
8305 name: "myapex.key",
8306 public_key: "testkey.avbpubkey",
8307 private_key: "testkey.pem",
8308 }
8309
8310 cc_library {
8311 name: "mylib",
8312 srcs: ["mylib.cpp"],
8313 shared_libs: ["mylib2"],
8314 system_shared_libs: [],
8315 stl: "none",
8316 apex_available: [ "myapex" ],
8317 }
8318
8319 cc_library {
8320 name: "mylib2",
8321 srcs: ["mylib.cpp"],
8322 system_shared_libs: [],
8323 stl: "none",
8324 apex_available: [ "myapex" ],
8325 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008326
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008327 // Used as both a JNI library and a regular shared library.
8328 cc_library {
8329 name: "mylib3",
8330 srcs: ["mylib.cpp"],
8331 system_shared_libs: [],
8332 stl: "none",
8333 apex_available: [ "myapex" ],
8334 }
8335
8336 cc_binary {
8337 name: "mybin",
8338 srcs: ["mybin.cpp"],
8339 shared_libs: ["mylib3"],
8340 system_shared_libs: [],
8341 stl: "none",
8342 apex_available: [ "myapex" ],
8343 }
8344
Jiyong Park34d5c332022-02-24 18:02:44 +09008345 rust_ffi_shared {
8346 name: "libfoo.rust",
8347 crate_name: "foo",
8348 srcs: ["foo.rs"],
8349 shared_libs: ["libfoo.shared_from_rust"],
8350 prefer_rlib: true,
8351 apex_available: ["myapex"],
8352 }
8353
8354 cc_library_shared {
8355 name: "libfoo.shared_from_rust",
8356 srcs: ["mylib.cpp"],
8357 system_shared_libs: [],
8358 stl: "none",
8359 stubs: {
8360 versions: ["10", "11", "12"],
8361 },
8362 }
8363
Jooyung Han643adc42020-02-27 13:50:06 +09008364 `)
8365
Jooyung Hana0503a52023-08-23 13:12:50 +09008366 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008367 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008368 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008369 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008370 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008371 "lib64/mylib.so",
8372 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008373 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008374 "lib64/libfoo.rust.so",
8375 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8376 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008377 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008378
8379 // b/220397949
8380 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008381}
8382
Jooyung Han49f67012020-04-17 13:43:10 +09008383func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008384 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008385 apex {
8386 name: "myapex",
8387 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008388 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008389 }
8390 apex_key {
8391 name: "myapex.key",
8392 public_key: "testkey.avbpubkey",
8393 private_key: "testkey.pem",
8394 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008395 `,
8396 android.FixtureModifyConfig(func(config android.Config) {
8397 delete(config.Targets, android.Android)
8398 config.AndroidCommonTarget = android.Target{}
8399 }),
8400 )
Jooyung Han49f67012020-04-17 13:43:10 +09008401
8402 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8403 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8404 }
8405}
8406
Jiyong Parkbd159612020-02-28 15:22:21 +09008407func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008408 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008409 apex {
8410 name: "myapex",
8411 key: "myapex.key",
8412 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008413 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008414 }
8415
8416 apex_key {
8417 name: "myapex.key",
8418 public_key: "testkey.avbpubkey",
8419 private_key: "testkey.pem",
8420 }
8421
8422 android_app {
8423 name: "AppFoo",
8424 srcs: ["foo/bar/MyClass.java"],
8425 sdk_version: "none",
8426 system_modules: "none",
8427 apex_available: [ "myapex" ],
8428 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008429 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008430
Jooyung Hana0503a52023-08-23 13:12:50 +09008431 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008432 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008433
8434 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008435 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 +09008436}
8437
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008438func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008439 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008440 apex {
8441 name: "myapex",
8442 key: "myapex.key",
8443 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008444 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008445 }
8446
8447 apex_key {
8448 name: "myapex.key",
8449 public_key: "testkey.avbpubkey",
8450 private_key: "testkey.pem",
8451 }
8452
8453 android_app_set {
8454 name: "AppSet",
8455 set: "AppSet.apks",
8456 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008457 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008458 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008459 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008460 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8461 s := mod.Rule("apexRule").Args["copy_commands"]
8462 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008463 if len(copyCmds) != 4 {
8464 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008465 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008466 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8467 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008468 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8469 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008470
8471 // Ensure that canned_fs_config has an entry for the app set zip file
8472 generateFsRule := mod.Rule("generateFsConfig")
8473 cmd := generateFsRule.RuleParams.Command
8474 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008475}
8476
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008477func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008478 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008479 apex_set {
8480 name: "myapex",
8481 filename: "foo_v2.apex",
8482 sanitized: {
8483 none: { set: "myapex.apks", },
8484 hwaddress: { set: "myapex.hwasan.apks", },
8485 },
Paul Duffin24704672021-04-06 16:09:30 +01008486 }
8487 `
8488 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008489
Paul Duffin24704672021-04-06 16:09:30 +01008490 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008491 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008492
Spandan Das3576e762024-01-03 18:57:03 +00008493 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008494 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008495
Paul Duffin24704672021-04-06 16:09:30 +01008496 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8497
8498 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008499 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8500 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008501
8502 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008503}
8504
Pranav Guptaeba03b02022-09-27 00:27:08 +00008505func TestApexSetApksModuleAssignment(t *testing.T) {
8506 ctx := testApex(t, `
8507 apex_set {
8508 name: "myapex",
8509 set: ":myapex_apks_file",
8510 }
8511
8512 filegroup {
8513 name: "myapex_apks_file",
8514 srcs: ["myapex.apks"],
8515 }
8516 `)
8517
Spandan Das3576e762024-01-03 18:57:03 +00008518 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008519
8520 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008521 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008522 extractedApex := m.Output(extractorOutput)
8523
8524 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8525}
8526
Paul Duffin89f570a2021-06-16 01:42:33 +01008527func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008528 t.Helper()
8529
Paul Duffin55607122021-03-30 23:32:51 +01008530 fs := android.MockFS{
8531 "a.java": nil,
8532 "a.jar": nil,
8533 "apex_manifest.json": nil,
8534 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008535 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008536 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8537 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8538 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008539 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008540 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008541
Paul Duffin55607122021-03-30 23:32:51 +01008542 errorHandler := android.FixtureExpectsNoErrors
8543 if errmsg != "" {
8544 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008545 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008546
Paul Duffin55607122021-03-30 23:32:51 +01008547 result := android.GroupFixturePreparers(
8548 cc.PrepareForTestWithCcDefaultModules,
8549 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008550 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008551 java.PrepareForTestWithJavaSdkLibraryFiles,
8552 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008553 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008554 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008555 android.FixtureModifyMockFS(func(fs android.MockFS) {
8556 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8557 insert := ""
8558 for _, fragment := range fragments {
8559 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8560 }
8561 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8562 platform_bootclasspath {
8563 name: "platform-bootclasspath",
8564 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008565 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008566 %s
8567 ],
8568 }
8569 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008570 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008571 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008572 // Dexpreopt for boot jars requires the ART boot image profile.
8573 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8574 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008575 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008576 ).
8577 ExtendWithErrorHandler(errorHandler).
8578 RunTestWithBp(t, bp)
8579
8580 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008581}
8582
Paul Duffin5556c5f2022-06-09 17:32:21 +00008583func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008584 preparers := android.GroupFixturePreparers(
8585 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008586 prepareForTestWithBootclasspathFragment,
8587 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008588 PrepareForTestWithApexBuildComponents,
8589 ).
8590 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008591 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008592
8593 bpBase := `
8594 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008595 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008596 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008597 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008598 set: "myapex.apks",
8599 }
8600
8601 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008602 name: "com.mycompany.android.art",
8603 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008604 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008605 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008606 set: "company-myapex.apks",
8607 }
8608
8609 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008610 name: "art-bootclasspath-fragment",
8611 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008612 hidden_api: {
8613 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8614 metadata: "my-bootclasspath-fragment/metadata.csv",
8615 index: "my-bootclasspath-fragment/index.csv",
8616 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8617 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8618 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008619 %s
8620 }
8621 `
8622
8623 t.Run("java_import", func(t *testing.T) {
8624 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8625 java_import {
8626 name: "libfoo",
8627 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008628 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008629 }
8630 `)
8631 })
8632
8633 t.Run("java_sdk_library_import", func(t *testing.T) {
8634 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8635 java_sdk_library_import {
8636 name: "libfoo",
8637 public: {
8638 jars: ["libbar.jar"],
8639 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008640 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008641 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008642 }
8643 `)
8644 })
8645
8646 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8647 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8648 image_name: "art",
8649 contents: ["libfoo"],
8650 `)+`
8651 java_sdk_library_import {
8652 name: "libfoo",
8653 public: {
8654 jars: ["libbar.jar"],
8655 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008656 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008657 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008658 }
8659 `)
8660 })
8661}
8662
Paul Duffin5556c5f2022-06-09 17:32:21 +00008663func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8664 preparers := android.GroupFixturePreparers(
8665 java.PrepareForTestWithJavaDefaultModules,
8666 PrepareForTestWithApexBuildComponents,
8667 )
8668
Spandan Das59a4a2b2024-01-09 21:35:56 +00008669 errCtx := moduleErrorfTestCtx{}
8670
Paul Duffin5556c5f2022-06-09 17:32:21 +00008671 bpBase := `
8672 apex_set {
8673 name: "com.android.myapex",
8674 installable: true,
8675 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8676 set: "myapex.apks",
8677 }
8678
8679 apex_set {
8680 name: "com.android.myapex_compressed",
8681 apex_name: "com.android.myapex",
8682 installable: true,
8683 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8684 set: "myapex_compressed.apks",
8685 }
8686
8687 prebuilt_bootclasspath_fragment {
8688 name: "my-bootclasspath-fragment",
8689 apex_available: [
8690 "com.android.myapex",
8691 "com.android.myapex_compressed",
8692 ],
8693 hidden_api: {
8694 annotation_flags: "annotation-flags.csv",
8695 metadata: "metadata.csv",
8696 index: "index.csv",
8697 signature_patterns: "signature_patterns.csv",
8698 },
8699 %s
8700 }
8701 `
8702
8703 t.Run("java_import", func(t *testing.T) {
8704 result := preparers.RunTestWithBp(t,
8705 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8706 java_import {
8707 name: "libfoo",
8708 jars: ["libfoo.jar"],
8709 apex_available: [
8710 "com.android.myapex",
8711 "com.android.myapex_compressed",
8712 ],
8713 }
8714 `)
8715
8716 module := result.Module("libfoo", "android_common_com.android.myapex")
8717 usesLibraryDep := module.(java.UsesLibraryDependency)
8718 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008719 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008720 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008721 })
8722
8723 t.Run("java_sdk_library_import", func(t *testing.T) {
8724 result := preparers.RunTestWithBp(t,
8725 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8726 java_sdk_library_import {
8727 name: "libfoo",
8728 public: {
8729 jars: ["libbar.jar"],
8730 },
8731 apex_available: [
8732 "com.android.myapex",
8733 "com.android.myapex_compressed",
8734 ],
8735 compile_dex: true,
8736 }
8737 `)
8738
8739 module := result.Module("libfoo", "android_common_com.android.myapex")
8740 usesLibraryDep := module.(java.UsesLibraryDependency)
8741 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008742 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008743 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008744 })
8745
8746 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8747 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8748 image_name: "art",
8749 contents: ["libfoo"],
8750 `)+`
8751 java_sdk_library_import {
8752 name: "libfoo",
8753 public: {
8754 jars: ["libbar.jar"],
8755 },
8756 apex_available: [
8757 "com.android.myapex",
8758 "com.android.myapex_compressed",
8759 ],
8760 compile_dex: true,
8761 }
8762 `)
8763 })
8764}
8765
Jooyung Han548640b2020-04-27 12:10:30 +09008766func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8767 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8768 apex {
8769 name: "myapex",
8770 key: "myapex.key",
8771 updatable: true,
8772 }
8773
8774 apex_key {
8775 name: "myapex.key",
8776 public_key: "testkey.avbpubkey",
8777 private_key: "testkey.pem",
8778 }
8779 `)
8780}
8781
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008782func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8783 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8784 apex {
8785 name: "myapex",
8786 key: "myapex.key",
8787 }
8788
8789 apex_key {
8790 name: "myapex.key",
8791 public_key: "testkey.avbpubkey",
8792 private_key: "testkey.pem",
8793 }
8794 `)
8795}
8796
Jooyung Handfc864c2023-03-20 18:19:07 +09008797func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8798 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008799 apex {
8800 name: "myapex",
8801 key: "myapex.key",
8802 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008803 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008804 soc_specific: true,
8805 }
8806
8807 apex_key {
8808 name: "myapex.key",
8809 public_key: "testkey.avbpubkey",
8810 private_key: "testkey.pem",
8811 }
8812 `)
8813}
8814
Jooyung Han02873da2023-03-22 17:41:03 +09008815func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8816 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8817 apex {
8818 name: "myapex",
8819 key: "myapex.key",
8820 updatable: false,
8821 min_sdk_version: "29",
8822 use_vndk_as_stable: true,
8823 vendor: true,
8824 }
8825
8826 apex_key {
8827 name: "myapex.key",
8828 public_key: "testkey.avbpubkey",
8829 private_key: "testkey.pem",
8830 }
8831 `)
8832}
8833
Jooyung Handfc864c2023-03-20 18:19:07 +09008834func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8835 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8836 apex {
8837 name: "myapex",
8838 key: "myapex.key",
8839 updatable: false,
8840 use_vndk_as_stable: true,
8841 }
8842
8843 apex_key {
8844 name: "myapex.key",
8845 public_key: "testkey.avbpubkey",
8846 private_key: "testkey.pem",
8847 }
8848 `)
8849}
8850
satayevb98371c2021-06-15 16:49:50 +01008851func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8852 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8853 apex {
8854 name: "myapex",
8855 key: "myapex.key",
8856 systemserverclasspath_fragments: [
8857 "mysystemserverclasspathfragment",
8858 ],
8859 min_sdk_version: "29",
8860 updatable: true,
8861 }
8862
8863 apex_key {
8864 name: "myapex.key",
8865 public_key: "testkey.avbpubkey",
8866 private_key: "testkey.pem",
8867 }
8868
8869 java_library {
8870 name: "foo",
8871 srcs: ["b.java"],
8872 min_sdk_version: "29",
8873 installable: true,
8874 apex_available: [
8875 "myapex",
8876 ],
8877 }
8878
8879 systemserverclasspath_fragment {
8880 name: "mysystemserverclasspathfragment",
8881 generate_classpaths_proto: false,
8882 contents: [
8883 "foo",
8884 ],
8885 apex_available: [
8886 "myapex",
8887 ],
8888 }
satayevabcd5972021-08-06 17:49:46 +01008889 `,
8890 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8891 )
satayevb98371c2021-06-15 16:49:50 +01008892}
8893
Paul Duffin064b70c2020-11-02 17:32:38 +00008894func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008895 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008896 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008897 fragment := java.ApexVariantReference{
8898 Apex: proptools.StringPtr("myapex"),
8899 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8900 }
8901
Paul Duffin064b70c2020-11-02 17:32:38 +00008902 testDexpreoptWithApexes(t, `
8903 prebuilt_apex {
8904 name: "myapex" ,
8905 arch: {
8906 arm64: {
8907 src: "myapex-arm64.apex",
8908 },
8909 arm: {
8910 src: "myapex-arm.apex",
8911 },
8912 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008913 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8914 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008915
Paul Duffin89f570a2021-06-16 01:42:33 +01008916 prebuilt_bootclasspath_fragment {
8917 name: "my-bootclasspath-fragment",
8918 contents: ["libfoo"],
8919 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008920 hidden_api: {
8921 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8922 metadata: "my-bootclasspath-fragment/metadata.csv",
8923 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008924 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8925 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8926 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008927 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008928 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008929
Paul Duffin89f570a2021-06-16 01:42:33 +01008930 java_import {
8931 name: "libfoo",
8932 jars: ["libfoo.jar"],
8933 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008934 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008935 }
8936 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008937 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008938}
8939
Spandan Dasf14e2542021-11-12 00:01:37 +00008940func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008941 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008942 bp += `
8943 apex_key {
8944 name: "myapex.key",
8945 public_key: "testkey.avbpubkey",
8946 private_key: "testkey.pem",
8947 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008948 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008949 "lib1/src/A.java": nil,
8950 "lib2/src/B.java": nil,
8951 "system/sepolicy/apex/myapex-file_contexts": nil,
8952 }
8953
Paul Duffin45338f02021-03-30 23:07:52 +01008954 errorHandler := android.FixtureExpectsNoErrors
8955 if errmsg != "" {
8956 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008957 }
Colin Crossae8600b2020-10-29 17:09:13 -07008958
Paul Duffin45338f02021-03-30 23:07:52 +01008959 android.GroupFixturePreparers(
8960 android.PrepareForTestWithAndroidBuildComponents,
8961 java.PrepareForTestWithJavaBuildComponents,
8962 PrepareForTestWithApexBuildComponents,
8963 android.PrepareForTestWithNeverallowRules(rules),
8964 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008965 apexBootJars := make([]string, 0, len(bootJars))
8966 for _, apexBootJar := range bootJars {
8967 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008968 }
satayevd604b212021-07-21 14:23:52 +01008969 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008970 }),
8971 fs.AddToFixture(),
8972 ).
8973 ExtendWithErrorHandler(errorHandler).
8974 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008975}
8976
8977func TestApexPermittedPackagesRules(t *testing.T) {
8978 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008979 name string
8980 expectedError string
8981 bp string
8982 bootJars []string
8983 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008984 }{
8985
8986 {
8987 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8988 expectedError: "",
8989 bp: `
8990 java_library {
8991 name: "bcp_lib1",
8992 srcs: ["lib1/src/*.java"],
8993 permitted_packages: ["foo.bar"],
8994 apex_available: ["myapex"],
8995 sdk_version: "none",
8996 system_modules: "none",
8997 }
8998 java_library {
8999 name: "nonbcp_lib2",
9000 srcs: ["lib2/src/*.java"],
9001 apex_available: ["myapex"],
9002 permitted_packages: ["a.b"],
9003 sdk_version: "none",
9004 system_modules: "none",
9005 }
9006 apex {
9007 name: "myapex",
9008 key: "myapex.key",
9009 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009010 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01009011 }`,
9012 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00009013 bcpPermittedPackages: map[string][]string{
9014 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01009015 "foo.bar",
9016 },
9017 },
9018 },
9019 {
Anton Hanssone1b18362021-12-23 15:05:38 +00009020 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00009021 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 +01009022 bp: `
9023 java_library {
9024 name: "bcp_lib1",
9025 srcs: ["lib1/src/*.java"],
9026 apex_available: ["myapex"],
9027 permitted_packages: ["foo.bar"],
9028 sdk_version: "none",
9029 system_modules: "none",
9030 }
9031 java_library {
9032 name: "bcp_lib2",
9033 srcs: ["lib2/src/*.java"],
9034 apex_available: ["myapex"],
9035 permitted_packages: ["foo.bar", "bar.baz"],
9036 sdk_version: "none",
9037 system_modules: "none",
9038 }
9039 apex {
9040 name: "myapex",
9041 key: "myapex.key",
9042 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009043 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01009044 }
9045 `,
9046 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00009047 bcpPermittedPackages: map[string][]string{
9048 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01009049 "foo.bar",
9050 },
Spandan Dasf14e2542021-11-12 00:01:37 +00009051 "bcp_lib2": []string{
9052 "foo.bar",
9053 },
9054 },
9055 },
9056 {
9057 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
9058 expectedError: "",
9059 bp: `
9060 java_library {
9061 name: "bcp_lib_restricted",
9062 srcs: ["lib1/src/*.java"],
9063 apex_available: ["myapex"],
9064 permitted_packages: ["foo.bar"],
9065 sdk_version: "none",
9066 min_sdk_version: "29",
9067 system_modules: "none",
9068 }
9069 java_library {
9070 name: "bcp_lib_unrestricted",
9071 srcs: ["lib2/src/*.java"],
9072 apex_available: ["myapex"],
9073 permitted_packages: ["foo.bar", "bar.baz"],
9074 sdk_version: "none",
9075 min_sdk_version: "29",
9076 system_modules: "none",
9077 }
9078 apex {
9079 name: "myapex",
9080 key: "myapex.key",
9081 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
9082 updatable: true,
9083 min_sdk_version: "29",
9084 }
9085 `,
9086 bootJars: []string{"bcp_lib1", "bcp_lib2"},
9087 bcpPermittedPackages: map[string][]string{
9088 "bcp_lib1_non_updateable": []string{
9089 "foo.bar",
9090 },
9091 // 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 +01009092 },
9093 },
9094 }
9095 for _, tc := range testcases {
9096 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009097 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9098 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009099 })
9100 }
9101}
9102
Jiyong Park62304bb2020-04-13 16:19:48 +09009103func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009104 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009105 apex {
9106 name: "myapex",
9107 key: "myapex.key",
9108 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009109 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009110 }
9111
9112 apex_key {
9113 name: "myapex.key",
9114 public_key: "testkey.avbpubkey",
9115 private_key: "testkey.pem",
9116 }
9117
9118 cc_library {
9119 name: "mylib",
9120 srcs: ["mylib.cpp"],
9121 system_shared_libs: [],
9122 stl: "none",
9123 stubs: {
9124 versions: ["1"],
9125 },
9126 apex_available: ["myapex"],
9127 }
9128
9129 cc_library {
9130 name: "myprivlib",
9131 srcs: ["mylib.cpp"],
9132 system_shared_libs: [],
9133 stl: "none",
9134 apex_available: ["myapex"],
9135 }
9136
9137
9138 cc_test {
9139 name: "mytest",
9140 gtest: false,
9141 srcs: ["mylib.cpp"],
9142 system_shared_libs: [],
9143 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009144 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009145 test_for: ["myapex"]
9146 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009147
9148 cc_library {
9149 name: "mytestlib",
9150 srcs: ["mylib.cpp"],
9151 system_shared_libs: [],
9152 shared_libs: ["mylib", "myprivlib"],
9153 stl: "none",
9154 test_for: ["myapex"],
9155 }
9156
9157 cc_benchmark {
9158 name: "mybench",
9159 srcs: ["mylib.cpp"],
9160 system_shared_libs: [],
9161 shared_libs: ["mylib", "myprivlib"],
9162 stl: "none",
9163 test_for: ["myapex"],
9164 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009165 `)
9166
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009167 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009168 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009169 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9170 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9171 }
9172
9173 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009174 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009175 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9176 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9177 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9178}
Jiyong Park46a512f2020-12-04 18:02:13 +09009179
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009180func TestIndirectTestFor(t *testing.T) {
9181 ctx := testApex(t, `
9182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
9185 native_shared_libs: ["mylib", "myprivlib"],
9186 updatable: false,
9187 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009188
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
9194
9195 cc_library {
9196 name: "mylib",
9197 srcs: ["mylib.cpp"],
9198 system_shared_libs: [],
9199 stl: "none",
9200 stubs: {
9201 versions: ["1"],
9202 },
9203 apex_available: ["myapex"],
9204 }
9205
9206 cc_library {
9207 name: "myprivlib",
9208 srcs: ["mylib.cpp"],
9209 system_shared_libs: [],
9210 stl: "none",
9211 shared_libs: ["mylib"],
9212 apex_available: ["myapex"],
9213 }
9214
9215 cc_library {
9216 name: "mytestlib",
9217 srcs: ["mylib.cpp"],
9218 system_shared_libs: [],
9219 shared_libs: ["myprivlib"],
9220 stl: "none",
9221 test_for: ["myapex"],
9222 }
9223 `)
9224
9225 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009226 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009227 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9228 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9229 }
9230
9231 // The platform variant of mytestlib links to the platform variant of the
9232 // internal myprivlib.
9233 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9234
9235 // The platform variant of myprivlib links to the platform variant of mylib
9236 // and bypasses its stubs.
9237 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09009238}
9239
Martin Stjernholmec009002021-03-27 15:18:31 +00009240func TestTestForForLibInOtherApex(t *testing.T) {
9241 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9242 _ = testApex(t, `
9243 apex {
9244 name: "com.android.art",
9245 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009246 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009247 updatable: false,
9248 }
9249
9250 apex {
9251 name: "com.android.art.debug",
9252 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009253 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009254 updatable: false,
9255 }
9256
9257 apex_key {
9258 name: "myapex.key",
9259 public_key: "testkey.avbpubkey",
9260 private_key: "testkey.pem",
9261 }
9262
9263 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009264 name: "libnativebridge",
9265 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009266 system_shared_libs: [],
9267 stl: "none",
9268 stubs: {
9269 versions: ["1"],
9270 },
9271 apex_available: ["com.android.art", "com.android.art.debug"],
9272 }
9273
9274 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009275 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009276 srcs: ["mylib.cpp"],
9277 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009278 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009279 stl: "none",
9280 apex_available: ["com.android.art.debug"],
9281 test_for: ["com.android.art"],
9282 }
9283 `,
9284 android.MockFS{
9285 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9286 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9287 }.AddToFixture())
9288}
9289
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009290// TODO(jungjw): Move this to proptools
9291func intPtr(i int) *int {
9292 return &i
9293}
9294
9295func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009296 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009297 apex_set {
9298 name: "myapex",
9299 set: "myapex.apks",
9300 filename: "foo_v2.apex",
9301 overrides: ["foo"],
9302 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009303 `,
9304 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9305 variables.Platform_sdk_version = intPtr(30)
9306 }),
9307 android.FixtureModifyConfig(func(config android.Config) {
9308 config.Targets[android.Android] = []android.Target{
9309 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9310 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9311 }
9312 }),
9313 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009314
Spandan Das3576e762024-01-03 18:57:03 +00009315 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009316
9317 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009318 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009319 actual := extractedApex.Args["abis"]
9320 expected := "ARMEABI_V7A,ARM64_V8A"
9321 if actual != expected {
9322 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9323 }
9324 actual = extractedApex.Args["sdk-version"]
9325 expected = "30"
9326 if actual != expected {
9327 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9328 }
9329
Paul Duffin6717d882021-06-15 19:09:41 +01009330 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009331 a := m.Module().(*ApexSet)
9332 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009333 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009334 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9335 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9336 }
9337}
9338
Anton Hansson805e0a52022-11-25 14:06:46 +00009339func TestApexSet_NativeBridge(t *testing.T) {
9340 ctx := testApex(t, `
9341 apex_set {
9342 name: "myapex",
9343 set: "myapex.apks",
9344 filename: "foo_v2.apex",
9345 overrides: ["foo"],
9346 }
9347 `,
9348 android.FixtureModifyConfig(func(config android.Config) {
9349 config.Targets[android.Android] = []android.Target{
9350 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9351 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9352 }
9353 }),
9354 )
9355
Spandan Das3576e762024-01-03 18:57:03 +00009356 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009357
9358 // Check extract_apks tool parameters. No native bridge arch expected
9359 extractedApex := m.Output("extracted/myapex.apks")
9360 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9361}
9362
Jiyong Park7d95a512020-05-10 15:16:24 +09009363func TestNoStaticLinkingToStubsLib(t *testing.T) {
9364 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9365 apex {
9366 name: "myapex",
9367 key: "myapex.key",
9368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009369 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009370 }
9371
9372 apex_key {
9373 name: "myapex.key",
9374 public_key: "testkey.avbpubkey",
9375 private_key: "testkey.pem",
9376 }
9377
9378 cc_library {
9379 name: "mylib",
9380 srcs: ["mylib.cpp"],
9381 static_libs: ["otherlib"],
9382 system_shared_libs: [],
9383 stl: "none",
9384 apex_available: [ "myapex" ],
9385 }
9386
9387 cc_library {
9388 name: "otherlib",
9389 srcs: ["mylib.cpp"],
9390 system_shared_libs: [],
9391 stl: "none",
9392 stubs: {
9393 versions: ["1", "2", "3"],
9394 },
9395 apex_available: [ "myapex" ],
9396 }
9397 `)
9398}
9399
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009400func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009401 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009402 apex {
9403 name: "myapex",
9404 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009405 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009406 custom_sign_tool: "sign_myapex",
9407 }
9408
9409 apex_key {
9410 name: "myapex.key",
9411 public_key: "testkey.avbpubkey",
9412 private_key: "testkey.pem",
9413 }
9414 `)
9415
Jooyung Han286957d2023-10-30 16:17:56 +09009416 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009417 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009418 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 +09009419}
9420
9421func TestApexKeysTxtOverrides(t *testing.T) {
9422 ctx := testApex(t, `
9423 apex {
9424 name: "myapex",
9425 key: "myapex.key",
9426 updatable: false,
9427 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009428 }
9429
9430 apex_key {
9431 name: "myapex.key",
9432 public_key: "testkey.avbpubkey",
9433 private_key: "testkey.pem",
9434 }
9435
9436 prebuilt_apex {
9437 name: "myapex",
9438 prefer: true,
9439 arch: {
9440 arm64: {
9441 src: "myapex-arm64.apex",
9442 },
9443 arm: {
9444 src: "myapex-arm.apex",
9445 },
9446 },
9447 }
9448
9449 apex_set {
9450 name: "myapex_set",
9451 set: "myapex.apks",
9452 filename: "myapex_set.apex",
9453 overrides: ["myapex"],
9454 }
9455 `)
9456
Colin Crossf61d03d2023-11-02 16:56:39 -07009457 content := android.ContentFromFileRuleForTests(t, ctx,
9458 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009459 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 -07009460 content = android.ContentFromFileRuleForTests(t, ctx,
9461 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009462 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 +09009463}
9464
Jooyung Han938b5932020-06-20 12:47:47 +09009465func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009466 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009467 apex {
9468 name: "myapex",
9469 key: "myapex.key",
9470 apps: ["app"],
9471 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009472 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009473 }
9474
9475 apex_key {
9476 name: "myapex.key",
9477 public_key: "testkey.avbpubkey",
9478 private_key: "testkey.pem",
9479 }
9480
9481 android_app {
9482 name: "app",
9483 srcs: ["foo/bar/MyClass.java"],
9484 package_name: "foo",
9485 sdk_version: "none",
9486 system_modules: "none",
9487 apex_available: [ "myapex" ],
9488 }
9489 `, withFiles(map[string][]byte{
9490 "sub/Android.bp": []byte(`
9491 override_apex {
9492 name: "override_myapex",
9493 base: "myapex",
9494 apps: ["override_app"],
9495 allowed_files: ":allowed",
9496 }
9497 // Overridable "path" property should be referenced indirectly
9498 filegroup {
9499 name: "allowed",
9500 srcs: ["allowed.txt"],
9501 }
9502 override_android_app {
9503 name: "override_app",
9504 base: "app",
9505 package_name: "bar",
9506 }
9507 `),
9508 }))
9509
Jooyung Hana0503a52023-08-23 13:12:50 +09009510 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009511 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9512 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9513 }
9514
Jooyung Hana0503a52023-08-23 13:12:50 +09009515 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009516 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9517 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9518 }
9519}
9520
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009521func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009522 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009523 apex {
9524 name: "myapex",
9525 key: "myapex.key",
9526 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009527 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009528 }
9529
9530 apex_key {
9531 name: "myapex.key",
9532 public_key: "testkey.avbpubkey",
9533 private_key: "testkey.pem",
9534 }
9535
9536 cc_library {
9537 name: "mylib",
9538 srcs: ["mylib.cpp"],
9539 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009540 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009541 },
9542 apex_available: ["myapex"],
9543 }
9544
9545 cc_prebuilt_library_shared {
9546 name: "mylib",
9547 prefer: false,
9548 srcs: ["prebuilt.so"],
9549 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009550 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009551 },
9552 apex_available: ["myapex"],
9553 }
9554 `)
9555}
9556
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009557func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009558 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009559 apex {
9560 name: "myapex",
9561 key: "myapex.key",
9562 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009563 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009564 }
9565 apex_key {
9566 name: "myapex.key",
9567 public_key: "testkey.avbpubkey",
9568 private_key: "testkey.pem",
9569 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009570 `,
9571 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9572 variables.CompressedApex = proptools.BoolPtr(true)
9573 }),
9574 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009575
Jooyung Hana0503a52023-08-23 13:12:50 +09009576 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009577 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9578
Jooyung Hana0503a52023-08-23 13:12:50 +09009579 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009580 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9581
9582 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009583 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009584 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9585
9586 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009587 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009588 var builder strings.Builder
9589 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9590 androidMk := builder.String()
9591 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9592}
9593
Martin Stjernholm2856c662020-12-02 15:03:42 +00009594func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009595 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009596 apex {
9597 name: "myapex",
9598 key: "myapex.key",
9599 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009600 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009601 }
9602
9603 apex_key {
9604 name: "myapex.key",
9605 public_key: "testkey.avbpubkey",
9606 private_key: "testkey.pem",
9607 }
9608
9609 cc_library {
9610 name: "mylib",
9611 srcs: ["mylib.cpp"],
9612 apex_available: ["myapex"],
9613 shared_libs: ["otherlib"],
9614 system_shared_libs: [],
9615 }
9616
9617 cc_library {
9618 name: "otherlib",
9619 srcs: ["mylib.cpp"],
9620 stubs: {
9621 versions: ["current"],
9622 },
9623 }
9624
9625 cc_prebuilt_library_shared {
9626 name: "otherlib",
9627 prefer: true,
9628 srcs: ["prebuilt.so"],
9629 stubs: {
9630 versions: ["current"],
9631 },
9632 }
9633 `)
9634
Jooyung Hana0503a52023-08-23 13:12:50 +09009635 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009636 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009637 var builder strings.Builder
9638 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9639 androidMk := builder.String()
9640
9641 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9642 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009643 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009644}
9645
Jiyong Parke3867542020-12-03 17:28:25 +09009646func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009647 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009648 apex {
9649 name: "myapex",
9650 key: "myapex.key",
9651 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009652 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009653 }
9654
9655 apex_key {
9656 name: "myapex.key",
9657 public_key: "testkey.avbpubkey",
9658 private_key: "testkey.pem",
9659 }
9660
9661 cc_library {
9662 name: "mylib",
9663 srcs: ["mylib.cpp"],
9664 system_shared_libs: [],
9665 stl: "none",
9666 apex_available: ["myapex"],
9667 shared_libs: ["mylib2"],
9668 target: {
9669 apex: {
9670 exclude_shared_libs: ["mylib2"],
9671 },
9672 },
9673 }
9674
9675 cc_library {
9676 name: "mylib2",
9677 srcs: ["mylib.cpp"],
9678 system_shared_libs: [],
9679 stl: "none",
9680 }
9681 `)
9682
9683 // Check if mylib is linked to mylib2 for the non-apex target
9684 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9685 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9686
9687 // Make sure that the link doesn't occur for the apex target
9688 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9689 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9690
9691 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009692 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009693 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9694}
9695
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009696func TestPrebuiltStubLibDep(t *testing.T) {
9697 bpBase := `
9698 apex {
9699 name: "myapex",
9700 key: "myapex.key",
9701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009702 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009703 }
9704 apex_key {
9705 name: "myapex.key",
9706 public_key: "testkey.avbpubkey",
9707 private_key: "testkey.pem",
9708 }
9709 cc_library {
9710 name: "mylib",
9711 srcs: ["mylib.cpp"],
9712 apex_available: ["myapex"],
9713 shared_libs: ["stublib"],
9714 system_shared_libs: [],
9715 }
9716 apex {
9717 name: "otherapex",
9718 enabled: %s,
9719 key: "myapex.key",
9720 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009721 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009722 }
9723 `
9724
9725 stublibSourceBp := `
9726 cc_library {
9727 name: "stublib",
9728 srcs: ["mylib.cpp"],
9729 apex_available: ["otherapex"],
9730 system_shared_libs: [],
9731 stl: "none",
9732 stubs: {
9733 versions: ["1"],
9734 },
9735 }
9736 `
9737
9738 stublibPrebuiltBp := `
9739 cc_prebuilt_library_shared {
9740 name: "stublib",
9741 srcs: ["prebuilt.so"],
9742 apex_available: ["otherapex"],
9743 stubs: {
9744 versions: ["1"],
9745 },
9746 %s
9747 }
9748 `
9749
9750 tests := []struct {
9751 name string
9752 stublibBp string
9753 usePrebuilt bool
9754 modNames []string // Modules to collect AndroidMkEntries for
9755 otherApexEnabled []string
9756 }{
9757 {
9758 name: "only_source",
9759 stublibBp: stublibSourceBp,
9760 usePrebuilt: false,
9761 modNames: []string{"stublib"},
9762 otherApexEnabled: []string{"true", "false"},
9763 },
9764 {
9765 name: "source_preferred",
9766 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9767 usePrebuilt: false,
9768 modNames: []string{"stublib", "prebuilt_stublib"},
9769 otherApexEnabled: []string{"true", "false"},
9770 },
9771 {
9772 name: "prebuilt_preferred",
9773 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9774 usePrebuilt: true,
9775 modNames: []string{"stublib", "prebuilt_stublib"},
9776 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9777 },
9778 {
9779 name: "only_prebuilt",
9780 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9781 usePrebuilt: true,
9782 modNames: []string{"stublib"},
9783 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9784 },
9785 }
9786
9787 for _, test := range tests {
9788 t.Run(test.name, func(t *testing.T) {
9789 for _, otherApexEnabled := range test.otherApexEnabled {
9790 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009791 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009792
9793 type modAndMkEntries struct {
9794 mod *cc.Module
9795 mkEntries android.AndroidMkEntries
9796 }
9797 entries := []*modAndMkEntries{}
9798
9799 // Gather shared lib modules that are installable
9800 for _, modName := range test.modNames {
9801 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9802 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9803 continue
9804 }
9805 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009806 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009807 continue
9808 }
Colin Crossaa255532020-07-03 13:18:24 -07009809 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009810 if ent.Disabled {
9811 continue
9812 }
9813 entries = append(entries, &modAndMkEntries{
9814 mod: mod,
9815 mkEntries: ent,
9816 })
9817 }
9818 }
9819 }
9820
9821 var entry *modAndMkEntries = nil
9822 for _, ent := range entries {
9823 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9824 if entry != nil {
9825 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9826 } else {
9827 entry = ent
9828 }
9829 }
9830 }
9831
9832 if entry == nil {
9833 t.Errorf("AndroidMk entry for \"stublib\" missing")
9834 } else {
9835 isPrebuilt := entry.mod.Prebuilt() != nil
9836 if isPrebuilt != test.usePrebuilt {
9837 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9838 }
9839 if !entry.mod.IsStubs() {
9840 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9841 }
9842 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9843 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9844 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009845 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009846 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009847 if !android.InList(expected, cflags) {
9848 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9849 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009850 }
9851 })
9852 }
9853 })
9854 }
9855}
9856
Colin Crossc33e5212021-05-25 18:16:02 -07009857func TestApexJavaCoverage(t *testing.T) {
9858 bp := `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 java_libs: ["mylib"],
9863 bootclasspath_fragments: ["mybootclasspathfragment"],
9864 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9865 updatable: false,
9866 }
9867
9868 apex_key {
9869 name: "myapex.key",
9870 public_key: "testkey.avbpubkey",
9871 private_key: "testkey.pem",
9872 }
9873
9874 java_library {
9875 name: "mylib",
9876 srcs: ["mylib.java"],
9877 apex_available: ["myapex"],
9878 compile_dex: true,
9879 }
9880
9881 bootclasspath_fragment {
9882 name: "mybootclasspathfragment",
9883 contents: ["mybootclasspathlib"],
9884 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009885 hidden_api: {
9886 split_packages: ["*"],
9887 },
Colin Crossc33e5212021-05-25 18:16:02 -07009888 }
9889
9890 java_library {
9891 name: "mybootclasspathlib",
9892 srcs: ["mybootclasspathlib.java"],
9893 apex_available: ["myapex"],
9894 compile_dex: true,
9895 }
9896
9897 systemserverclasspath_fragment {
9898 name: "mysystemserverclasspathfragment",
9899 contents: ["mysystemserverclasspathlib"],
9900 apex_available: ["myapex"],
9901 }
9902
9903 java_library {
9904 name: "mysystemserverclasspathlib",
9905 srcs: ["mysystemserverclasspathlib.java"],
9906 apex_available: ["myapex"],
9907 compile_dex: true,
9908 }
9909 `
9910
9911 result := android.GroupFixturePreparers(
9912 PrepareForTestWithApexBuildComponents,
9913 prepareForTestWithMyapex,
9914 java.PrepareForTestWithJavaDefaultModules,
9915 android.PrepareForTestWithAndroidBuildComponents,
9916 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009917 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9918 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009919 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009920 ).RunTest(t)
9921
9922 // Make sure jacoco ran on both mylib and mybootclasspathlib
9923 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9924 t.Errorf("Failed to find jacoco rule for mylib")
9925 }
9926 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9927 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9928 }
9929 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9930 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9931 }
9932}
9933
Jiyong Park192600a2021-08-03 07:52:17 +00009934func TestProhibitStaticExecutable(t *testing.T) {
9935 testApexError(t, `executable mybin is static`, `
9936 apex {
9937 name: "myapex",
9938 key: "myapex.key",
9939 binaries: ["mybin"],
9940 min_sdk_version: "29",
9941 }
9942
9943 apex_key {
9944 name: "myapex.key",
9945 public_key: "testkey.avbpubkey",
9946 private_key: "testkey.pem",
9947 }
9948
9949 cc_binary {
9950 name: "mybin",
9951 srcs: ["mylib.cpp"],
9952 relative_install_path: "foo/bar",
9953 static_executable: true,
9954 system_shared_libs: [],
9955 stl: "none",
9956 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009957 min_sdk_version: "29",
9958 }
9959 `)
9960
9961 testApexError(t, `executable mybin.rust is static`, `
9962 apex {
9963 name: "myapex",
9964 key: "myapex.key",
9965 binaries: ["mybin.rust"],
9966 min_sdk_version: "29",
9967 }
9968
9969 apex_key {
9970 name: "myapex.key",
9971 public_key: "testkey.avbpubkey",
9972 private_key: "testkey.pem",
9973 }
9974
9975 rust_binary {
9976 name: "mybin.rust",
9977 srcs: ["foo.rs"],
9978 static_executable: true,
9979 apex_available: ["myapex"],
9980 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009981 }
9982 `)
9983}
9984
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009985func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9986 ctx := testApex(t, `
9987 apex {
9988 name: "myapex",
9989 key: "myapex.key",
9990 updatable: false,
9991 java_libs: ["foo"],
9992 }
9993
9994 apex_key {
9995 name: "myapex.key",
9996 public_key: "testkey.avbpubkey",
9997 private_key: "testkey.pem",
9998 }
9999
10000 java_library {
10001 name: "foo",
10002 srcs: ["foo.java"],
10003 apex_available: ["myapex"],
10004 installable: true,
10005 }
10006 `,
10007 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
10008 )
10009
Jooyung Hana0503a52023-08-23 13:12:50 +090010010 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +000010011 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10012 var builder strings.Builder
10013 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10014 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010015 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 +000010016}
10017
10018func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
10019 ctx := testApex(t, `
10020 prebuilt_apex {
10021 name: "myapex",
10022 arch: {
10023 arm64: {
10024 src: "myapex-arm64.apex",
10025 },
10026 arm: {
10027 src: "myapex-arm.apex",
10028 },
10029 },
10030 exported_java_libs: ["foo"],
10031 }
10032
10033 java_import {
10034 name: "foo",
10035 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +000010036 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +000010037 }
10038 `,
10039 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
10040 )
10041
10042 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
10043 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
10044 mainModuleEntries := entriesList[0]
10045 android.AssertArrayString(t,
10046 "LOCAL_REQUIRED_MODULES",
10047 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
10048 []string{
10049 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
10050 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
10051 })
10052}
10053
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010054func TestAndroidMk_RequiredModules(t *testing.T) {
10055 ctx := testApex(t, `
10056 apex {
10057 name: "myapex",
10058 key: "myapex.key",
10059 updatable: false,
10060 java_libs: ["foo"],
10061 required: ["otherapex"],
10062 }
10063
10064 apex {
10065 name: "otherapex",
10066 key: "myapex.key",
10067 updatable: false,
10068 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010069 }
10070
10071 apex_key {
10072 name: "myapex.key",
10073 public_key: "testkey.avbpubkey",
10074 private_key: "testkey.pem",
10075 }
10076
10077 java_library {
10078 name: "foo",
10079 srcs: ["foo.java"],
10080 apex_available: ["myapex", "otherapex"],
10081 installable: true,
10082 }
10083 `)
10084
Jooyung Hana0503a52023-08-23 13:12:50 +090010085 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010086 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10087 var builder strings.Builder
10088 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10089 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010090 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010091}
10092
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010093func TestAndroidMk_RequiredDeps(t *testing.T) {
10094 ctx := testApex(t, `
10095 apex {
10096 name: "myapex",
10097 key: "myapex.key",
10098 updatable: false,
10099 }
10100
10101 apex_key {
10102 name: "myapex.key",
10103 public_key: "testkey.avbpubkey",
10104 private_key: "testkey.pem",
10105 }
10106 `)
10107
Jooyung Hana0503a52023-08-23 13:12:50 +090010108 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010109 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010110 data := android.AndroidMkDataForTest(t, ctx, bundle)
10111 var builder strings.Builder
10112 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10113 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010114 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010115}
10116
Jooyung Hana6d36672022-02-24 13:58:07 +090010117func TestApexOutputFileProducer(t *testing.T) {
10118 for _, tc := range []struct {
10119 name string
10120 ref string
10121 expected_data []string
10122 }{
10123 {
10124 name: "test_using_output",
10125 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010126 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010127 },
10128 {
10129 name: "test_using_apex",
10130 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010131 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010132 },
10133 } {
10134 t.Run(tc.name, func(t *testing.T) {
10135 ctx := testApex(t, `
10136 apex {
10137 name: "myapex",
10138 key: "myapex.key",
10139 compressible: true,
10140 updatable: false,
10141 }
10142
10143 apex_key {
10144 name: "myapex.key",
10145 public_key: "testkey.avbpubkey",
10146 private_key: "testkey.pem",
10147 }
10148
10149 java_test {
10150 name: "`+tc.name+`",
10151 srcs: ["a.java"],
10152 data: ["`+tc.ref+`"],
10153 }
10154 `,
10155 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10156 variables.CompressedApex = proptools.BoolPtr(true)
10157 }))
10158 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10159 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10160 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10161 })
10162 }
10163}
10164
satayev758968a2021-12-06 11:42:40 +000010165func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10166 preparer := android.GroupFixturePreparers(
10167 PrepareForTestWithApexBuildComponents,
10168 prepareForTestWithMyapex,
10169 java.PrepareForTestWithJavaSdkLibraryFiles,
10170 java.PrepareForTestWithJavaDefaultModules,
10171 android.PrepareForTestWithAndroidBuildComponents,
10172 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10173 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10174 )
10175
10176 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10177 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10178 preparer.RunTestWithBp(t, `
10179 apex {
10180 name: "myapex",
10181 key: "myapex.key",
10182 bootclasspath_fragments: ["mybootclasspathfragment"],
10183 min_sdk_version: "30",
10184 updatable: false,
10185 }
10186
10187 apex_key {
10188 name: "myapex.key",
10189 public_key: "testkey.avbpubkey",
10190 private_key: "testkey.pem",
10191 }
10192
10193 bootclasspath_fragment {
10194 name: "mybootclasspathfragment",
10195 contents: ["mybootclasspathlib"],
10196 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010197 hidden_api: {
10198 split_packages: ["*"],
10199 },
satayev758968a2021-12-06 11:42:40 +000010200 }
10201
10202 java_sdk_library {
10203 name: "mybootclasspathlib",
10204 srcs: ["mybootclasspathlib.java"],
10205 apex_available: ["myapex"],
10206 compile_dex: true,
10207 unsafe_ignore_missing_latest_api: true,
10208 min_sdk_version: "31",
10209 static_libs: ["util"],
10210 }
10211
10212 java_library {
10213 name: "util",
10214 srcs: ["a.java"],
10215 apex_available: ["myapex"],
10216 min_sdk_version: "31",
10217 static_libs: ["another_util"],
10218 }
10219
10220 java_library {
10221 name: "another_util",
10222 srcs: ["a.java"],
10223 min_sdk_version: "31",
10224 apex_available: ["myapex"],
10225 }
10226 `)
10227 })
10228
10229 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10230 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10231 preparer.RunTestWithBp(t, `
10232 apex {
10233 name: "myapex",
10234 key: "myapex.key",
10235 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10236 min_sdk_version: "30",
10237 updatable: false,
10238 }
10239
10240 apex_key {
10241 name: "myapex.key",
10242 public_key: "testkey.avbpubkey",
10243 private_key: "testkey.pem",
10244 }
10245
10246 systemserverclasspath_fragment {
10247 name: "mysystemserverclasspathfragment",
10248 contents: ["mysystemserverclasspathlib"],
10249 apex_available: ["myapex"],
10250 }
10251
10252 java_sdk_library {
10253 name: "mysystemserverclasspathlib",
10254 srcs: ["mysystemserverclasspathlib.java"],
10255 apex_available: ["myapex"],
10256 compile_dex: true,
10257 min_sdk_version: "32",
10258 unsafe_ignore_missing_latest_api: true,
10259 static_libs: ["util"],
10260 }
10261
10262 java_library {
10263 name: "util",
10264 srcs: ["a.java"],
10265 apex_available: ["myapex"],
10266 min_sdk_version: "31",
10267 static_libs: ["another_util"],
10268 }
10269
10270 java_library {
10271 name: "another_util",
10272 srcs: ["a.java"],
10273 min_sdk_version: "31",
10274 apex_available: ["myapex"],
10275 }
10276 `)
10277 })
10278
10279 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10280 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10281 RunTestWithBp(t, `
10282 apex {
10283 name: "myapex",
10284 key: "myapex.key",
10285 bootclasspath_fragments: ["mybootclasspathfragment"],
10286 min_sdk_version: "30",
10287 updatable: false,
10288 }
10289
10290 apex_key {
10291 name: "myapex.key",
10292 public_key: "testkey.avbpubkey",
10293 private_key: "testkey.pem",
10294 }
10295
10296 bootclasspath_fragment {
10297 name: "mybootclasspathfragment",
10298 contents: ["mybootclasspathlib"],
10299 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010300 hidden_api: {
10301 split_packages: ["*"],
10302 },
satayev758968a2021-12-06 11:42:40 +000010303 }
10304
10305 java_sdk_library {
10306 name: "mybootclasspathlib",
10307 srcs: ["mybootclasspathlib.java"],
10308 apex_available: ["myapex"],
10309 compile_dex: true,
10310 unsafe_ignore_missing_latest_api: true,
10311 }
10312 `)
10313 })
10314
10315 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10316 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10317 RunTestWithBp(t, `
10318 apex {
10319 name: "myapex",
10320 key: "myapex.key",
10321 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10322 min_sdk_version: "30",
10323 updatable: false,
10324 }
10325
10326 apex_key {
10327 name: "myapex.key",
10328 public_key: "testkey.avbpubkey",
10329 private_key: "testkey.pem",
10330 }
10331
10332 systemserverclasspath_fragment {
10333 name: "mysystemserverclasspathfragment",
10334 contents: ["mysystemserverclasspathlib"],
10335 apex_available: ["myapex"],
10336 }
10337
10338 java_sdk_library {
10339 name: "mysystemserverclasspathlib",
10340 srcs: ["mysystemserverclasspathlib.java"],
10341 apex_available: ["myapex"],
10342 compile_dex: true,
10343 unsafe_ignore_missing_latest_api: true,
10344 }
10345 `)
10346 })
10347}
10348
Jiakai Zhang6decef92022-01-12 17:56:19 +000010349// Verifies that the APEX depends on all the Make modules in the list.
10350func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10351 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10352 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010353 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010354 }
10355}
10356
10357// Verifies that the APEX does not depend on any of the Make modules in the list.
10358func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10359 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10360 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010361 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010362 }
10363}
10364
Cole Faust1021ccd2023-02-26 21:15:25 -080010365// TODO(b/193460475): Re-enable this test
10366//func TestApexStrictUpdtabilityLint(t *testing.T) {
10367// bpTemplate := `
10368// apex {
10369// name: "myapex",
10370// key: "myapex.key",
10371// java_libs: ["myjavalib"],
10372// updatable: %v,
10373// min_sdk_version: "29",
10374// }
10375// apex_key {
10376// name: "myapex.key",
10377// }
10378// java_library {
10379// name: "myjavalib",
10380// srcs: ["MyClass.java"],
10381// apex_available: [ "myapex" ],
10382// lint: {
10383// strict_updatability_linting: %v,
10384// },
10385// sdk_version: "current",
10386// min_sdk_version: "29",
10387// }
10388// `
10389// fs := android.MockFS{
10390// "lint-baseline.xml": nil,
10391// }
10392//
10393// testCases := []struct {
10394// testCaseName string
10395// apexUpdatable bool
10396// javaStrictUpdtabilityLint bool
10397// lintFileExists bool
10398// disallowedFlagExpected bool
10399// }{
10400// {
10401// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10402// apexUpdatable: true,
10403// javaStrictUpdtabilityLint: true,
10404// lintFileExists: false,
10405// disallowedFlagExpected: false,
10406// },
10407// {
10408// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10409// apexUpdatable: false,
10410// javaStrictUpdtabilityLint: false,
10411// lintFileExists: true,
10412// disallowedFlagExpected: false,
10413// },
10414// {
10415// testCaseName: "non-updatable apex respects strict updatability of javalib",
10416// apexUpdatable: false,
10417// javaStrictUpdtabilityLint: true,
10418// lintFileExists: true,
10419// disallowedFlagExpected: true,
10420// },
10421// {
10422// testCaseName: "updatable apex sets strict updatability of javalib to true",
10423// apexUpdatable: true,
10424// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10425// lintFileExists: true,
10426// disallowedFlagExpected: true,
10427// },
10428// }
10429//
10430// for _, testCase := range testCases {
10431// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10432// fixtures := []android.FixturePreparer{}
10433// if testCase.lintFileExists {
10434// fixtures = append(fixtures, fs.AddToFixture())
10435// }
10436//
10437// result := testApex(t, bp, fixtures...)
10438// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10439// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10440// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10441//
10442// if disallowedFlagActual != testCase.disallowedFlagExpected {
10443// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10444// }
10445// }
10446//}
10447//
10448//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10449// bp := `
10450// apex {
10451// name: "myapex",
10452// key: "myapex.key",
10453// java_libs: ["myjavalib"],
10454// updatable: true,
10455// min_sdk_version: "29",
10456// }
10457// apex_key {
10458// name: "myapex.key",
10459// }
10460// java_library {
10461// name: "myjavalib",
10462// srcs: ["MyClass.java"],
10463// apex_available: [ "myapex" ],
10464// sdk_version: "current",
10465// min_sdk_version: "29",
10466// }
10467// `
10468//
10469// testCases := []struct {
10470// testCaseName string
10471// moduleDirectory string
10472// disallowedFlagExpected bool
10473// }{
10474// {
10475// testCaseName: "lintable module defined outside libcore",
10476// moduleDirectory: "",
10477// disallowedFlagExpected: true,
10478// },
10479// {
10480// testCaseName: "lintable module defined in libcore root directory",
10481// moduleDirectory: "libcore/",
10482// disallowedFlagExpected: false,
10483// },
10484// {
10485// testCaseName: "lintable module defined in libcore child directory",
10486// moduleDirectory: "libcore/childdir/",
10487// disallowedFlagExpected: true,
10488// },
10489// }
10490//
10491// for _, testCase := range testCases {
10492// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10493// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10494// result := testApex(t, "", lintFileCreator, bpFileCreator)
10495// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10496// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10497// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10498// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10499//
10500// if disallowedFlagActual != testCase.disallowedFlagExpected {
10501// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10502// }
10503// }
10504//}
10505//
10506//// checks transtive deps of an apex coming from bootclasspath_fragment
10507//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10508// bp := `
10509// apex {
10510// name: "myapex",
10511// key: "myapex.key",
10512// bootclasspath_fragments: ["mybootclasspathfragment"],
10513// updatable: true,
10514// min_sdk_version: "29",
10515// }
10516// apex_key {
10517// name: "myapex.key",
10518// }
10519// bootclasspath_fragment {
10520// name: "mybootclasspathfragment",
10521// contents: ["myjavalib"],
10522// apex_available: ["myapex"],
10523// hidden_api: {
10524// split_packages: ["*"],
10525// },
10526// }
10527// java_library {
10528// name: "myjavalib",
10529// srcs: ["MyClass.java"],
10530// apex_available: [ "myapex" ],
10531// sdk_version: "current",
10532// min_sdk_version: "29",
10533// compile_dex: true,
10534// }
10535// `
10536// fs := android.MockFS{
10537// "lint-baseline.xml": nil,
10538// }
10539//
10540// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10541// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10542// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10543// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10544// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10545// }
10546//}
Spandan Das66773252022-01-15 00:23:18 +000010547
Spandan Das42e89502022-05-06 22:12:55 +000010548// updatable apexes should propagate updatable=true to its apps
10549func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10550 bp := `
10551 apex {
10552 name: "myapex",
10553 key: "myapex.key",
10554 updatable: %v,
10555 apps: [
10556 "myapp",
10557 ],
10558 min_sdk_version: "30",
10559 }
10560 apex_key {
10561 name: "myapex.key",
10562 }
10563 android_app {
10564 name: "myapp",
10565 updatable: %v,
10566 apex_available: [
10567 "myapex",
10568 ],
10569 sdk_version: "current",
10570 min_sdk_version: "30",
10571 }
10572 `
10573 testCases := []struct {
10574 name string
10575 apex_is_updatable_bp bool
10576 app_is_updatable_bp bool
10577 app_is_updatable_expected bool
10578 }{
10579 {
10580 name: "Non-updatable apex respects updatable property of non-updatable app",
10581 apex_is_updatable_bp: false,
10582 app_is_updatable_bp: false,
10583 app_is_updatable_expected: false,
10584 },
10585 {
10586 name: "Non-updatable apex respects updatable property of updatable app",
10587 apex_is_updatable_bp: false,
10588 app_is_updatable_bp: true,
10589 app_is_updatable_expected: true,
10590 },
10591 {
10592 name: "Updatable apex respects updatable property of updatable app",
10593 apex_is_updatable_bp: true,
10594 app_is_updatable_bp: true,
10595 app_is_updatable_expected: true,
10596 },
10597 {
10598 name: "Updatable apex sets updatable=true on non-updatable app",
10599 apex_is_updatable_bp: true,
10600 app_is_updatable_bp: false,
10601 app_is_updatable_expected: true,
10602 },
10603 }
10604 for _, testCase := range testCases {
10605 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10606 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10607 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10608 }
10609}
10610
Kiyoung Kim487689e2022-07-26 09:48:22 +090010611func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10612 bp := `
10613 apex {
10614 name: "myapex",
10615 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010616 native_shared_libs: ["libbaz"],
10617 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010618 min_sdk_version: "29",
10619 }
10620 apex_key {
10621 name: "myapex.key",
10622 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010623 cc_binary {
10624 name: "binfoo",
10625 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010626 apex_available: ["myapex"],
10627 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010628 recovery_available: false,
10629 }
10630 cc_library {
10631 name: "libbar",
10632 srcs: ["libbar.cc"],
10633 stubs: {
10634 symbol_file: "libbar.map.txt",
10635 versions: [
10636 "29",
10637 ],
10638 },
10639 }
10640 cc_library {
10641 name: "libbaz",
10642 srcs: ["libbaz.cc"],
10643 apex_available: ["myapex"],
10644 min_sdk_version: "29",
10645 stubs: {
10646 symbol_file: "libbaz.map.txt",
10647 versions: [
10648 "29",
10649 ],
10650 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010651 }
10652 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010653 name: "libbar",
10654 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010655 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010656 variants: ["apex.29"],
10657 }
10658 cc_api_variant {
10659 name: "libbar",
10660 variant: "apex",
10661 version: "29",
10662 src: "libbar_apex_29.so",
10663 }
10664 cc_api_library {
10665 name: "libbaz",
10666 src: "libbaz_stub.so",
10667 min_sdk_version: "29",
10668 variants: ["apex.29"],
10669 }
10670 cc_api_variant {
10671 name: "libbaz",
10672 variant: "apex",
10673 version: "29",
10674 src: "libbaz_apex_29.so",
10675 }
10676 cc_api_library {
10677 name: "libqux",
10678 src: "libqux_stub.so",
10679 min_sdk_version: "29",
10680 variants: ["apex.29"],
10681 }
10682 cc_api_variant {
10683 name: "libqux",
10684 variant: "apex",
10685 version: "29",
10686 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010687 }
10688 api_imports {
10689 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010690 apex_shared_libs: [
10691 "libbar",
10692 "libbaz",
10693 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010694 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010695 }
10696 `
10697 result := testApex(t, bp)
10698
10699 hasDep := func(m android.Module, wantDep android.Module) bool {
10700 t.Helper()
10701 var found bool
10702 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10703 if dep == wantDep {
10704 found = true
10705 }
10706 })
10707 return found
10708 }
10709
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010710 // Library defines stubs and cc_api_library should be used with cc_api_library
10711 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10712 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10713 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010714
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010715 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10716 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010717
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010718 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10719 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10720 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10721 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10722
10723 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10724 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10725 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10726 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10727 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10728
10729 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10730 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10731 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10732
10733 // cc_api_library defined without original library should be linked with cc_api_library
10734 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10735 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10736 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10737}
10738
10739func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10740 bp := `
10741 apex {
10742 name: "myapex",
10743 key: "myapex.key",
10744 native_shared_libs: ["libbar"],
10745 min_sdk_version: "29",
10746 }
10747 apex_key {
10748 name: "myapex.key",
10749 }
10750 cc_binary {
10751 name: "binfoo",
10752 shared_libs: ["libbar"],
10753 recovery_available: false,
10754 }
10755 cc_library {
10756 name: "libbar",
10757 srcs: ["libbar.cc"],
10758 apex_available: ["myapex"],
10759 min_sdk_version: "29",
10760 stubs: {
10761 symbol_file: "libbar.map.txt",
10762 versions: [
10763 "29",
10764 ],
10765 },
10766 }
10767 cc_api_library {
10768 name: "libbar",
10769 src: "libbar_stub.so",
10770 variants: ["apex.29"],
10771 }
10772 cc_api_variant {
10773 name: "libbar",
10774 variant: "apex",
10775 version: "29",
10776 src: "libbar_apex_29.so",
10777 }
10778 api_imports {
10779 name: "api_imports",
10780 apex_shared_libs: [
10781 "libbar",
10782 ],
10783 }
10784 `
10785
10786 result := testApex(t, bp)
10787
10788 hasDep := func(m android.Module, wantDep android.Module) bool {
10789 t.Helper()
10790 var found bool
10791 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10792 if dep == wantDep {
10793 found = true
10794 }
10795 })
10796 return found
10797 }
10798
10799 // Library defines stubs and cc_api_library should be used with cc_api_library
10800 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10801 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10802 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10803
10804 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10805 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10806
10807 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10808 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10809 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10810 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010811}
Dennis Shend4f5d932023-01-31 20:27:21 +000010812
10813func TestTrimmedApex(t *testing.T) {
10814 bp := `
10815 apex {
10816 name: "myapex",
10817 key: "myapex.key",
10818 native_shared_libs: ["libfoo","libbaz"],
10819 min_sdk_version: "29",
10820 trim_against: "mydcla",
10821 }
10822 apex {
10823 name: "mydcla",
10824 key: "myapex.key",
10825 native_shared_libs: ["libfoo","libbar"],
10826 min_sdk_version: "29",
10827 file_contexts: ":myapex-file_contexts",
10828 dynamic_common_lib_apex: true,
10829 }
10830 apex_key {
10831 name: "myapex.key",
10832 }
10833 cc_library {
10834 name: "libfoo",
10835 shared_libs: ["libc"],
10836 apex_available: ["myapex","mydcla"],
10837 min_sdk_version: "29",
10838 }
10839 cc_library {
10840 name: "libbar",
10841 shared_libs: ["libc"],
10842 apex_available: ["myapex","mydcla"],
10843 min_sdk_version: "29",
10844 }
10845 cc_library {
10846 name: "libbaz",
10847 shared_libs: ["libc"],
10848 apex_available: ["myapex","mydcla"],
10849 min_sdk_version: "29",
10850 }
10851 cc_api_library {
10852 name: "libc",
10853 src: "libc.so",
10854 min_sdk_version: "29",
10855 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010856 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010857 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010858 }
10859 api_imports {
10860 name: "api_imports",
10861 shared_libs: [
10862 "libc",
10863 ],
10864 header_libs: [],
10865 }
10866 `
10867 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010868 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010869 apexRule := module.MaybeRule("apexRule")
10870 if apexRule.Rule == nil {
10871 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10872 }
10873
10874 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010875 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010876 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10877 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10878 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10879 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10880}
Jingwen Chendea7a642023-03-28 11:30:50 +000010881
10882func TestCannedFsConfig(t *testing.T) {
10883 ctx := testApex(t, `
10884 apex {
10885 name: "myapex",
10886 key: "myapex.key",
10887 updatable: false,
10888 }
10889
10890 apex_key {
10891 name: "myapex.key",
10892 public_key: "testkey.avbpubkey",
10893 private_key: "testkey.pem",
10894 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010895 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010896 generateFsRule := mod.Rule("generateFsConfig")
10897 cmd := generateFsRule.RuleParams.Command
10898
10899 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10900}
10901
10902func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10903 ctx := testApex(t, `
10904 apex {
10905 name: "myapex",
10906 key: "myapex.key",
10907 canned_fs_config: "my_config",
10908 updatable: false,
10909 }
10910
10911 apex_key {
10912 name: "myapex.key",
10913 public_key: "testkey.avbpubkey",
10914 private_key: "testkey.pem",
10915 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010916 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010917 generateFsRule := mod.Rule("generateFsConfig")
10918 cmd := generateFsRule.RuleParams.Command
10919
10920 // Ensure that canned_fs_config has "cat my_config" at the end
10921 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10922}
Spandan Das20fce2d2023-04-12 17:21:39 +000010923
10924func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10925 testCases := []struct {
10926 desc string
10927 hasStubs bool
10928 apexAvailable string
10929 expectedError string
10930 }{
10931 {
10932 desc: "non-stub library can have multiple apex_available",
10933 hasStubs: false,
10934 apexAvailable: `["myapex", "otherapex"]`,
10935 },
10936 {
10937 desc: "stub library should not be available to anyapex",
10938 hasStubs: true,
10939 apexAvailable: `["//apex_available:anyapex"]`,
10940 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10941 },
10942 {
10943 desc: "stub library should not be available to multiple apexes",
10944 hasStubs: true,
10945 apexAvailable: `["myapex", "otherapex"]`,
10946 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10947 },
10948 {
10949 desc: "stub library can be available to a core apex and a test apex",
10950 hasStubs: true,
10951 apexAvailable: `["myapex", "test_myapex"]`,
10952 },
10953 }
10954 bpTemplate := `
10955 cc_library {
10956 name: "libfoo",
10957 %v
10958 apex_available: %v,
10959 }
10960 apex {
10961 name: "myapex",
10962 key: "apex.key",
10963 updatable: false,
10964 native_shared_libs: ["libfoo"],
10965 }
10966 apex {
10967 name: "otherapex",
10968 key: "apex.key",
10969 updatable: false,
10970 }
10971 apex_test {
10972 name: "test_myapex",
10973 key: "apex.key",
10974 updatable: false,
10975 native_shared_libs: ["libfoo"],
10976 }
10977 apex_key {
10978 name: "apex.key",
10979 }
10980 `
10981 for _, tc := range testCases {
10982 stubs := ""
10983 if tc.hasStubs {
10984 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10985 }
10986 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10987 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10988 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10989 })
10990 if tc.expectedError == "" {
10991 testApex(t, bp, mockFsFixturePreparer)
10992 } else {
10993 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10994 }
10995 }
10996}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010997
10998func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10999 context := android.GroupFixturePreparers(
11000 android.PrepareForIntegrationTestWithAndroid,
11001 cc.PrepareForIntegrationTestWithCc,
11002 PrepareForTestWithApexBuildComponents,
11003 prepareForTestWithMyapex,
11004 filesystem.PrepareForTestWithFilesystemBuildComponents,
11005 )
11006 result := context.RunTestWithBp(t, `
11007 android_system_image {
11008 name: "myfilesystem",
11009 deps: [
11010 "libfoo",
11011 ],
11012 linker_config_src: "linker.config.json",
11013 }
11014
11015 cc_library {
11016 name: "libfoo",
11017 shared_libs: [
11018 "libbar",
11019 ],
11020 stl: "none",
11021 }
11022
11023 cc_library {
11024 name: "libbar",
11025 stl: "none",
11026 apex_available: ["myapex"],
11027 }
11028
11029 apex {
11030 name: "myapex",
11031 native_shared_libs: ["libbar"],
11032 key: "myapex.key",
11033 updatable: false,
11034 }
11035
11036 apex_key {
11037 name: "myapex.key",
11038 public_key: "testkey.avbpubkey",
11039 private_key: "testkey.pem",
11040 }
11041 `)
11042
Cole Faust3b806d32024-03-11 15:15:03 -070011043 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070011044 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
11045 inputs.Strings(),
11046 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
11047}
Yu Liueae7b362023-11-16 17:05:47 -080011048
11049var apex_default_bp = `
11050 apex_key {
11051 name: "myapex.key",
11052 public_key: "testkey.avbpubkey",
11053 private_key: "testkey.pem",
11054 }
11055
11056 filegroup {
11057 name: "myapex.manifest",
11058 srcs: ["apex_manifest.json"],
11059 }
11060
11061 filegroup {
11062 name: "myapex.androidmanifest",
11063 srcs: ["AndroidManifest.xml"],
11064 }
11065`
11066
11067func TestAconfigFilesJavaDeps(t *testing.T) {
11068 ctx := testApex(t, apex_default_bp+`
11069 apex {
11070 name: "myapex",
11071 manifest: ":myapex.manifest",
11072 androidManifest: ":myapex.androidmanifest",
11073 key: "myapex.key",
11074 java_libs: [
11075 "my_java_library_foo",
11076 "my_java_library_bar",
11077 ],
11078 updatable: false,
11079 }
11080
11081 java_library {
11082 name: "my_java_library_foo",
11083 srcs: ["foo/bar/MyClass.java"],
11084 sdk_version: "none",
11085 system_modules: "none",
11086 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011087 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011088 "myapex",
11089 ],
11090 }
11091
11092 java_library {
11093 name: "my_java_library_bar",
11094 srcs: ["foo/bar/MyClass.java"],
11095 sdk_version: "none",
11096 system_modules: "none",
11097 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011098 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011099 "myapex",
11100 ],
11101 }
11102
11103 aconfig_declarations {
11104 name: "my_aconfig_declarations_foo",
11105 package: "com.example.package",
11106 container: "myapex",
11107 srcs: ["foo.aconfig"],
11108 }
11109
11110 java_aconfig_library {
11111 name: "my_java_aconfig_library_foo",
11112 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011113 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011114 "myapex",
11115 ],
11116 }
11117
11118 aconfig_declarations {
11119 name: "my_aconfig_declarations_bar",
11120 package: "com.example.package",
11121 container: "myapex",
11122 srcs: ["bar.aconfig"],
11123 }
11124
11125 java_aconfig_library {
11126 name: "my_java_aconfig_library_bar",
11127 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011128 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011129 "myapex",
11130 ],
11131 }
11132 `)
11133
11134 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11135 s := mod.Rule("apexRule").Args["copy_commands"]
11136 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011137 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080011138 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11139 }
11140
Yu Liuab31c822024-02-28 22:21:31 +000011141 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11142 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
11143 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
11144 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080011145
Yu Liubba555e2024-02-17 00:36:42 +000011146 inputs := []string{
11147 "my_aconfig_declarations_foo/intermediate.pb",
11148 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080011149 }
Yu Liubba555e2024-02-17 00:36:42 +000011150 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11151 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11152 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11153 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080011154}
11155
11156func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11157 ctx := testApex(t, apex_default_bp+`
11158 apex {
11159 name: "myapex",
11160 manifest: ":myapex.manifest",
11161 androidManifest: ":myapex.androidmanifest",
11162 key: "myapex.key",
11163 java_libs: [
11164 "my_java_library_foo",
11165 ],
11166 native_shared_libs: [
11167 "my_cc_library_bar",
11168 ],
11169 binaries: [
11170 "my_cc_binary_baz",
11171 ],
11172 updatable: false,
11173 }
11174
11175 java_library {
11176 name: "my_java_library_foo",
11177 srcs: ["foo/bar/MyClass.java"],
11178 sdk_version: "none",
11179 system_modules: "none",
11180 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011181 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011182 "myapex",
11183 ],
11184 }
11185
11186 cc_library {
11187 name: "my_cc_library_bar",
11188 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011189 static_libs: [
11190 "my_cc_aconfig_library_bar",
11191 "my_cc_aconfig_library_baz",
11192 ],
Yu Liueae7b362023-11-16 17:05:47 -080011193 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011194 "myapex",
11195 ],
11196 }
11197
11198 cc_binary {
11199 name: "my_cc_binary_baz",
11200 srcs: ["foo/bar/MyClass.cc"],
11201 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011202 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011203 "myapex",
11204 ],
11205 }
11206
11207 aconfig_declarations {
11208 name: "my_aconfig_declarations_foo",
11209 package: "com.example.package",
11210 container: "myapex",
11211 srcs: ["foo.aconfig"],
11212 }
11213
11214 java_aconfig_library {
11215 name: "my_java_aconfig_library_foo",
11216 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011217 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011218 "myapex",
11219 ],
11220 }
11221
11222 aconfig_declarations {
11223 name: "my_aconfig_declarations_bar",
11224 package: "com.example.package",
11225 container: "myapex",
11226 srcs: ["bar.aconfig"],
11227 }
11228
11229 cc_aconfig_library {
11230 name: "my_cc_aconfig_library_bar",
11231 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011232 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011233 "myapex",
11234 ],
11235 }
11236
11237 aconfig_declarations {
11238 name: "my_aconfig_declarations_baz",
11239 package: "com.example.package",
11240 container: "myapex",
11241 srcs: ["baz.aconfig"],
11242 }
11243
11244 cc_aconfig_library {
11245 name: "my_cc_aconfig_library_baz",
11246 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011247 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011248 "myapex",
11249 ],
11250 }
11251
11252 cc_library {
11253 name: "server_configurable_flags",
11254 srcs: ["server_configurable_flags.cc"],
11255 }
11256 `)
11257
11258 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11259 s := mod.Rule("apexRule").Args["copy_commands"]
11260 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011261 if len(copyCmds) != 12 {
11262 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080011263 }
11264
Yu Liuab31c822024-02-28 22:21:31 +000011265 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11266 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
11267 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
11268 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080011269
Yu Liubba555e2024-02-17 00:36:42 +000011270 inputs := []string{
11271 "my_aconfig_declarations_foo/intermediate.pb",
11272 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
11273 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080011274 }
Yu Liubba555e2024-02-17 00:36:42 +000011275 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11276 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11277 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11278 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080011279}
11280
Yu Liucec0e412023-11-30 16:45:50 -080011281func TestAconfigFilesRustDeps(t *testing.T) {
11282 ctx := testApex(t, apex_default_bp+`
11283 apex {
11284 name: "myapex",
11285 manifest: ":myapex.manifest",
11286 androidManifest: ":myapex.androidmanifest",
11287 key: "myapex.key",
11288 native_shared_libs: [
11289 "libmy_rust_library",
11290 ],
11291 binaries: [
11292 "my_rust_binary",
11293 ],
11294 rust_dyn_libs: [
11295 "libmy_rust_dylib",
11296 ],
11297 updatable: false,
11298 }
11299
11300 rust_library {
11301 name: "libflags_rust", // test mock
11302 crate_name: "flags_rust",
11303 srcs: ["lib.rs"],
11304 apex_available: [
11305 "myapex",
11306 ],
11307 }
11308
11309 rust_library {
11310 name: "liblazy_static", // test mock
11311 crate_name: "lazy_static",
11312 srcs: ["src/lib.rs"],
11313 apex_available: [
11314 "myapex",
11315 ],
11316 }
11317
11318 rust_ffi_shared {
11319 name: "libmy_rust_library",
11320 srcs: ["src/lib.rs"],
11321 rustlibs: ["libmy_rust_aconfig_library_foo"],
11322 crate_name: "my_rust_library",
11323 apex_available: [
11324 "myapex",
11325 ],
11326 }
11327
11328 rust_library_dylib {
11329 name: "libmy_rust_dylib",
11330 srcs: ["foo/bar/MyClass.rs"],
11331 rustlibs: ["libmy_rust_aconfig_library_bar"],
11332 crate_name: "my_rust_dylib",
11333 apex_available: [
11334 "myapex",
11335 ],
11336 }
11337
11338 rust_binary {
11339 name: "my_rust_binary",
11340 srcs: ["foo/bar/MyClass.rs"],
11341 rustlibs: [
11342 "libmy_rust_aconfig_library_baz",
11343 "libmy_rust_dylib",
11344 ],
11345 apex_available: [
11346 "myapex",
11347 ],
11348 }
11349
11350 aconfig_declarations {
11351 name: "my_aconfig_declarations_foo",
11352 package: "com.example.package",
11353 container: "myapex",
11354 srcs: ["foo.aconfig"],
11355 }
11356
11357 aconfig_declarations {
11358 name: "my_aconfig_declarations_bar",
11359 package: "com.example.package",
11360 container: "myapex",
11361 srcs: ["bar.aconfig"],
11362 }
11363
11364 aconfig_declarations {
11365 name: "my_aconfig_declarations_baz",
11366 package: "com.example.package",
11367 container: "myapex",
11368 srcs: ["baz.aconfig"],
11369 }
11370
11371 rust_aconfig_library {
11372 name: "libmy_rust_aconfig_library_foo",
11373 aconfig_declarations: "my_aconfig_declarations_foo",
11374 crate_name: "my_rust_aconfig_library_foo",
11375 apex_available: [
11376 "myapex",
11377 ],
11378 }
11379
11380 rust_aconfig_library {
11381 name: "libmy_rust_aconfig_library_bar",
11382 aconfig_declarations: "my_aconfig_declarations_bar",
11383 crate_name: "my_rust_aconfig_library_bar",
11384 apex_available: [
11385 "myapex",
11386 ],
11387 }
11388
11389 rust_aconfig_library {
11390 name: "libmy_rust_aconfig_library_baz",
11391 aconfig_declarations: "my_aconfig_declarations_baz",
11392 crate_name: "my_rust_aconfig_library_baz",
11393 apex_available: [
11394 "myapex",
11395 ],
11396 }
11397 `)
11398
11399 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11400 s := mod.Rule("apexRule").Args["copy_commands"]
11401 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011402 if len(copyCmds) != 26 {
11403 t.Fatalf("Expected 26 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011404 }
11405
Yu Liuab31c822024-02-28 22:21:31 +000011406 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11407 ensureMatches(t, copyCmds[23], "^cp -f .*/package.map .*/image.apex/etc$")
11408 ensureMatches(t, copyCmds[24], "^cp -f .*/flag.map .*/image.apex/etc$")
11409 ensureMatches(t, copyCmds[25], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011410
Yu Liubba555e2024-02-17 00:36:42 +000011411 inputs := []string{
11412 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011413 "my_aconfig_declarations_bar/intermediate.pb",
11414 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011415 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11416 }
11417 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11418 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11419 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11420 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11421}
11422
11423func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11424 aconfigRule := mod.Description(desc)
11425 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011426 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011427 if len(aconfigArgs) != len(inputs) {
11428 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011429 }
Yu Liucec0e412023-11-30 16:45:50 -080011430
Yu Liubba555e2024-02-17 00:36:42 +000011431 ensureEquals(t, container, aconfigRule.Args["container"])
11432 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11433
11434 buildParams := aconfigRule.BuildParams
11435 for _, input := range inputs {
11436 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11437 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011438 }
Yu Liubba555e2024-02-17 00:36:42 +000011439
11440 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011441}
11442
Yu Liueae7b362023-11-16 17:05:47 -080011443func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11444 ctx := testApex(t, apex_default_bp+`
11445 apex {
11446 name: "myapex",
11447 manifest: ":myapex.manifest",
11448 androidManifest: ":myapex.androidmanifest",
11449 key: "myapex.key",
11450 java_libs: [
11451 "my_java_library_foo",
11452 "other_java_library_bar",
11453 ],
11454 updatable: false,
11455 }
11456
11457 java_library {
11458 name: "my_java_library_foo",
11459 srcs: ["foo/bar/MyClass.java"],
11460 sdk_version: "none",
11461 system_modules: "none",
11462 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011463 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011464 "myapex",
11465 ],
11466 }
11467
11468 java_library {
11469 name: "other_java_library_bar",
11470 srcs: ["foo/bar/MyClass.java"],
11471 sdk_version: "none",
11472 system_modules: "none",
11473 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011474 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011475 "myapex",
11476 ],
11477 }
11478
11479 aconfig_declarations {
11480 name: "my_aconfig_declarations_foo",
11481 package: "com.example.package",
11482 container: "myapex",
11483 srcs: ["foo.aconfig"],
11484 }
11485
11486 java_aconfig_library {
11487 name: "my_java_aconfig_library_foo",
11488 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011489 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011490 "myapex",
11491 ],
11492 }
11493
11494 aconfig_declarations {
11495 name: "other_aconfig_declarations_bar",
11496 package: "com.example.package",
11497 container: "otherapex",
11498 srcs: ["bar.aconfig"],
11499 }
11500
11501 java_aconfig_library {
11502 name: "other_java_aconfig_library_bar",
11503 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011504 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011505 "myapex",
11506 ],
11507 }
11508 `)
11509
11510 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11511 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11512 s := " " + combineAconfigRule.Args["cache_files"]
11513 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11514 if len(aconfigArgs) != 1 {
11515 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11516 }
11517 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11518
11519 buildParams := combineAconfigRule.BuildParams
11520 if len(buildParams.Inputs) != 1 {
11521 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11522 }
11523 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11524 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11525}
11526
11527func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11528 ctx := testApex(t, apex_default_bp+`
11529 apex {
11530 name: "myapex",
11531 manifest: ":myapex.manifest",
11532 androidManifest: ":myapex.androidmanifest",
11533 key: "myapex.key",
11534 java_libs: [
11535 "my_java_library_foo",
11536 "my_java_library_bar",
11537 ],
11538 updatable: false,
11539 }
11540
11541 java_library {
11542 name: "my_java_library_foo",
11543 srcs: ["foo/bar/MyClass.java"],
11544 sdk_version: "none",
11545 system_modules: "none",
11546 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011547 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011548 "myapex",
11549 ],
11550 }
11551
11552 java_library {
11553 name: "my_java_library_bar",
11554 srcs: ["foo/bar/MyClass.java"],
11555 sdk_version: "none",
11556 system_modules: "none",
11557 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011558 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011559 "myapex",
11560 ],
11561 }
11562
11563 aconfig_declarations {
11564 name: "my_aconfig_declarations_foo",
11565 package: "com.example.package",
11566 container: "myapex",
11567 srcs: ["foo.aconfig"],
11568 }
11569
11570 java_aconfig_library {
11571 name: "my_java_aconfig_library_foo",
11572 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011573 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011574 "myapex",
11575 ],
11576 }
11577
11578 java_aconfig_library {
11579 name: "my_java_aconfig_library_bar",
11580 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011581 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011582 "myapex",
11583 ],
11584 }
11585 `)
11586
11587 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11588 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11589 s := " " + combineAconfigRule.Args["cache_files"]
11590 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11591 if len(aconfigArgs) != 1 {
11592 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11593 }
11594 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11595
11596 buildParams := combineAconfigRule.BuildParams
11597 if len(buildParams.Inputs) != 1 {
11598 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11599 }
11600 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11601 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11602}
Spandan Das5be63332023-12-13 00:06:32 +000011603
11604// Test that the boot jars come from the _selected_ apex prebuilt
11605// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11606func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11607 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11608 t.Helper()
11609 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11610 foundLibfooJar := false
11611 base := stem + ".jar"
11612 for _, output := range s.AllOutputs() {
11613 if filepath.Base(output) == base {
11614 foundLibfooJar = true
11615 buildRule := s.Output(output)
11616 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11617 }
11618 }
11619 if !foundLibfooJar {
11620 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11621 }
11622 }
11623
Spandan Das64c9e0c2023-12-20 20:13:34 +000011624 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11625 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11626 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11627 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11628 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11629 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)
11630 }
11631
11632 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11633 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11634 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11635 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11636 }
11637
Spandan Das5be63332023-12-13 00:06:32 +000011638 bp := `
11639 // Source APEX.
11640
11641 java_library {
11642 name: "framework-foo",
11643 srcs: ["foo.java"],
11644 installable: true,
11645 apex_available: [
11646 "com.android.foo",
11647 ],
11648 }
11649
11650 bootclasspath_fragment {
11651 name: "foo-bootclasspath-fragment",
11652 contents: ["framework-foo"],
11653 apex_available: [
11654 "com.android.foo",
11655 ],
11656 hidden_api: {
11657 split_packages: ["*"],
11658 },
11659 }
11660
11661 apex_key {
11662 name: "com.android.foo.key",
11663 public_key: "com.android.foo.avbpubkey",
11664 private_key: "com.android.foo.pem",
11665 }
11666
11667 apex {
11668 name: "com.android.foo",
11669 key: "com.android.foo.key",
11670 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11671 updatable: false,
11672 }
11673
11674 // Prebuilt APEX.
11675
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011676 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011677 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011678 public: {
11679 jars: ["foo.jar"],
11680 },
Spandan Das5be63332023-12-13 00:06:32 +000011681 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011682 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011683 }
11684
11685 prebuilt_bootclasspath_fragment {
11686 name: "foo-bootclasspath-fragment",
11687 contents: ["framework-foo"],
11688 hidden_api: {
11689 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11690 metadata: "my-bootclasspath-fragment/metadata.csv",
11691 index: "my-bootclasspath-fragment/index.csv",
11692 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11693 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11694 },
11695 apex_available: [
11696 "com.android.foo",
11697 ],
11698 }
11699
11700 prebuilt_apex {
11701 name: "com.android.foo",
11702 apex_name: "com.android.foo",
11703 src: "com.android.foo-arm.apex",
11704 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11705 }
11706
11707 // Another Prebuilt ART APEX
11708 prebuilt_apex {
11709 name: "com.android.foo.v2",
11710 apex_name: "com.android.foo", // Used to determine the API domain
11711 src: "com.android.foo-arm.apex",
11712 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11713 }
11714
11715 // APEX contribution modules
11716
11717 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011718 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011719 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011720 contents: ["com.android.foo"],
11721 }
11722
11723 apex_contributions {
11724 name: "foo.prebuilt.contributions",
11725 api_domain: "com.android.foo",
11726 contents: ["prebuilt_com.android.foo"],
11727 }
11728
11729 apex_contributions {
11730 name: "foo.prebuilt.v2.contributions",
11731 api_domain: "com.android.foo",
11732 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011733 }
11734 `
11735
11736 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011737 desc string
11738 selectedApexContributions string
11739 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011740 }{
11741 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011742 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11743 selectedApexContributions: "foo.source.contributions",
11744 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011745 },
11746 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011747 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11748 selectedApexContributions: "foo.prebuilt.contributions",
11749 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011750 },
11751 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011752 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11753 selectedApexContributions: "foo.prebuilt.v2.contributions",
11754 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011755 },
11756 }
11757
11758 fragment := java.ApexVariantReference{
11759 Apex: proptools.StringPtr("com.android.foo"),
11760 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11761 }
11762
11763 for _, tc := range testCases {
11764 preparer := android.GroupFixturePreparers(
11765 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11766 android.FixtureMergeMockFs(map[string][]byte{
11767 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11768 }),
11769 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11770 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011771 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011772 }
11773 }),
11774 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011775 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011776 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011777 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11778 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011779 }
11780}
Spandan Das3576e762024-01-03 18:57:03 +000011781
11782// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11783// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11784func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11785 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11786 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11787 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11788 // Variations are created based on apex_name
11789 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11790 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11791 }
11792 // for a mainline module family, check that only the flagged soong module is visible to make
11793 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11794 variation := func(moduleName string) string {
11795 ret := "android_common_com.android.foo"
11796 if moduleName == "com.google.android.foo" {
11797 ret = "android_common_com.google.android.foo_com.android.foo"
11798 }
11799 return ret
11800 }
11801
11802 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11803 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11804
11805 for _, hiddenModuleName := range hiddenModuleNames {
11806 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11807 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11808
11809 }
11810 }
11811
11812 bp := `
11813 apex_key {
11814 name: "com.android.foo.key",
11815 public_key: "com.android.foo.avbpubkey",
11816 private_key: "com.android.foo.pem",
11817 }
11818
11819 // AOSP source apex
11820 apex {
11821 name: "com.android.foo",
11822 key: "com.android.foo.key",
11823 updatable: false,
11824 }
11825
11826 // Google source apex
11827 override_apex {
11828 name: "com.google.android.foo",
11829 base: "com.android.foo",
11830 key: "com.android.foo.key",
11831 }
11832
11833 // Prebuilt Google APEX.
11834
11835 prebuilt_apex {
11836 name: "com.google.android.foo",
11837 apex_name: "com.android.foo",
11838 src: "com.android.foo-arm.apex",
11839 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11840 }
11841
11842 // Another Prebuilt Google APEX
11843 prebuilt_apex {
11844 name: "com.google.android.foo.v2",
11845 apex_name: "com.android.foo",
11846 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11847 src: "com.android.foo-arm.apex",
11848 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11849 }
11850
11851 // APEX contribution modules
11852
11853 apex_contributions {
11854 name: "foo.source.contributions",
11855 api_domain: "com.android.foo",
11856 contents: ["com.google.android.foo"],
11857 }
11858
11859 apex_contributions {
11860 name: "foo.prebuilt.contributions",
11861 api_domain: "com.android.foo",
11862 contents: ["prebuilt_com.google.android.foo"],
11863 }
11864
11865 apex_contributions {
11866 name: "foo.prebuilt.v2.contributions",
11867 api_domain: "com.android.foo",
11868 contents: ["prebuilt_com.google.android.foo.v2"],
11869 }
11870
11871 // This is an incompatible module because it selects multiple versions of the same mainline module
11872 apex_contributions {
11873 name: "foo.prebuilt.duplicate.contributions",
11874 api_domain: "com.android.foo",
11875 contents: [
11876 "prebuilt_com.google.android.foo",
11877 "prebuilt_com.google.android.foo.v2",
11878 ],
11879 }
11880 `
11881
11882 testCases := []struct {
11883 desc string
11884 selectedApexContributions string
11885 expectedVisibleModuleName string
11886 expectedHiddenModuleNames []string
11887 expectedError string
11888 }{
11889 {
11890 desc: "Source apex is selected, prebuilts should be hidden from make",
11891 selectedApexContributions: "foo.source.contributions",
11892 expectedVisibleModuleName: "com.google.android.foo",
11893 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11894 },
11895 {
11896 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11897 selectedApexContributions: "foo.prebuilt.contributions",
11898 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11899 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11900 },
11901 {
11902 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11903 selectedApexContributions: "foo.prebuilt.v2.contributions",
11904 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11905 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11906 },
11907 {
11908 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11909 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11910 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11911 },
11912 }
11913
11914 for _, tc := range testCases {
11915 preparer := android.GroupFixturePreparers(
11916 android.FixtureMergeMockFs(map[string][]byte{
11917 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11918 }),
11919 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11920 variables.BuildFlags = map[string]string{
11921 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11922 }
11923 }),
11924 )
11925 if tc.expectedError != "" {
11926 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11927 testApex(t, bp, preparer)
11928 return
11929 }
11930 ctx := testApex(t, bp, preparer)
11931
11932 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11933 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11934 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11935 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11936
11937 // Check that
11938 // 1. The contents of the selected apex_contributions are visible to make
11939 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11940 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11941 }
11942}