blob: a943e4e024e46d5854b806ac561b36e048504b1f [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
Jooyung Hanaf730952023-02-28 14:13:38 +0900793func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900794 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900796 if vendor {
797 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 }
799 ctx := testApex(t, `
800 apex {
801 name: "myapex",
802 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900803 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900804 `+prop+`
805 }
806
807 apex_key {
808 name: "myapex.key",
809 public_key: "testkey.avbpubkey",
810 private_key: "testkey.pem",
811 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900813
Jooyung Hana0503a52023-08-23 13:12:50 +0900814 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 if vendor {
816 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
817 rule.RuleParams.Command,
818 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900819 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900820 android.AssertStringDoesContain(t, "should force-label as system_file",
821 rule.RuleParams.Command,
822 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900823 }
824 }
825}
826
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800828 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829 apex {
830 name: "myapex",
831 key: "myapex.key",
832 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900833 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000834 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 }
836
837 apex_key {
838 name: "myapex.key",
839 public_key: "testkey.avbpubkey",
840 private_key: "testkey.pem",
841 }
842
843 cc_library {
844 name: "mylib",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["mylib2", "mylib3"],
847 system_shared_libs: [],
848 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000849 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
851
852 cc_library {
853 name: "mylib2",
854 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900855 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900856 system_shared_libs: [],
857 stl: "none",
858 stubs: {
859 versions: ["1", "2", "3"],
860 },
861 }
862
863 cc_library {
864 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900865 srcs: ["mylib.cpp"],
866 shared_libs: ["mylib4"],
867 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 stl: "none",
869 stubs: {
870 versions: ["10", "11", "12"],
871 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000872 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900874
875 cc_library {
876 name: "mylib4",
877 srcs: ["mylib.cpp"],
878 system_shared_libs: [],
879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000880 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900881 }
Jiyong Park105dc322021-06-11 17:22:09 +0900882
883 rust_binary {
884 name: "foo.rust",
885 srcs: ["foo.rs"],
886 shared_libs: ["libfoo.shared_from_rust"],
887 prefer_rlib: true,
888 apex_available: ["myapex"],
889 }
890
891 cc_library_shared {
892 name: "libfoo.shared_from_rust",
893 srcs: ["mylib.cpp"],
894 system_shared_libs: [],
895 stl: "none",
896 stubs: {
897 versions: ["10", "11", "12"],
898 },
899 }
900
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 `)
902
Jooyung Hana0503a52023-08-23 13:12:50 +0900903 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 copyCmds := apexRule.Args["copy_commands"]
905
906 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800913 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914
Colin Crossaede88c2020-08-11 12:17:01 -0700915 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900918 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900920 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // 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 -0700923 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700925 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900926
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700927 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
928 // is replaced by sharing of "cFlags" in cc/builder.go.
929 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
930 // module variable representing "cflags". So it was not detected by ensureNotContains.
931 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
932 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
933 // including the original cflags's "-include mylib.h".
934 //
Jiyong Park64379952018-12-13 18:37:29 +0900935 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700936 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
937 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900938
Jiyong Park85cc35a2022-07-17 11:30:47 +0900939 // Ensure that genstub for platform-provided lib is invoked with --systemapi
940 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
941 // Ensure that genstub for apex-provided lib is invoked with --apex
942 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900943
Jooyung Hana0503a52023-08-23 13:12:50 +0900944 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900945 "lib64/mylib.so",
946 "lib64/mylib3.so",
947 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900948 "bin/foo.rust",
949 "lib64/libc++.so", // by the implicit dependency from foo.rust
950 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900951 })
Jiyong Park105dc322021-06-11 17:22:09 +0900952
953 // Ensure that stub dependency from a rust module is not included
954 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
955 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700956 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900957 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
958 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900959
Jooyung Hana0503a52023-08-23 13:12:50 +0900960 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900961 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962}
963
Jooyung Han20348752023-12-05 15:23:56 +0900964func TestApexShouldNotEmbedStubVariant(t *testing.T) {
965 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
966 apex {
967 name: "myapex",
968 key: "myapex.key",
969 vendor: true,
970 updatable: false,
971 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 cc_library {
981 name: "libbar",
982 srcs: ["mylib.cpp"],
983 llndk: {
984 symbol_file: "libbar.map.txt",
985 }
986 }
987 `)
988}
989
Jiyong Park1bc84122021-06-22 20:23:05 +0900990func TestApexCanUsePrivateApis(t *testing.T) {
991 ctx := testApex(t, `
992 apex {
993 name: "myapex",
994 key: "myapex.key",
995 native_shared_libs: ["mylib"],
996 binaries: ["foo.rust"],
997 updatable: false,
998 platform_apis: true,
999 }
1000
1001 apex_key {
1002 name: "myapex.key",
1003 public_key: "testkey.avbpubkey",
1004 private_key: "testkey.pem",
1005 }
1006
1007 cc_library {
1008 name: "mylib",
1009 srcs: ["mylib.cpp"],
1010 shared_libs: ["mylib2"],
1011 system_shared_libs: [],
1012 stl: "none",
1013 apex_available: [ "myapex" ],
1014 }
1015
1016 cc_library {
1017 name: "mylib2",
1018 srcs: ["mylib.cpp"],
1019 cflags: ["-include mylib.h"],
1020 system_shared_libs: [],
1021 stl: "none",
1022 stubs: {
1023 versions: ["1", "2", "3"],
1024 },
1025 }
1026
1027 rust_binary {
1028 name: "foo.rust",
1029 srcs: ["foo.rs"],
1030 shared_libs: ["libfoo.shared_from_rust"],
1031 prefer_rlib: true,
1032 apex_available: ["myapex"],
1033 }
1034
1035 cc_library_shared {
1036 name: "libfoo.shared_from_rust",
1037 srcs: ["mylib.cpp"],
1038 system_shared_libs: [],
1039 stl: "none",
1040 stubs: {
1041 versions: ["10", "11", "12"],
1042 },
1043 }
1044 `)
1045
Jooyung Hana0503a52023-08-23 13:12:50 +09001046 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001047 copyCmds := apexRule.Args["copy_commands"]
1048
1049 // Ensure that indirect stubs dep is not included
1050 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1051 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1052
1053 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1054 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001056 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1057 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001058 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001059 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1060 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1061}
1062
Colin Cross7812fd32020-09-25 12:35:10 -07001063func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1064 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001065 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001066 apex {
1067 name: "myapex",
1068 key: "myapex.key",
1069 native_shared_libs: ["mylib", "mylib3"],
1070 min_sdk_version: "29",
1071 }
1072
1073 apex_key {
1074 name: "myapex.key",
1075 public_key: "testkey.avbpubkey",
1076 private_key: "testkey.pem",
1077 }
1078
1079 cc_library {
1080 name: "mylib",
1081 srcs: ["mylib.cpp"],
1082 shared_libs: ["mylib2", "mylib3"],
1083 system_shared_libs: [],
1084 stl: "none",
1085 apex_available: [ "myapex" ],
1086 min_sdk_version: "28",
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: ["28", "29", "30", "current"],
1097 },
1098 min_sdk_version: "28",
1099 }
1100
1101 cc_library {
1102 name: "mylib3",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib4"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 stubs: {
1108 versions: ["28", "29", "30", "current"],
1109 },
1110 apex_available: [ "myapex" ],
1111 min_sdk_version: "28",
1112 }
1113
1114 cc_library {
1115 name: "mylib4",
1116 srcs: ["mylib.cpp"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex" ],
1120 min_sdk_version: "28",
1121 }
1122 `)
1123
Jooyung Hana0503a52023-08-23 13:12:50 +09001124 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 copyCmds := apexRule.Args["copy_commands"]
1126
1127 // Ensure that direct non-stubs dep is always included
1128 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1129
1130 // Ensure that indirect stubs dep is not included
1131 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1132
1133 // Ensure that direct stubs dep is included
1134 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1135
1136 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1137
Jiyong Park55549df2021-02-26 23:57:23 +09001138 // Ensure that mylib is linking with the latest version of stub for mylib2
1139 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001140 // ... and not linking to the non-stub (impl) variant of mylib2
1141 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1142
1143 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1144 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1145 // .. and not linking to the stubs variant of mylib3
1146 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1147
1148 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001149 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001150 ensureNotContains(t, mylib2Cflags, "-include ")
1151
Jiyong Park85cc35a2022-07-17 11:30:47 +09001152 // Ensure that genstub is invoked with --systemapi
1153 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001154
Jooyung Hana0503a52023-08-23 13:12:50 +09001155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001156 "lib64/mylib.so",
1157 "lib64/mylib3.so",
1158 "lib64/mylib4.so",
1159 })
1160}
1161
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001162func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1163 t.Parallel()
1164 // myapex (Z)
1165 // mylib -----------------.
1166 // |
1167 // otherapex (29) |
1168 // libstub's versions: 29 Z current
1169 // |
1170 // <platform> |
1171 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001172 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001173 apex {
1174 name: "myapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["mylib"],
1177 min_sdk_version: "Z", // non-final
1178 }
1179
1180 cc_library {
1181 name: "mylib",
1182 srcs: ["mylib.cpp"],
1183 shared_libs: ["libstub"],
1184 apex_available: ["myapex"],
1185 min_sdk_version: "Z",
1186 }
1187
1188 apex_key {
1189 name: "myapex.key",
1190 public_key: "testkey.avbpubkey",
1191 private_key: "testkey.pem",
1192 }
1193
1194 apex {
1195 name: "otherapex",
1196 key: "myapex.key",
1197 native_shared_libs: ["libstub"],
1198 min_sdk_version: "29",
1199 }
1200
1201 cc_library {
1202 name: "libstub",
1203 srcs: ["mylib.cpp"],
1204 stubs: {
1205 versions: ["29", "Z", "current"],
1206 },
1207 apex_available: ["otherapex"],
1208 min_sdk_version: "29",
1209 }
1210
1211 // platform module depending on libstub from otherapex should use the latest stub("current")
1212 cc_library {
1213 name: "libplatform",
1214 srcs: ["mylib.cpp"],
1215 shared_libs: ["libstub"],
1216 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001217 `,
1218 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1219 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1220 variables.Platform_sdk_final = proptools.BoolPtr(false)
1221 variables.Platform_version_active_codenames = []string{"Z"}
1222 }),
1223 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001224
Jiyong Park55549df2021-02-26 23:57:23 +09001225 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001226 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001227 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001228 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001229 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001230
1231 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1232 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1233 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1234 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1235 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1236}
1237
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001238func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001239 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001240 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001241 name: "myapex2",
1242 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001244 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001248 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001249 public_key: "testkey.avbpubkey",
1250 private_key: "testkey.pem",
1251 }
1252
1253 cc_library {
1254 name: "mylib",
1255 srcs: ["mylib.cpp"],
1256 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001257 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 system_shared_libs: [],
1259 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001260 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 }
1262
1263 cc_library {
1264 name: "libfoo",
1265 srcs: ["mylib.cpp"],
1266 shared_libs: ["libbar"],
1267 system_shared_libs: [],
1268 stl: "none",
1269 stubs: {
1270 versions: ["10", "20", "30"],
1271 },
1272 }
1273
1274 cc_library {
1275 name: "libbar",
1276 srcs: ["mylib.cpp"],
1277 system_shared_libs: [],
1278 stl: "none",
1279 }
1280
Jiyong Park678c8812020-02-07 17:25:49 +09001281 cc_library_static {
1282 name: "libbaz",
1283 srcs: ["mylib.cpp"],
1284 system_shared_libs: [],
1285 stl: "none",
1286 apex_available: [ "myapex2" ],
1287 }
1288
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289 `)
1290
Jooyung Hana0503a52023-08-23 13:12:50 +09001291 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 copyCmds := apexRule.Args["copy_commands"]
1293
1294 // Ensure that direct non-stubs dep is always included
1295 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1296
1297 // Ensure that indirect stubs dep is not included
1298 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1299
1300 // Ensure that dependency of stubs is not included
1301 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1302
Colin Crossaede88c2020-08-11 12:17:01 -07001303 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304
1305 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001306 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001307 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001308 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309
Jiyong Park3ff16992019-12-27 14:11:47 +09001310 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311
1312 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1313 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314
Colin Crossf61d03d2023-11-02 16:56:39 -07001315 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1316 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001317 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001318
Colin Crossf61d03d2023-11-02 16:56:39 -07001319 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1320 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001321 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001322}
1323
Jooyung Hand3639552019-08-09 12:57:43 +09001324func TestApexWithRuntimeLibsDependency(t *testing.T) {
1325 /*
1326 myapex
1327 |
1328 v (runtime_libs)
1329 mylib ------+------> libfoo [provides stub]
1330 |
1331 `------> libbar
1332 */
Colin Cross1c460562021-02-16 17:55:47 -08001333 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001334 apex {
1335 name: "myapex",
1336 key: "myapex.key",
1337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001338 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001339 }
1340
1341 apex_key {
1342 name: "myapex.key",
1343 public_key: "testkey.avbpubkey",
1344 private_key: "testkey.pem",
1345 }
1346
1347 cc_library {
1348 name: "mylib",
1349 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001350 static_libs: ["libstatic"],
1351 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001352 runtime_libs: ["libfoo", "libbar"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 cc_library {
1359 name: "libfoo",
1360 srcs: ["mylib.cpp"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 stubs: {
1364 versions: ["10", "20", "30"],
1365 },
1366 }
1367
1368 cc_library {
1369 name: "libbar",
1370 srcs: ["mylib.cpp"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
Liz Kammer5f108fa2023-05-11 14:33:17 -04001376 cc_library {
1377 name: "libstatic",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
1382 runtime_libs: ["libstatic_to_runtime"],
1383 }
1384
1385 cc_library {
1386 name: "libshared",
1387 srcs: ["mylib.cpp"],
1388 system_shared_libs: [],
1389 stl: "none",
1390 apex_available: [ "myapex" ],
1391 runtime_libs: ["libshared_to_runtime"],
1392 }
1393
1394 cc_library {
1395 name: "libstatic_to_runtime",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 }
1401
1402 cc_library {
1403 name: "libshared_to_runtime",
1404 srcs: ["mylib.cpp"],
1405 system_shared_libs: [],
1406 stl: "none",
1407 apex_available: [ "myapex" ],
1408 }
Jooyung Hand3639552019-08-09 12:57:43 +09001409 `)
1410
Jooyung Hana0503a52023-08-23 13:12:50 +09001411 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001412 copyCmds := apexRule.Args["copy_commands"]
1413
1414 // Ensure that direct non-stubs dep is always included
1415 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1416
1417 // Ensure that indirect stubs dep is not included
1418 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1419
1420 // Ensure that runtime_libs dep in included
1421 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001422 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1423 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1424
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001426
Jooyung Hana0503a52023-08-23 13:12:50 +09001427 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001428 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1429 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001430}
1431
Paul Duffina02cae32021-03-09 01:44:06 +00001432var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1433 cc.PrepareForTestWithCcBuildComponents,
1434 PrepareForTestWithApexBuildComponents,
1435 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 apex {
1437 name: "com.android.runtime",
1438 key: "com.android.runtime.key",
1439 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001440 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001441 }
1442
1443 apex_key {
1444 name: "com.android.runtime.key",
1445 public_key: "testkey.avbpubkey",
1446 private_key: "testkey.pem",
1447 }
Paul Duffina02cae32021-03-09 01:44:06 +00001448 `),
1449 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1450)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451
Paul Duffina02cae32021-03-09 01:44:06 +00001452func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001453 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 cc_library {
1455 name: "libc",
1456 no_libcrt: true,
1457 nocrt: true,
1458 stl: "none",
1459 system_shared_libs: [],
1460 stubs: { versions: ["1"] },
1461 apex_available: ["com.android.runtime"],
1462
1463 sanitize: {
1464 hwaddress: true,
1465 }
1466 }
1467
1468 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470 no_libcrt: true,
1471 nocrt: true,
1472 stl: "none",
1473 system_shared_libs: [],
1474 srcs: [""],
1475 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001476 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 sanitize: {
1479 never: true,
1480 },
Spandan Das4de7b492023-05-05 21:13:01 +00001481 apex_available: [
1482 "//apex_available:anyapex",
1483 "//apex_available:platform",
1484 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001485 } `)
1486 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001487
Jooyung Hana0503a52023-08-23 13:12:50 +09001488 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 "lib64/bionic/libc.so",
1490 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1491 })
1492
Colin Cross4c4c1be2022-02-10 11:41:18 -08001493 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001494
1495 installed := hwasan.Description("install libclang_rt.hwasan")
1496 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1497
1498 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1499 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1500 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1501}
1502
1503func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001504 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001505 prepareForTestOfRuntimeApexWithHwasan,
1506 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1507 variables.SanitizeDevice = []string{"hwaddress"}
1508 }),
1509 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001510 cc_library {
1511 name: "libc",
1512 no_libcrt: true,
1513 nocrt: true,
1514 stl: "none",
1515 system_shared_libs: [],
1516 stubs: { versions: ["1"] },
1517 apex_available: ["com.android.runtime"],
1518 }
1519
1520 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001521 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522 no_libcrt: true,
1523 nocrt: true,
1524 stl: "none",
1525 system_shared_libs: [],
1526 srcs: [""],
1527 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001528 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001529
1530 sanitize: {
1531 never: true,
1532 },
Spandan Das4de7b492023-05-05 21:13:01 +00001533 apex_available: [
1534 "//apex_available:anyapex",
1535 "//apex_available:platform",
1536 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001537 }
Paul Duffina02cae32021-03-09 01:44:06 +00001538 `)
1539 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540
Jooyung Hana0503a52023-08-23 13:12:50 +09001541 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542 "lib64/bionic/libc.so",
1543 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1544 })
1545
Colin Cross4c4c1be2022-02-10 11:41:18 -08001546 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547
1548 installed := hwasan.Description("install libclang_rt.hwasan")
1549 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1550
1551 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1552 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1553 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1554}
1555
Jooyung Han61b66e92020-03-21 14:21:46 +00001556func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1557 testcases := []struct {
1558 name string
1559 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001560 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 shouldLink string
1562 shouldNotLink []string
1563 }{
1564 {
Jiyong Park55549df2021-02-26 23:57:23 +09001565 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001566 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001567 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001568 shouldLink: "current",
1569 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 },
1571 {
Jiyong Park55549df2021-02-26 23:57:23 +09001572 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001573 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001574 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 shouldLink: "current",
1576 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001577 },
1578 }
1579 for _, tc := range testcases {
1580 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001581 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 apex {
1583 name: "myapex",
1584 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001585 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001586 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001587 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001589
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 apex_key {
1591 name: "myapex.key",
1592 public_key: "testkey.avbpubkey",
1593 private_key: "testkey.pem",
1594 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001595
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 cc_library {
1597 name: "mylib",
1598 srcs: ["mylib.cpp"],
1599 vendor_available: true,
1600 shared_libs: ["libbar"],
1601 system_shared_libs: [],
1602 stl: "none",
1603 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001604 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001605 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001606
Jooyung Han61b66e92020-03-21 14:21:46 +00001607 cc_library {
1608 name: "libbar",
1609 srcs: ["mylib.cpp"],
1610 system_shared_libs: [],
1611 stl: "none",
1612 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001613 llndk: {
1614 symbol_file: "libbar.map.txt",
1615 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001616 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001617 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001618 withUnbundledBuild,
1619 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001620
Jooyung Han61b66e92020-03-21 14:21:46 +00001621 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001622 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001623 "lib64/mylib.so",
1624 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001625
Jooyung Han61b66e92020-03-21 14:21:46 +00001626 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001627 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1629 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001630
Steven Moreland2c4000c2021-04-27 02:08:49 +00001631 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1632 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001633 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001634 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001635 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001636
Steven Moreland2c4000c2021-04-27 02:08:49 +00001637 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001638 ver := tc.shouldLink
1639 if tc.shouldLink == "current" {
1640 ver = strconv.Itoa(android.FutureApiLevelInt)
1641 }
1642 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001643 })
1644 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001645}
1646
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001648 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001649 apex {
1650 name: "myapex",
1651 key: "myapex.key",
1652 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001653 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 }
1655
1656 apex_key {
1657 name: "myapex.key",
1658 public_key: "testkey.avbpubkey",
1659 private_key: "testkey.pem",
1660 }
1661
1662 cc_library {
1663 name: "mylib",
1664 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001665 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 shared_libs: ["libdl#27"],
1667 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001668 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001669 }
1670
1671 cc_library_shared {
1672 name: "mylib_shared",
1673 srcs: ["mylib.cpp"],
1674 shared_libs: ["libdl#27"],
1675 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001676 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677 }
1678
1679 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001680 name: "libBootstrap",
1681 srcs: ["mylib.cpp"],
1682 stl: "none",
1683 bootstrap: true,
1684 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685 `)
1686
Jooyung Hana0503a52023-08-23 13:12:50 +09001687 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001688 copyCmds := apexRule.Args["copy_commands"]
1689
1690 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001691 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001692 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1693 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001694
1695 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001696 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697
Colin Crossaede88c2020-08-11 12:17:01 -07001698 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1699 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1700 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701
1702 // For dependency to libc
1703 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001704 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001705 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001706 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001707 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1709 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710
1711 // For dependency to libm
1712 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001713 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001715 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001716 // ... and is not compiling with the stub
1717 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1718 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1719
1720 // For dependency to libdl
1721 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001722 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001724 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1725 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001727 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728 // ... Cflags from stub is correctly exported to mylib
1729 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1730 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001731
1732 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001733 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1734 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1735 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1736 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001737}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001738
Jooyung Han749dc692020-04-15 11:03:39 +09001739func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001740 // there are three links between liba --> libz.
1741 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001742 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001743 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001744 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001745 apex {
1746 name: "myapex",
1747 key: "myapex.key",
1748 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001749 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001750 }
1751
1752 apex {
1753 name: "otherapex",
1754 key: "myapex.key",
1755 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001756 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001757 }
1758
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764
1765 cc_library {
1766 name: "libx",
1767 shared_libs: ["liba"],
1768 system_shared_libs: [],
1769 stl: "none",
1770 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001771 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001772 }
1773
1774 cc_library {
1775 name: "liby",
1776 shared_libs: ["liba"],
1777 system_shared_libs: [],
1778 stl: "none",
1779 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001780 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001781 }
1782
1783 cc_library {
1784 name: "liba",
1785 shared_libs: ["libz"],
1786 system_shared_libs: [],
1787 stl: "none",
1788 apex_available: [
1789 "//apex_available:anyapex",
1790 "//apex_available:platform",
1791 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001792 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001793 }
1794
1795 cc_library {
1796 name: "libz",
1797 system_shared_libs: [],
1798 stl: "none",
1799 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001800 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001801 },
1802 }
Jooyung Han749dc692020-04-15 11:03:39 +09001803 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001804
1805 expectLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
1809 expectNoLink := func(from, from_variant, to, to_variant string) {
1810 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1811 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1812 }
1813 // platform liba is linked to non-stub version
1814 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001815 // liba in myapex is linked to current
1816 expectLink("liba", "shared_apex29", "libz", "shared_current")
1817 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001818 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001819 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001820 // liba in otherapex is linked to current
1821 expectLink("liba", "shared_apex30", "libz", "shared_current")
1822 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001823 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1824 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001825}
1826
Jooyung Hanaed150d2020-04-02 01:41:41 +09001827func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001828 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001829 apex {
1830 name: "myapex",
1831 key: "myapex.key",
1832 native_shared_libs: ["libx"],
1833 min_sdk_version: "R",
1834 }
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: ["libz"],
1845 system_shared_libs: [],
1846 stl: "none",
1847 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001848 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001849 }
1850
1851 cc_library {
1852 name: "libz",
1853 system_shared_libs: [],
1854 stl: "none",
1855 stubs: {
1856 versions: ["29", "R"],
1857 },
1858 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001859 `,
1860 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1861 variables.Platform_version_active_codenames = []string{"R"}
1862 }),
1863 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001864
1865 expectLink := func(from, from_variant, to, to_variant string) {
1866 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1867 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1868 }
1869 expectNoLink := func(from, from_variant, to, to_variant string) {
1870 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1871 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1872 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001873 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1874 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001875 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1876 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001877}
1878
Jooyung Han4c4da062021-06-23 10:23:16 +09001879func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1880 testApex(t, `
1881 apex {
1882 name: "myapex",
1883 key: "myapex.key",
1884 java_libs: ["libx"],
1885 min_sdk_version: "S",
1886 }
1887
1888 apex_key {
1889 name: "myapex.key",
1890 public_key: "testkey.avbpubkey",
1891 private_key: "testkey.pem",
1892 }
1893
1894 java_library {
1895 name: "libx",
1896 srcs: ["a.java"],
1897 apex_available: [ "myapex" ],
1898 sdk_version: "current",
1899 min_sdk_version: "S", // should be okay
1900 }
1901 `,
1902 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1903 variables.Platform_version_active_codenames = []string{"S"}
1904 variables.Platform_sdk_codename = proptools.StringPtr("S")
1905 }),
1906 )
1907}
1908
Jooyung Han749dc692020-04-15 11:03:39 +09001909func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001910 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001911 apex {
1912 name: "myapex",
1913 key: "myapex.key",
1914 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001915 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001916 }
1917
1918 apex_key {
1919 name: "myapex.key",
1920 public_key: "testkey.avbpubkey",
1921 private_key: "testkey.pem",
1922 }
1923
1924 cc_library {
1925 name: "libx",
1926 shared_libs: ["libz"],
1927 system_shared_libs: [],
1928 stl: "none",
1929 apex_available: [ "myapex" ],
1930 }
1931
1932 cc_library {
1933 name: "libz",
1934 system_shared_libs: [],
1935 stl: "none",
1936 stubs: {
1937 versions: ["1", "2"],
1938 },
1939 }
1940 `)
1941
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")
Colin Crossaede88c2020-08-11 12:17:01 -07001951 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001952 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001954}
1955
Jooyung Handfc864c2023-03-20 18:19:07 +09001956func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001957 ctx := testApex(t, `
1958 apex {
1959 name: "myapex",
1960 key: "myapex.key",
1961 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001962 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001963 vendor: true,
1964 min_sdk_version: "29",
1965 }
1966
1967 apex_key {
1968 name: "myapex.key",
1969 public_key: "testkey.avbpubkey",
1970 private_key: "testkey.pem",
1971 }
1972
1973 cc_library {
1974 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001975 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001976 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001977 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001978 shared_libs: ["libbar"],
1979 }
1980
1981 cc_library {
1982 name: "libbar",
1983 stubs: { versions: ["29", "30"] },
1984 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001985 }
1986 `)
1987
1988 vendorVariant := "android_vendor.29_arm64_armv8-a"
1989
Jooyung Handfc864c2023-03-20 18:19:07 +09001990 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1991
1992 // Ensure that mylib links with "current" LLNDK
1993 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1994 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1995
1996 // Ensure that mylib is targeting 29
1997 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1998 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1999
2000 // Ensure that the correct variant of crtbegin_so is used.
2001 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2002 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002003
2004 // Ensure that the crtbegin_so used by the APEX is targeting 29
2005 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2006 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2007}
2008
Jooyung Han4495f842023-04-25 16:39:59 +09002009func TestTrackAllowedDeps(t *testing.T) {
2010 ctx := testApex(t, `
2011 apex {
2012 name: "myapex",
2013 key: "myapex.key",
2014 updatable: true,
2015 native_shared_libs: [
2016 "mylib",
2017 "yourlib",
2018 ],
2019 min_sdk_version: "29",
2020 }
2021
2022 apex {
2023 name: "myapex2",
2024 key: "myapex.key",
2025 updatable: false,
2026 native_shared_libs: ["yourlib"],
2027 }
2028
2029 apex_key {
2030 name: "myapex.key",
2031 public_key: "testkey.avbpubkey",
2032 private_key: "testkey.pem",
2033 }
2034
2035 cc_library {
2036 name: "mylib",
2037 srcs: ["mylib.cpp"],
2038 shared_libs: ["libbar"],
2039 min_sdk_version: "29",
2040 apex_available: ["myapex"],
2041 }
2042
2043 cc_library {
2044 name: "libbar",
2045 stubs: { versions: ["29", "30"] },
2046 }
2047
2048 cc_library {
2049 name: "yourlib",
2050 srcs: ["mylib.cpp"],
2051 min_sdk_version: "29",
2052 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2053 }
2054 `, withFiles(android.MockFS{
2055 "packages/modules/common/build/allowed_deps.txt": nil,
2056 }))
2057
2058 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2059 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2060 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002061 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002062 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002063 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002064
Jooyung Hana0503a52023-08-23 13:12:50 +09002065 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002066 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2067 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002068 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2069 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2070 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2071 flatlist, "mylib:(minSdkVersion:29)")
2072 android.AssertStringListContains(t, "track platform-available lib",
2073 flatlist, "yourlib(minSdkVersion:29)")
2074}
2075
2076func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2077 ctx := testApex(t, `
2078 apex {
2079 name: "myapex",
2080 key: "myapex.key",
2081 updatable: true,
2082 min_sdk_version: "29",
2083 }
2084
2085 apex_key {
2086 name: "myapex.key",
2087 public_key: "testkey.avbpubkey",
2088 private_key: "testkey.pem",
2089 }
2090 `)
2091 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2092 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2093 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2094 }
2095}
2096
Jooyung Han03b51852020-02-26 22:45:42 +09002097func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002098 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002099 apex {
2100 name: "myapex",
2101 key: "myapex.key",
2102 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002103 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002104 }
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: "libx",
2114 system_shared_libs: [],
2115 stl: "none",
2116 apex_available: [ "myapex" ],
2117 stubs: {
2118 versions: ["1", "2"],
2119 },
2120 }
2121
2122 cc_library {
2123 name: "libz",
2124 shared_libs: ["libx"],
2125 system_shared_libs: [],
2126 stl: "none",
2127 }
2128 `)
2129
2130 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002131 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002132 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2133 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2134 }
2135 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002136 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002137 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2138 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2139 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002140 expectLink("libz", "shared", "libx", "shared_current")
2141 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002142 expectNoLink("libz", "shared", "libz", "shared_1")
2143 expectNoLink("libz", "shared", "libz", "shared")
2144}
2145
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002146var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2147 func(variables android.FixtureProductVariables) {
2148 variables.SanitizeDevice = []string{"hwaddress"}
2149 },
2150)
2151
Jooyung Han75568392020-03-20 04:29:24 +09002152func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002153 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002154 apex {
2155 name: "myapex",
2156 key: "myapex.key",
2157 native_shared_libs: ["libx"],
2158 min_sdk_version: "29",
2159 }
2160
2161 apex_key {
2162 name: "myapex.key",
2163 public_key: "testkey.avbpubkey",
2164 private_key: "testkey.pem",
2165 }
2166
2167 cc_library {
2168 name: "libx",
2169 shared_libs: ["libbar"],
2170 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002171 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002172 }
2173
2174 cc_library {
2175 name: "libbar",
2176 stubs: {
2177 versions: ["29", "30"],
2178 },
2179 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002180 `,
2181 prepareForTestWithSantitizeHwaddress,
2182 )
Jooyung Han03b51852020-02-26 22:45:42 +09002183 expectLink := func(from, from_variant, to, to_variant string) {
2184 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2185 libFlags := ld.Args["libFlags"]
2186 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2187 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002188 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002189}
2190
Jooyung Han75568392020-03-20 04:29:24 +09002191func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002192 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002193 apex {
2194 name: "myapex",
2195 key: "myapex.key",
2196 native_shared_libs: ["libx"],
2197 min_sdk_version: "29",
2198 }
2199
2200 apex_key {
2201 name: "myapex.key",
2202 public_key: "testkey.avbpubkey",
2203 private_key: "testkey.pem",
2204 }
2205
2206 cc_library {
2207 name: "libx",
2208 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002209 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002210 }
Jooyung Han75568392020-03-20 04:29:24 +09002211 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002212
2213 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002214 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002215 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002216 // note that platform variant is not.
2217 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002218 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002219}
2220
Jooyung Han749dc692020-04-15 11:03:39 +09002221func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2222 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002226 native_shared_libs: ["mylib"],
2227 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002228 }
2229
2230 apex_key {
2231 name: "myapex.key",
2232 public_key: "testkey.avbpubkey",
2233 private_key: "testkey.pem",
2234 }
Jooyung Han749dc692020-04-15 11:03:39 +09002235
2236 cc_library {
2237 name: "mylib",
2238 srcs: ["mylib.cpp"],
2239 system_shared_libs: [],
2240 stl: "none",
2241 apex_available: [
2242 "myapex",
2243 ],
2244 min_sdk_version: "30",
2245 }
2246 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002247
2248 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2249 apex {
2250 name: "myapex",
2251 key: "myapex.key",
2252 native_shared_libs: ["libfoo.ffi"],
2253 min_sdk_version: "29",
2254 }
2255
2256 apex_key {
2257 name: "myapex.key",
2258 public_key: "testkey.avbpubkey",
2259 private_key: "testkey.pem",
2260 }
2261
2262 rust_ffi_shared {
2263 name: "libfoo.ffi",
2264 srcs: ["foo.rs"],
2265 crate_name: "foo",
2266 apex_available: [
2267 "myapex",
2268 ],
2269 min_sdk_version: "30",
2270 }
2271 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002272
2273 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2274 apex {
2275 name: "myapex",
2276 key: "myapex.key",
2277 java_libs: ["libfoo"],
2278 min_sdk_version: "29",
2279 }
2280
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286
2287 java_import {
2288 name: "libfoo",
2289 jars: ["libfoo.jar"],
2290 apex_available: [
2291 "myapex",
2292 ],
2293 min_sdk_version: "30",
2294 }
2295 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002296
2297 // Skip check for modules compiling against core API surface
2298 testApex(t, `
2299 apex {
2300 name: "myapex",
2301 key: "myapex.key",
2302 java_libs: ["libfoo"],
2303 min_sdk_version: "29",
2304 }
2305
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311
2312 java_library {
2313 name: "libfoo",
2314 srcs: ["Foo.java"],
2315 apex_available: [
2316 "myapex",
2317 ],
2318 // Compile against core API surface
2319 sdk_version: "core_current",
2320 min_sdk_version: "30",
2321 }
2322 `)
2323
Jooyung Han749dc692020-04-15 11:03:39 +09002324}
2325
2326func TestApexMinSdkVersion_Okay(t *testing.T) {
2327 testApex(t, `
2328 apex {
2329 name: "myapex",
2330 key: "myapex.key",
2331 native_shared_libs: ["libfoo"],
2332 java_libs: ["libbar"],
2333 min_sdk_version: "29",
2334 }
2335
2336 apex_key {
2337 name: "myapex.key",
2338 public_key: "testkey.avbpubkey",
2339 private_key: "testkey.pem",
2340 }
2341
2342 cc_library {
2343 name: "libfoo",
2344 srcs: ["mylib.cpp"],
2345 shared_libs: ["libfoo_dep"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
2349
2350 cc_library {
2351 name: "libfoo_dep",
2352 srcs: ["mylib.cpp"],
2353 apex_available: ["myapex"],
2354 min_sdk_version: "29",
2355 }
2356
2357 java_library {
2358 name: "libbar",
2359 sdk_version: "current",
2360 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002361 static_libs: [
2362 "libbar_dep",
2363 "libbar_import_dep",
2364 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002365 apex_available: ["myapex"],
2366 min_sdk_version: "29",
2367 }
2368
2369 java_library {
2370 name: "libbar_dep",
2371 sdk_version: "current",
2372 srcs: ["a.java"],
2373 apex_available: ["myapex"],
2374 min_sdk_version: "29",
2375 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002376
2377 java_import {
2378 name: "libbar_import_dep",
2379 jars: ["libbar.jar"],
2380 apex_available: ["myapex"],
2381 min_sdk_version: "29",
2382 }
Jooyung Han03b51852020-02-26 22:45:42 +09002383 `)
2384}
2385
Colin Cross8ca61c12022-10-06 21:00:14 -07002386func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2387 // Tests that an apex dependency with min_sdk_version higher than the
2388 // min_sdk_version of the apex is allowed as long as the dependency's
2389 // min_sdk_version is less than or equal to the api level that the
2390 // architecture was introduced in. In this case, arm64 didn't exist
2391 // until api level 21, so the arm64 code will never need to run on
2392 // an api level 20 device, even if other architectures of the apex
2393 // will.
2394 testApex(t, `
2395 apex {
2396 name: "myapex",
2397 key: "myapex.key",
2398 native_shared_libs: ["libfoo"],
2399 min_sdk_version: "20",
2400 }
2401
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407
2408 cc_library {
2409 name: "libfoo",
2410 srcs: ["mylib.cpp"],
2411 apex_available: ["myapex"],
2412 min_sdk_version: "21",
2413 stl: "none",
2414 }
2415 `)
2416}
2417
Artur Satayev8cf899a2020-04-15 17:29:42 +01002418func TestJavaStableSdkVersion(t *testing.T) {
2419 testCases := []struct {
2420 name string
2421 expectedError string
2422 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002423 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002424 }{
2425 {
2426 name: "Non-updatable apex with non-stable dep",
2427 bp: `
2428 apex {
2429 name: "myapex",
2430 java_libs: ["myjar"],
2431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002432 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002433 }
2434 apex_key {
2435 name: "myapex.key",
2436 public_key: "testkey.avbpubkey",
2437 private_key: "testkey.pem",
2438 }
2439 java_library {
2440 name: "myjar",
2441 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002442 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002443 apex_available: ["myapex"],
2444 }
2445 `,
2446 },
2447 {
2448 name: "Updatable apex with stable dep",
2449 bp: `
2450 apex {
2451 name: "myapex",
2452 java_libs: ["myjar"],
2453 key: "myapex.key",
2454 updatable: true,
2455 min_sdk_version: "29",
2456 }
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462 java_library {
2463 name: "myjar",
2464 srcs: ["foo/bar/MyClass.java"],
2465 sdk_version: "current",
2466 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002467 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002468 }
2469 `,
2470 },
2471 {
2472 name: "Updatable apex with non-stable dep",
2473 expectedError: "cannot depend on \"myjar\"",
2474 bp: `
2475 apex {
2476 name: "myapex",
2477 java_libs: ["myjar"],
2478 key: "myapex.key",
2479 updatable: true,
2480 }
2481 apex_key {
2482 name: "myapex.key",
2483 public_key: "testkey.avbpubkey",
2484 private_key: "testkey.pem",
2485 }
2486 java_library {
2487 name: "myjar",
2488 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002489 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002490 apex_available: ["myapex"],
2491 }
2492 `,
2493 },
2494 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002495 name: "Updatable apex with non-stable legacy core platform dep",
2496 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2497 bp: `
2498 apex {
2499 name: "myapex",
2500 java_libs: ["myjar-uses-legacy"],
2501 key: "myapex.key",
2502 updatable: true,
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 java_library {
2510 name: "myjar-uses-legacy",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "core_platform",
2513 apex_available: ["myapex"],
2514 }
2515 `,
2516 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2517 },
2518 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002519 name: "Updatable apex with non-stable transitive dep",
2520 // This is not actually detecting that the transitive dependency is unstable, rather it is
2521 // detecting that the transitive dependency is building against a wider API surface than the
2522 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002523 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002524 bp: `
2525 apex {
2526 name: "myapex",
2527 java_libs: ["myjar"],
2528 key: "myapex.key",
2529 updatable: true,
2530 }
2531 apex_key {
2532 name: "myapex.key",
2533 public_key: "testkey.avbpubkey",
2534 private_key: "testkey.pem",
2535 }
2536 java_library {
2537 name: "myjar",
2538 srcs: ["foo/bar/MyClass.java"],
2539 sdk_version: "current",
2540 apex_available: ["myapex"],
2541 static_libs: ["transitive-jar"],
2542 }
2543 java_library {
2544 name: "transitive-jar",
2545 srcs: ["foo/bar/MyClass.java"],
2546 sdk_version: "core_platform",
2547 apex_available: ["myapex"],
2548 }
2549 `,
2550 },
2551 }
2552
2553 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002554 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2555 continue
2556 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002557 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002558 errorHandler := android.FixtureExpectsNoErrors
2559 if test.expectedError != "" {
2560 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002561 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 android.GroupFixturePreparers(
2563 java.PrepareForTestWithJavaDefaultModules,
2564 PrepareForTestWithApexBuildComponents,
2565 prepareForTestWithMyapex,
2566 android.OptionalFixturePreparer(test.preparer),
2567 ).
2568 ExtendWithErrorHandler(errorHandler).
2569 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002570 })
2571 }
2572}
2573
Jooyung Han749dc692020-04-15 11:03:39 +09002574func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2575 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 native_shared_libs: ["mylib"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 cc_library {
2590 name: "mylib",
2591 srcs: ["mylib.cpp"],
2592 shared_libs: ["mylib2"],
2593 system_shared_libs: [],
2594 stl: "none",
2595 apex_available: [
2596 "myapex",
2597 ],
2598 min_sdk_version: "29",
2599 }
2600
2601 // indirect part of the apex
2602 cc_library {
2603 name: "mylib2",
2604 srcs: ["mylib.cpp"],
2605 system_shared_libs: [],
2606 stl: "none",
2607 apex_available: [
2608 "myapex",
2609 ],
2610 min_sdk_version: "30",
2611 }
2612 `)
2613}
2614
2615func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2616 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2617 apex {
2618 name: "myapex",
2619 key: "myapex.key",
2620 apps: ["AppFoo"],
2621 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002622 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002623 }
2624
2625 apex_key {
2626 name: "myapex.key",
2627 public_key: "testkey.avbpubkey",
2628 private_key: "testkey.pem",
2629 }
2630
2631 android_app {
2632 name: "AppFoo",
2633 srcs: ["foo/bar/MyClass.java"],
2634 sdk_version: "current",
2635 min_sdk_version: "29",
2636 system_modules: "none",
2637 stl: "none",
2638 static_libs: ["bar"],
2639 apex_available: [ "myapex" ],
2640 }
2641
2642 java_library {
2643 name: "bar",
2644 sdk_version: "current",
2645 srcs: ["a.java"],
2646 apex_available: [ "myapex" ],
2647 }
2648 `)
2649}
2650
2651func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002652 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002653 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
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002666 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002667 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2668 cc_library {
2669 name: "mylib",
2670 srcs: ["mylib.cpp"],
2671 shared_libs: ["mylib2"],
2672 system_shared_libs: [],
2673 stl: "none",
2674 apex_available: ["myapex", "otherapex"],
2675 min_sdk_version: "29",
2676 }
2677
2678 cc_library {
2679 name: "mylib2",
2680 srcs: ["mylib.cpp"],
2681 system_shared_libs: [],
2682 stl: "none",
2683 apex_available: ["otherapex"],
2684 stubs: { versions: ["29", "30"] },
2685 min_sdk_version: "30",
2686 }
2687
2688 apex {
2689 name: "otherapex",
2690 key: "myapex.key",
2691 native_shared_libs: ["mylib", "mylib2"],
2692 min_sdk_version: "30",
2693 }
2694 `)
2695 expectLink := func(from, from_variant, to, to_variant string) {
2696 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2697 libFlags := ld.Args["libFlags"]
2698 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2699 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002700 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002701 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002702}
2703
Jooyung Haned124c32021-01-26 11:43:46 +09002704func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002705 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2706 func(variables android.FixtureProductVariables) {
2707 variables.Platform_sdk_codename = proptools.StringPtr("S")
2708 variables.Platform_version_active_codenames = []string{"S"}
2709 },
2710 )
Jooyung Haned124c32021-01-26 11:43:46 +09002711 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2712 apex {
2713 name: "myapex",
2714 key: "myapex.key",
2715 native_shared_libs: ["libfoo"],
2716 min_sdk_version: "S",
2717 }
2718 apex_key {
2719 name: "myapex.key",
2720 public_key: "testkey.avbpubkey",
2721 private_key: "testkey.pem",
2722 }
2723 cc_library {
2724 name: "libfoo",
2725 shared_libs: ["libbar"],
2726 apex_available: ["myapex"],
2727 min_sdk_version: "29",
2728 }
2729 cc_library {
2730 name: "libbar",
2731 apex_available: ["myapex"],
2732 }
2733 `, withSAsActiveCodeNames)
2734}
2735
2736func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002737 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2738 variables.Platform_sdk_codename = proptools.StringPtr("S")
2739 variables.Platform_version_active_codenames = []string{"S", "T"}
2740 })
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
2745 native_shared_libs: ["libfoo"],
2746 min_sdk_version: "S",
2747 }
2748 apex_key {
2749 name: "myapex.key",
2750 public_key: "testkey.avbpubkey",
2751 private_key: "testkey.pem",
2752 }
2753 cc_library {
2754 name: "libfoo",
2755 shared_libs: ["libbar"],
2756 apex_available: ["myapex"],
2757 min_sdk_version: "S",
2758 }
2759 cc_library {
2760 name: "libbar",
2761 stubs: {
2762 symbol_file: "libbar.map.txt",
2763 versions: ["30", "S", "T"],
2764 },
2765 }
2766 `, withSAsActiveCodeNames)
2767
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002768 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002769 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2770 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002771 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002772}
2773
Jiyong Park7c2ee712018-12-07 00:42:25 +09002774func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002775 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002776 apex {
2777 name: "myapex",
2778 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002779 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002780 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002781 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002782 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002783 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002784 }
2785
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791
2792 prebuilt_etc {
2793 name: "myetc",
2794 src: "myprebuilt",
2795 sub_dir: "foo/bar",
2796 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002797
2798 cc_library {
2799 name: "mylib",
2800 srcs: ["mylib.cpp"],
2801 relative_install_path: "foo/bar",
2802 system_shared_libs: [],
2803 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002804 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002805 }
2806
2807 cc_binary {
2808 name: "mybin",
2809 srcs: ["mylib.cpp"],
2810 relative_install_path: "foo/bar",
2811 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002813 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002814 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002815
2816 rust_binary {
2817 name: "mybin.rust",
2818 srcs: ["foo.rs"],
2819 relative_install_path: "rust_subdir",
2820 apex_available: [ "myapex" ],
2821 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002822 `)
2823
Jooyung Hana0503a52023-08-23 13:12:50 +09002824 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002825 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002826
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002827 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002828 ensureContains(t, cmd, "/etc ")
2829 ensureContains(t, cmd, "/etc/foo ")
2830 ensureContains(t, cmd, "/etc/foo/bar ")
2831 ensureContains(t, cmd, "/lib64 ")
2832 ensureContains(t, cmd, "/lib64/foo ")
2833 ensureContains(t, cmd, "/lib64/foo/bar ")
2834 ensureContains(t, cmd, "/lib ")
2835 ensureContains(t, cmd, "/lib/foo ")
2836 ensureContains(t, cmd, "/lib/foo/bar ")
2837 ensureContains(t, cmd, "/bin ")
2838 ensureContains(t, cmd, "/bin/foo ")
2839 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002840 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002841}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002842
Jooyung Han35155c42020-02-06 17:33:20 +09002843func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002844 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 multilib: {
2849 both: {
2850 native_shared_libs: ["mylib"],
2851 binaries: ["mybin"],
2852 },
2853 },
2854 compile_multilib: "both",
2855 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002856 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002857 }
2858
2859 apex_key {
2860 name: "myapex.key",
2861 public_key: "testkey.avbpubkey",
2862 private_key: "testkey.pem",
2863 }
2864
2865 cc_library {
2866 name: "mylib",
2867 relative_install_path: "foo/bar",
2868 system_shared_libs: [],
2869 stl: "none",
2870 apex_available: [ "myapex" ],
2871 native_bridge_supported: true,
2872 }
2873
2874 cc_binary {
2875 name: "mybin",
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002878 stl: "none",
2879 apex_available: [ "myapex" ],
2880 native_bridge_supported: true,
2881 compile_multilib: "both", // default is "first" for binary
2882 multilib: {
2883 lib64: {
2884 suffix: "64",
2885 },
2886 },
2887 }
2888 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002889 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002890 "bin/foo/bar/mybin",
2891 "bin/foo/bar/mybin64",
2892 "bin/arm/foo/bar/mybin",
2893 "bin/arm64/foo/bar/mybin64",
2894 "lib/foo/bar/mylib.so",
2895 "lib/arm/foo/bar/mylib.so",
2896 "lib64/foo/bar/mylib.so",
2897 "lib64/arm64/foo/bar/mylib.so",
2898 })
2899}
2900
Jooyung Han85d61762020-06-24 23:50:26 +09002901func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002902 result := android.GroupFixturePreparers(
2903 prepareForApexTest,
2904 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2905 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 binaries: ["mybin"],
2910 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002911 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002912 }
2913 apex_key {
2914 name: "myapex.key",
2915 public_key: "testkey.avbpubkey",
2916 private_key: "testkey.pem",
2917 }
2918 cc_binary {
2919 name: "mybin",
2920 vendor: true,
2921 shared_libs: ["libfoo"],
2922 }
2923 cc_library {
2924 name: "libfoo",
2925 proprietary: true,
2926 }
2927 `)
2928
Jooyung Hana0503a52023-08-23 13:12:50 +09002929 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002930 "bin/mybin",
2931 "lib64/libfoo.so",
2932 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2933 "lib64/libc++.so",
2934 })
2935
Jooyung Hana0503a52023-08-23 13:12:50 +09002936 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002937 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002938 name := apexBundle.BaseModuleName()
2939 prefix := "TARGET_"
2940 var builder strings.Builder
2941 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002942 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002943 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002944 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002945
Jooyung Hana0503a52023-08-23 13:12:50 +09002946 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002947 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2948 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002949}
2950
Jooyung Hanc5a96762022-02-04 11:54:50 +09002951func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2952 testApexError(t, `Trying to include a VNDK library`, `
2953 apex {
2954 name: "myapex",
2955 key: "myapex.key",
2956 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2957 vendor: true,
2958 use_vndk_as_stable: true,
2959 updatable: false,
2960 }
2961 apex_key {
2962 name: "myapex.key",
2963 public_key: "testkey.avbpubkey",
2964 private_key: "testkey.pem",
2965 }`)
2966}
2967
Jooyung Handf78e212020-07-22 15:54:47 +09002968func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002969 // myapex myapex2
2970 // | |
2971 // mybin ------. mybin2
2972 // \ \ / |
2973 // (stable) .---\--------` |
2974 // \ / \ |
2975 // \ / \ /
2976 // libvndk libvendor
2977 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002978 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002979 apex {
2980 name: "myapex",
2981 key: "myapex.key",
2982 binaries: ["mybin"],
2983 vendor: true,
2984 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002985 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002986 }
2987 apex_key {
2988 name: "myapex.key",
2989 public_key: "testkey.avbpubkey",
2990 private_key: "testkey.pem",
2991 }
2992 cc_binary {
2993 name: "mybin",
2994 vendor: true,
2995 shared_libs: ["libvndk", "libvendor"],
2996 }
2997 cc_library {
2998 name: "libvndk",
2999 vndk: {
3000 enabled: true,
3001 },
3002 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003003 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003004 }
3005 cc_library {
3006 name: "libvendor",
3007 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003008 stl: "none",
3009 }
3010 apex {
3011 name: "myapex2",
3012 key: "myapex.key",
3013 binaries: ["mybin2"],
3014 vendor: true,
3015 use_vndk_as_stable: false,
3016 updatable: false,
3017 }
3018 cc_binary {
3019 name: "mybin2",
3020 vendor: true,
3021 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003022 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003023 `,
3024 android.FixtureModifyConfig(func(config android.Config) {
3025 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3026 }),
3027 )
Jooyung Handf78e212020-07-22 15:54:47 +09003028
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003029 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003030
Jooyung Han91f92032022-02-04 12:36:33 +09003031 for _, tc := range []struct {
3032 name string
3033 apexName string
3034 moduleName string
3035 moduleVariant string
3036 libs []string
3037 contents []string
3038 requireVndkNamespace bool
3039 }{
3040 {
3041 name: "use_vndk_as_stable",
3042 apexName: "myapex",
3043 moduleName: "mybin",
3044 moduleVariant: vendorVariant + "_apex10000",
3045 libs: []string{
3046 // should link with vendor variants of VNDK libs(libvndk/libc++)
3047 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3048 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3049 // unstable Vendor libs as APEX variant
3050 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3051 },
3052 contents: []string{
3053 "bin/mybin",
3054 "lib64/libvendor.so",
3055 // VNDK libs (libvndk/libc++) are not included
3056 },
3057 requireVndkNamespace: true,
3058 },
3059 {
3060 name: "!use_vndk_as_stable",
3061 apexName: "myapex2",
3062 moduleName: "mybin2",
3063 moduleVariant: vendorVariant + "_myapex2",
3064 libs: []string{
3065 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3066 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3067 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3068 // unstable vendor libs have "merged" APEX variants
3069 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3070 },
3071 contents: []string{
3072 "bin/mybin2",
3073 "lib64/libvendor.so",
3074 // VNDK libs are included as well
3075 "lib64/libvndk.so",
3076 "lib64/libc++.so",
3077 },
3078 requireVndkNamespace: false,
3079 },
3080 } {
3081 t.Run(tc.name, func(t *testing.T) {
3082 // Check linked libs
3083 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3084 libs := names(ldRule.Args["libFlags"])
3085 for _, lib := range tc.libs {
3086 ensureListContains(t, libs, lib)
3087 }
3088 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003089 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003090
Jooyung Han91f92032022-02-04 12:36:33 +09003091 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003092 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003093 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3094 if tc.requireVndkNamespace {
3095 ensureListContains(t, requireNativeLibs, ":vndk")
3096 } else {
3097 ensureListNotContains(t, requireNativeLibs, ":vndk")
3098 }
3099 })
3100 }
Jooyung Handf78e212020-07-22 15:54:47 +09003101}
3102
Justin Yun13decfb2021-03-08 19:25:55 +09003103func TestProductVariant(t *testing.T) {
3104 ctx := testApex(t, `
3105 apex {
3106 name: "myapex",
3107 key: "myapex.key",
3108 updatable: false,
3109 product_specific: true,
3110 binaries: ["foo"],
3111 }
3112
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }
3118
3119 cc_binary {
3120 name: "foo",
3121 product_available: true,
3122 apex_available: ["myapex"],
3123 srcs: ["foo.cpp"],
3124 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003125 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003126
3127 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003128 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003129 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3130 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3131 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3132 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3133}
3134
Jooyung Han8e5685d2020-09-21 11:02:57 +09003135func TestApex_withPrebuiltFirmware(t *testing.T) {
3136 testCases := []struct {
3137 name string
3138 additionalProp string
3139 }{
3140 {"system apex with prebuilt_firmware", ""},
3141 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3142 }
3143 for _, tc := range testCases {
3144 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003145 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003146 apex {
3147 name: "myapex",
3148 key: "myapex.key",
3149 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003151 `+tc.additionalProp+`
3152 }
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158 prebuilt_firmware {
3159 name: "myfirmware",
3160 src: "myfirmware.bin",
3161 filename_from_src: true,
3162 `+tc.additionalProp+`
3163 }
3164 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003165 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003166 "etc/firmware/myfirmware.bin",
3167 })
3168 })
3169 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003170}
3171
Jooyung Hanefb184e2020-06-25 17:14:25 +09003172func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003173 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003174 apex {
3175 name: "myapex",
3176 key: "myapex.key",
3177 vendor: true,
3178 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003179 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003180 }
3181
3182 apex_key {
3183 name: "myapex.key",
3184 public_key: "testkey.avbpubkey",
3185 private_key: "testkey.pem",
3186 }
3187
3188 cc_library {
3189 name: "mylib",
3190 vendor_available: true,
3191 }
3192 `)
3193
Jooyung Hana0503a52023-08-23 13:12:50 +09003194 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003195 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003196 name := apexBundle.BaseModuleName()
3197 prefix := "TARGET_"
3198 var builder strings.Builder
3199 data.Custom(&builder, name, prefix, "", data)
3200 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003201 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 +09003202}
3203
Jooyung Han2ed99d02020-06-24 23:26:26 +09003204func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003205 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003206 apex {
3207 name: "myapex",
3208 key: "myapex.key",
3209 vintf_fragments: ["fragment.xml"],
3210 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003211 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003212 }
3213 apex_key {
3214 name: "myapex.key",
3215 public_key: "testkey.avbpubkey",
3216 private_key: "testkey.pem",
3217 }
3218 cc_binary {
3219 name: "mybin",
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003224 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003225 name := apexBundle.BaseModuleName()
3226 prefix := "TARGET_"
3227 var builder strings.Builder
3228 data.Custom(&builder, name, prefix, "", data)
3229 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003230 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003231 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003232}
3233
Jiyong Park16e91a02018-12-20 18:18:08 +09003234func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003235 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003236 apex {
3237 name: "myapex",
3238 key: "myapex.key",
3239 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003241 }
3242
3243 apex_key {
3244 name: "myapex.key",
3245 public_key: "testkey.avbpubkey",
3246 private_key: "testkey.pem",
3247 }
3248
3249 cc_library {
3250 name: "mylib",
3251 srcs: ["mylib.cpp"],
3252 system_shared_libs: [],
3253 stl: "none",
3254 stubs: {
3255 versions: ["1", "2", "3"],
3256 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003257 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003258 }
3259
3260 cc_binary {
3261 name: "not_in_apex",
3262 srcs: ["mylib.cpp"],
3263 static_libs: ["mylib"],
3264 static_executable: true,
3265 system_shared_libs: [],
3266 stl: "none",
3267 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003268 `)
3269
Colin Cross7113d202019-11-20 16:39:12 -08003270 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003271
3272 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003273 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003274}
Jiyong Park9335a262018-12-24 11:31:58 +09003275
3276func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003277 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003278 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003279 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003280 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003281 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003282 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003283 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003284 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003285 }
3286
3287 cc_library {
3288 name: "mylib",
3289 srcs: ["mylib.cpp"],
3290 system_shared_libs: [],
3291 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003292 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003293 }
3294
3295 apex_key {
3296 name: "myapex.key",
3297 public_key: "testkey.avbpubkey",
3298 private_key: "testkey.pem",
3299 }
3300
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003301 android_app_certificate {
3302 name: "myapex.certificate",
3303 certificate: "testkey",
3304 }
3305
3306 android_app_certificate {
3307 name: "myapex.certificate.override",
3308 certificate: "testkey.override",
3309 }
3310
Jiyong Park9335a262018-12-24 11:31:58 +09003311 `)
3312
3313 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003314 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003315
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003316 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3317 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003318 "vendor/foo/devkeys/testkey.avbpubkey")
3319 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003320 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3321 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003322 "vendor/foo/devkeys/testkey.pem")
3323 }
3324
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003325 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003326 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003327 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003328 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003329 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003330 }
3331}
Jiyong Park58e364a2019-01-19 19:24:06 +09003332
Jooyung Hanf121a652019-12-17 14:30:11 +09003333func TestCertificate(t *testing.T) {
3334 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003335 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003336 apex {
3337 name: "myapex",
3338 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 }
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003346 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3348 if actual := rule.Args["certificates"]; actual != expected {
3349 t.Errorf("certificates should be %q, not %q", expected, actual)
3350 }
3351 })
3352 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003353 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003354 apex {
3355 name: "myapex_keytest",
3356 key: "myapex.key",
3357 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003358 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 }
3360 apex_key {
3361 name: "myapex.key",
3362 public_key: "testkey.avbpubkey",
3363 private_key: "testkey.pem",
3364 }
3365 android_app_certificate {
3366 name: "myapex.certificate.override",
3367 certificate: "testkey.override",
3368 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 expected := "testkey.override.x509.pem testkey.override.pk8"
3371 if actual := rule.Args["certificates"]; actual != expected {
3372 t.Errorf("certificates should be %q, not %q", expected, actual)
3373 }
3374 })
3375 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003376 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003377 apex {
3378 name: "myapex",
3379 key: "myapex.key",
3380 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003381 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003382 }
3383 apex_key {
3384 name: "myapex.key",
3385 public_key: "testkey.avbpubkey",
3386 private_key: "testkey.pem",
3387 }
3388 android_app_certificate {
3389 name: "myapex.certificate",
3390 certificate: "testkey",
3391 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003392 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 expected := "testkey.x509.pem testkey.pk8"
3394 if actual := rule.Args["certificates"]; actual != expected {
3395 t.Errorf("certificates should be %q, not %q", expected, actual)
3396 }
3397 })
3398 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003399 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003400 apex {
3401 name: "myapex_keytest",
3402 key: "myapex.key",
3403 file_contexts: ":myapex-file_contexts",
3404 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003405 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003406 }
3407 apex_key {
3408 name: "myapex.key",
3409 public_key: "testkey.avbpubkey",
3410 private_key: "testkey.pem",
3411 }
3412 android_app_certificate {
3413 name: "myapex.certificate.override",
3414 certificate: "testkey.override",
3415 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003416 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 expected := "testkey.override.x509.pem testkey.override.pk8"
3418 if actual := rule.Args["certificates"]; actual != expected {
3419 t.Errorf("certificates should be %q, not %q", expected, actual)
3420 }
3421 })
3422 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003423 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003424 apex {
3425 name: "myapex",
3426 key: "myapex.key",
3427 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003428 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003429 }
3430 apex_key {
3431 name: "myapex.key",
3432 public_key: "testkey.avbpubkey",
3433 private_key: "testkey.pem",
3434 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003435 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3437 if actual := rule.Args["certificates"]; actual != expected {
3438 t.Errorf("certificates should be %q, not %q", expected, actual)
3439 }
3440 })
3441 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003442 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003443 apex {
3444 name: "myapex_keytest",
3445 key: "myapex.key",
3446 file_contexts: ":myapex-file_contexts",
3447 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003448 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003449 }
3450 apex_key {
3451 name: "myapex.key",
3452 public_key: "testkey.avbpubkey",
3453 private_key: "testkey.pem",
3454 }
3455 android_app_certificate {
3456 name: "myapex.certificate.override",
3457 certificate: "testkey.override",
3458 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003459 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003460 expected := "testkey.override.x509.pem testkey.override.pk8"
3461 if actual := rule.Args["certificates"]; actual != expected {
3462 t.Errorf("certificates should be %q, not %q", expected, actual)
3463 }
3464 })
3465}
3466
Jiyong Park58e364a2019-01-19 19:24:06 +09003467func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003468 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003469 apex {
3470 name: "myapex",
3471 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003472 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003473 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003474 }
3475
3476 apex {
3477 name: "otherapex",
3478 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003479 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003480 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003481 }
3482
3483 apex_key {
3484 name: "myapex.key",
3485 public_key: "testkey.avbpubkey",
3486 private_key: "testkey.pem",
3487 }
3488
3489 cc_library {
3490 name: "mylib",
3491 srcs: ["mylib.cpp"],
3492 system_shared_libs: [],
3493 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003494 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003495 "myapex",
3496 "otherapex",
3497 ],
Jooyung Han24282772020-03-21 23:20:55 +09003498 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003499 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003500 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501 cc_library {
3502 name: "mylib2",
3503 srcs: ["mylib.cpp"],
3504 system_shared_libs: [],
3505 stl: "none",
3506 apex_available: [
3507 "myapex",
3508 "otherapex",
3509 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003510 static_libs: ["mylib3"],
3511 recovery_available: true,
3512 min_sdk_version: "29",
3513 }
3514 cc_library {
3515 name: "mylib3",
3516 srcs: ["mylib.cpp"],
3517 system_shared_libs: [],
3518 stl: "none",
3519 apex_available: [
3520 "myapex",
3521 "otherapex",
3522 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003523 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003524 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003525 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003526 `)
3527
Jooyung Hanc87a0592020-03-02 17:44:33 +09003528 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003529 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003530 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003531
Vinh Tranf9754732023-01-19 22:41:46 -05003532 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003533 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003534 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003535
Vinh Tranf9754732023-01-19 22:41:46 -05003536 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003537 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003539
Colin Crossaede88c2020-08-11 12:17:01 -07003540 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3541 // each variant defines additional macros to distinguish which apex variant it is built for
3542
3543 // non-APEX variant does not have __ANDROID_APEX__ defined
3544 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3545 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3546
Vinh Tranf9754732023-01-19 22:41:46 -05003547 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003548 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3549 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003550
Jooyung Hanc87a0592020-03-02 17:44:33 +09003551 // non-APEX variant does not have __ANDROID_APEX__ defined
3552 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3553 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3554
Vinh Tranf9754732023-01-19 22:41:46 -05003555 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003556 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003558}
Jiyong Park7e636d02019-01-28 16:16:54 +09003559
3560func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003561 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003562 apex {
3563 name: "myapex",
3564 key: "myapex.key",
3565 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003566 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003567 }
3568
3569 apex_key {
3570 name: "myapex.key",
3571 public_key: "testkey.avbpubkey",
3572 private_key: "testkey.pem",
3573 }
3574
3575 cc_library_headers {
3576 name: "mylib_headers",
3577 export_include_dirs: ["my_include"],
3578 system_shared_libs: [],
3579 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003580 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003581 }
3582
3583 cc_library {
3584 name: "mylib",
3585 srcs: ["mylib.cpp"],
3586 system_shared_libs: [],
3587 stl: "none",
3588 header_libs: ["mylib_headers"],
3589 export_header_lib_headers: ["mylib_headers"],
3590 stubs: {
3591 versions: ["1", "2", "3"],
3592 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003593 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003594 }
3595
3596 cc_library {
3597 name: "otherlib",
3598 srcs: ["mylib.cpp"],
3599 system_shared_libs: [],
3600 stl: "none",
3601 shared_libs: ["mylib"],
3602 }
3603 `)
3604
Colin Cross7113d202019-11-20 16:39:12 -08003605 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003606
3607 // Ensure that the include path of the header lib is exported to 'otherlib'
3608 ensureContains(t, cFlags, "-Imy_include")
3609}
Alex Light9670d332019-01-29 18:07:33 -08003610
Jiyong Park7cd10e32020-01-14 09:22:18 +09003611type fileInApex struct {
3612 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003613 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 isLink bool
3615}
3616
Jooyung Han1724d582022-12-21 10:17:44 +09003617func (f fileInApex) String() string {
3618 return f.src + ":" + f.path
3619}
3620
3621func (f fileInApex) match(expectation string) bool {
3622 parts := strings.Split(expectation, ":")
3623 if len(parts) == 1 {
3624 match, _ := path.Match(parts[0], f.path)
3625 return match
3626 }
3627 if len(parts) == 2 {
3628 matchSrc, _ := path.Match(parts[0], f.src)
3629 matchDst, _ := path.Match(parts[1], f.path)
3630 return matchSrc && matchDst
3631 }
3632 panic("invalid expected file specification: " + expectation)
3633}
3634
Jooyung Hana57af4a2020-01-23 05:36:59 +00003635func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003637 module := ctx.ModuleForTests(moduleName, variant)
3638 apexRule := module.MaybeRule("apexRule")
3639 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003641 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 for _, cmd := range strings.Split(copyCmds, "&&") {
3643 cmd = strings.TrimSpace(cmd)
3644 if cmd == "" {
3645 continue
3646 }
3647 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003648 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003649 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 switch terms[0] {
3651 case "mkdir":
3652 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 t.Fatal("copyCmds contains invalid cp command", cmd)
3655 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003657 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003658 isLink = false
3659 case "ln":
3660 if len(terms) != 3 && len(terms) != 4 {
3661 // ln LINK TARGET or ln -s LINK TARGET
3662 t.Fatal("copyCmds contains invalid ln command", cmd)
3663 }
3664 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003665 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003666 isLink = true
3667 default:
3668 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3669 }
3670 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003671 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003673 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 }
Jooyung Han1724d582022-12-21 10:17:44 +09003675 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003676 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003677 }
3678 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003679 return ret
3680}
3681
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003682func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003683 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003684 var failed bool
3685 var surplus []string
3686 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003687 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003688 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003690 if file.match(expected) {
3691 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003692 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003693 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003694 }
3695 }
Jooyung Han1724d582022-12-21 10:17:44 +09003696 if !matchFound {
3697 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003698 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003700
Jooyung Han31c470b2019-10-18 16:26:59 +09003701 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003702 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003703 t.Log("surplus files", surplus)
3704 failed = true
3705 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003707 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003708 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003709 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003710 if !filesMatched[expected] {
3711 missing = append(missing, expected)
3712 }
3713 }
3714 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 t.Log("missing files", missing)
3716 failed = true
3717 }
3718 if failed {
3719 t.Fail()
3720 }
3721}
3722
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003723func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3724 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3725}
3726
3727func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003728 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003729 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3730 if deapexer.Output != nil {
3731 outputs = append(outputs, deapexer.Output.String())
3732 }
3733 for _, output := range deapexer.ImplicitOutputs {
3734 outputs = append(outputs, output.String())
3735 }
3736 actualFiles := make([]fileInApex, 0, len(outputs))
3737 for _, output := range outputs {
3738 dir := "/deapexer/"
3739 pos := strings.LastIndex(output, dir)
3740 if pos == -1 {
3741 t.Fatal("Unknown deapexer output ", output)
3742 }
3743 path := output[pos+len(dir):]
3744 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3745 }
3746 assertFileListEquals(t, files, actualFiles)
3747}
3748
Jooyung Han344d5432019-08-23 11:17:39 +09003749func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003750 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003751 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003752 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003753 "etc/llndk.libraries.29.txt",
3754 "etc/vndkcore.libraries.29.txt",
3755 "etc/vndksp.libraries.29.txt",
3756 "etc/vndkprivate.libraries.29.txt",
3757 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003758 }
3759 testCases := []struct {
3760 vndkVersion string
3761 expectedFiles []string
3762 }{
3763 {
3764 vndkVersion: "current",
3765 expectedFiles: append(commonFiles,
3766 "lib/libvndk.so",
3767 "lib/libvndksp.so",
3768 "lib64/libvndk.so",
3769 "lib64/libvndksp.so"),
3770 },
3771 {
3772 vndkVersion: "",
3773 expectedFiles: append(commonFiles,
3774 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3775 "lib/libvndksp.so",
3776 "lib64/libvndksp.so"),
3777 },
3778 }
3779 for _, tc := range testCases {
3780 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3781 ctx := testApex(t, `
3782 apex_vndk {
3783 name: "com.android.vndk.current",
3784 key: "com.android.vndk.current.key",
3785 updatable: false,
3786 }
3787
3788 apex_key {
3789 name: "com.android.vndk.current.key",
3790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
3793
3794 cc_library {
3795 name: "libvndk",
3796 srcs: ["mylib.cpp"],
3797 vendor_available: true,
3798 product_available: true,
3799 vndk: {
3800 enabled: true,
3801 },
3802 system_shared_libs: [],
3803 stl: "none",
3804 apex_available: [ "com.android.vndk.current" ],
3805 }
3806
3807 cc_library {
3808 name: "libvndksp",
3809 srcs: ["mylib.cpp"],
3810 vendor_available: true,
3811 product_available: true,
3812 vndk: {
3813 enabled: true,
3814 support_system_process: true,
3815 },
3816 system_shared_libs: [],
3817 stl: "none",
3818 apex_available: [ "com.android.vndk.current" ],
3819 }
3820
3821 // VNDK-Ext should not cause any problems
3822
3823 cc_library {
3824 name: "libvndk.ext",
3825 srcs: ["mylib2.cpp"],
3826 vendor: true,
3827 vndk: {
3828 enabled: true,
3829 extends: "libvndk",
3830 },
3831 system_shared_libs: [],
3832 stl: "none",
3833 }
3834
3835 cc_library {
3836 name: "libvndksp.ext",
3837 srcs: ["mylib2.cpp"],
3838 vendor: true,
3839 vndk: {
3840 enabled: true,
3841 support_system_process: true,
3842 extends: "libvndksp",
3843 },
3844 system_shared_libs: [],
3845 stl: "none",
3846 }
3847 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3848 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003849 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003850 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003851 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003852 })
3853 }
Jooyung Han344d5432019-08-23 11:17:39 +09003854}
3855
3856func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003857 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003858 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003859 name: "com.android.vndk.current",
3860 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003861 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003862 }
3863
3864 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003865 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003866 public_key: "testkey.avbpubkey",
3867 private_key: "testkey.pem",
3868 }
3869
3870 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003871 name: "libvndk",
3872 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003873 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003874 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003875 vndk: {
3876 enabled: true,
3877 },
3878 system_shared_libs: [],
3879 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003880 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003881 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003882
3883 cc_prebuilt_library_shared {
3884 name: "libvndk.arm",
3885 srcs: ["libvndk.arm.so"],
3886 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003887 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003888 vndk: {
3889 enabled: true,
3890 },
3891 enabled: false,
3892 arch: {
3893 arm: {
3894 enabled: true,
3895 },
3896 },
3897 system_shared_libs: [],
3898 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003899 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003901 `+vndkLibrariesTxtFiles("current"),
3902 withFiles(map[string][]byte{
3903 "libvndk.so": nil,
3904 "libvndk.arm.so": nil,
3905 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003906 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 "lib/libvndk.so",
3908 "lib/libvndk.arm.so",
3909 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003910 "lib/libc++.so",
3911 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003912 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 })
Jooyung Han344d5432019-08-23 11:17:39 +09003914}
3915
Jooyung Han39edb6c2019-11-06 16:53:07 +09003916func vndkLibrariesTxtFiles(vers ...string) (result string) {
3917 for _, v := range vers {
3918 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003919 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003920 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003921 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003922 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003923 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 }
3925 `
3926 }
Justin Yund5784122023-10-25 13:25:32 +09003927 result += `
3928 llndk_libraries_txt {
3929 name: "llndk.libraries.txt",
3930 }
3931 llndk_libraries_txt_for_apex {
3932 name: "llndk.libraries.txt.apex",
3933 stem: "llndk.libraries.txt",
3934 insert_vndk_version: true,
3935 }
3936 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003937 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003938 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 result += `
3940 prebuilt_etc {
3941 name: "` + txt + `.libraries.` + v + `.txt",
3942 src: "dummy.txt",
3943 }
3944 `
3945 }
3946 }
3947 }
3948 return
3949}
3950
Jooyung Han344d5432019-08-23 11:17:39 +09003951func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003952 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003953 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003954 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003955 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003956 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003957 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
Jooyung Han31c470b2019-10-18 16:26:59 +09003967 vndk_prebuilt_shared {
3968 name: "libvndk27",
3969 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003971 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003972 vndk: {
3973 enabled: true,
3974 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 target_arch: "arm64",
3976 arch: {
3977 arm: {
3978 srcs: ["libvndk27_arm.so"],
3979 },
3980 arm64: {
3981 srcs: ["libvndk27_arm64.so"],
3982 },
3983 },
Colin Cross2807f002021-03-02 10:15:29 -08003984 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003985 }
3986
3987 vndk_prebuilt_shared {
3988 name: "libvndk27",
3989 version: "27",
3990 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003991 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003992 vndk: {
3993 enabled: true,
3994 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003995 target_arch: "x86_64",
3996 arch: {
3997 x86: {
3998 srcs: ["libvndk27_x86.so"],
3999 },
4000 x86_64: {
4001 srcs: ["libvndk27_x86_64.so"],
4002 },
4003 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004004 }
4005 `+vndkLibrariesTxtFiles("27"),
4006 withFiles(map[string][]byte{
4007 "libvndk27_arm.so": nil,
4008 "libvndk27_arm64.so": nil,
4009 "libvndk27_x86.so": nil,
4010 "libvndk27_x86_64.so": nil,
4011 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004012
Jooyung Hana0503a52023-08-23 13:12:50 +09004013 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 "lib/libvndk27_arm.so",
4015 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004016 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 })
Jooyung Han344d5432019-08-23 11:17:39 +09004018}
4019
Jooyung Han90eee022019-10-01 20:02:42 +09004020func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004021 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004022 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004023 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004026 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004027 }
4028 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004029 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004030 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004032 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004033 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004034 }
4035 apex_key {
4036 name: "myapex.key",
4037 public_key: "testkey.avbpubkey",
4038 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004039 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004040
4041 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004042 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004043 apexManifestRule := module.Rule("apexManifestRule")
4044 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004045 }
4046
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004047 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004048 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004049}
4050
Jooyung Han344d5432019-08-23 11:17:39 +09004051func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004052 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004053 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004054 name: "com.android.vndk.current",
4055 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004056 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004057 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004058 }
4059
4060 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004061 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004062 public_key: "testkey.avbpubkey",
4063 private_key: "testkey.pem",
4064 }
4065
4066 cc_library {
4067 name: "libvndk",
4068 srcs: ["mylib.cpp"],
4069 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004070 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004071 native_bridge_supported: true,
4072 host_supported: true,
4073 vndk: {
4074 enabled: true,
4075 },
4076 system_shared_libs: [],
4077 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004078 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004079 }
Colin Cross2807f002021-03-02 10:15:29 -08004080 `+vndkLibrariesTxtFiles("current"),
4081 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004082
Jooyung Hana0503a52023-08-23 13:12:50 +09004083 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 "lib/libvndk.so",
4085 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004086 "lib/libc++.so",
4087 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004088 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 })
Jooyung Han344d5432019-08-23 11:17:39 +09004090}
4091
4092func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004093 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004094 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004095 name: "com.android.vndk.current",
4096 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004097 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004098 native_bridge_supported: true,
4099 }
4100
4101 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004102 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004103 public_key: "testkey.avbpubkey",
4104 private_key: "testkey.pem",
4105 }
4106
4107 cc_library {
4108 name: "libvndk",
4109 srcs: ["mylib.cpp"],
4110 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004111 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004112 native_bridge_supported: true,
4113 host_supported: true,
4114 vndk: {
4115 enabled: true,
4116 },
4117 system_shared_libs: [],
4118 stl: "none",
4119 }
4120 `)
4121}
4122
Jooyung Han31c470b2019-10-18 16:26:59 +09004123func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004124 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004126 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004127 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004128 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004130 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 }
4132
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138
4139 vndk_prebuilt_shared {
4140 name: "libvndk27",
4141 version: "27",
4142 target_arch: "arm",
4143 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004144 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 vndk: {
4146 enabled: true,
4147 },
4148 arch: {
4149 arm: {
4150 srcs: ["libvndk27.so"],
4151 }
4152 },
4153 }
4154
4155 vndk_prebuilt_shared {
4156 name: "libvndk27",
4157 version: "27",
4158 target_arch: "arm",
4159 binder32bit: true,
4160 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004161 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004162 vndk: {
4163 enabled: true,
4164 },
4165 arch: {
4166 arm: {
4167 srcs: ["libvndk27binder32.so"],
4168 }
4169 },
Colin Cross2807f002021-03-02 10:15:29 -08004170 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004171 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004172 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004173 withFiles(map[string][]byte{
4174 "libvndk27.so": nil,
4175 "libvndk27binder32.so": nil,
4176 }),
4177 withBinder32bit,
4178 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004179 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004180 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4181 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004182 },
4183 }),
4184 )
4185
Jooyung Hana0503a52023-08-23 13:12:50 +09004186 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004187 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004188 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004189 })
4190}
4191
Jooyung Han45a96772020-06-15 14:59:42 +09004192func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004193 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004194 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004195 name: "com.android.vndk.current",
4196 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004197 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004198 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004199 }
4200
4201 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004202 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004203 public_key: "testkey.avbpubkey",
4204 private_key: "testkey.pem",
4205 }
4206
4207 cc_library {
4208 name: "libz",
4209 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004210 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004211 vndk: {
4212 enabled: true,
4213 },
4214 stubs: {
4215 symbol_file: "libz.map.txt",
4216 versions: ["30"],
4217 }
4218 }
4219 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4220 "libz.map.txt": nil,
4221 }))
4222
Jooyung Hana0503a52023-08-23 13:12:50 +09004223 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004224 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4225 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004226 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004227 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4228 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4229 "*/*",
4230 })
Jooyung Han45a96772020-06-15 14:59:42 +09004231}
4232
Jooyung Hane3f02812023-05-08 13:54:50 +09004233func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4234 ctx := testApex(t, "",
4235 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4236 variables.DeviceVndkVersion = proptools.StringPtr("27")
4237 }),
4238 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4239 cc.RegisterVendorSnapshotModules(ctx)
4240 }),
4241 withFiles(map[string][]byte{
4242 "vendor/foo/Android.bp": []byte(`
4243 apex {
4244 name: "myapex",
4245 binaries: ["foo"],
4246 key: "myapex.key",
4247 min_sdk_version: "27",
4248 vendor: true,
4249 }
4250
4251 cc_binary {
4252 name: "foo",
4253 vendor: true,
4254 srcs: ["abc.cpp"],
4255 shared_libs: [
4256 "libllndk",
4257 "libvndk",
4258 ],
4259 nocrt: true,
4260 system_shared_libs: [],
4261 min_sdk_version: "27",
4262 }
4263
4264 apex_key {
4265 name: "myapex.key",
4266 public_key: "testkey.avbpubkey",
4267 private_key: "testkey.pem",
4268 }
4269 `),
4270 // Simulate VNDK prebuilts with vendor_snapshot
4271 "prebuilts/vndk/Android.bp": []byte(`
4272 vndk_prebuilt_shared {
4273 name: "libllndk",
4274 version: "27",
4275 vendor_available: true,
4276 product_available: true,
4277 target_arch: "arm64",
4278 arch: {
4279 arm64: {
4280 srcs: ["libllndk.so"],
4281 },
4282 },
4283 }
4284
4285 vndk_prebuilt_shared {
4286 name: "libvndk",
4287 version: "27",
4288 vendor_available: true,
4289 product_available: true,
4290 target_arch: "arm64",
4291 arch: {
4292 arm64: {
4293 srcs: ["libvndk.so"],
4294 },
4295 },
4296 vndk: {
4297 enabled: true,
4298 },
4299 min_sdk_version: "27",
4300 }
4301
4302 vndk_prebuilt_shared {
4303 name: "libc++",
4304 version: "27",
4305 target_arch: "arm64",
4306 vendor_available: true,
4307 product_available: true,
4308 vndk: {
4309 enabled: true,
4310 support_system_process: true,
4311 },
4312 arch: {
4313 arm64: {
4314 srcs: ["libc++.so"],
4315 },
4316 },
4317 min_sdk_version: "apex_inherit",
4318 }
4319
4320 vendor_snapshot {
4321 name: "vendor_snapshot",
4322 version: "27",
4323 arch: {
4324 arm64: {
4325 vndk_libs: [
4326 "libc++",
4327 "libllndk",
4328 "libvndk",
4329 ],
4330 static_libs: [
4331 "libc++demangle",
4332 "libclang_rt.builtins",
4333 "libunwind",
4334 ],
4335 },
4336 }
4337 }
4338
4339 vendor_snapshot_static {
4340 name: "libclang_rt.builtins",
4341 version: "27",
4342 target_arch: "arm64",
4343 vendor: true,
4344 arch: {
4345 arm64: {
4346 src: "libclang_rt.builtins-aarch64-android.a",
4347 },
4348 },
4349 }
4350
4351 vendor_snapshot_static {
4352 name: "libc++demangle",
4353 version: "27",
4354 target_arch: "arm64",
4355 compile_multilib: "64",
4356 vendor: true,
4357 arch: {
4358 arm64: {
4359 src: "libc++demangle.a",
4360 },
4361 },
4362 min_sdk_version: "apex_inherit",
4363 }
4364
4365 vendor_snapshot_static {
4366 name: "libunwind",
4367 version: "27",
4368 target_arch: "arm64",
4369 compile_multilib: "64",
4370 vendor: true,
4371 arch: {
4372 arm64: {
4373 src: "libunwind.a",
4374 },
4375 },
4376 min_sdk_version: "apex_inherit",
4377 }
4378 `),
4379 }))
4380
4381 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004382 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004383 "bin/foo",
4384 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4385 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4386 })
4387
4388 // Should link foo with prebuilt libraries (shared/static)
4389 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4390 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4391 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4392 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4393 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4394
4395 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004396 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004397 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4398 ensureListContains(t, requireNativeLibs, "libllndk.so")
4399}
4400
Jooyung Hane1633032019-08-01 17:41:43 +09004401func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004402 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004403 apex {
4404 name: "myapex_nodep",
4405 key: "myapex.key",
4406 native_shared_libs: ["lib_nodep"],
4407 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004408 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004410 }
4411
4412 apex {
4413 name: "myapex_dep",
4414 key: "myapex.key",
4415 native_shared_libs: ["lib_dep"],
4416 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004418 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 apex {
4422 name: "myapex_provider",
4423 key: "myapex.key",
4424 native_shared_libs: ["libfoo"],
4425 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004426 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004427 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004428 }
4429
4430 apex {
4431 name: "myapex_selfcontained",
4432 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004433 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004434 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004435 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004436 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 apex_key {
4440 name: "myapex.key",
4441 public_key: "testkey.avbpubkey",
4442 private_key: "testkey.pem",
4443 }
4444
4445 cc_library {
4446 name: "lib_nodep",
4447 srcs: ["mylib.cpp"],
4448 system_shared_libs: [],
4449 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004450 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004451 }
4452
4453 cc_library {
4454 name: "lib_dep",
4455 srcs: ["mylib.cpp"],
4456 shared_libs: ["libfoo"],
4457 system_shared_libs: [],
4458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004459 apex_available: [
4460 "myapex_dep",
4461 "myapex_provider",
4462 "myapex_selfcontained",
4463 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004464 }
4465
4466 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004467 name: "lib_dep_on_bar",
4468 srcs: ["mylib.cpp"],
4469 shared_libs: ["libbar"],
4470 system_shared_libs: [],
4471 stl: "none",
4472 apex_available: [
4473 "myapex_selfcontained",
4474 ],
4475 }
4476
4477
4478 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004479 name: "libfoo",
4480 srcs: ["mytest.cpp"],
4481 stubs: {
4482 versions: ["1"],
4483 },
4484 system_shared_libs: [],
4485 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004486 apex_available: [
4487 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004488 ],
4489 }
4490
4491 cc_library {
4492 name: "libbar",
4493 srcs: ["mytest.cpp"],
4494 stubs: {
4495 versions: ["1"],
4496 },
4497 system_shared_libs: [],
4498 stl: "none",
4499 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004500 "myapex_selfcontained",
4501 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004502 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004503
Jooyung Hane1633032019-08-01 17:41:43 +09004504 `)
4505
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004506 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004507 var provideNativeLibs, requireNativeLibs []string
4508
Jooyung Hana0503a52023-08-23 13:12:50 +09004509 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004510 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4511 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004512 ensureListEmpty(t, provideNativeLibs)
4513 ensureListEmpty(t, requireNativeLibs)
4514
Jooyung Hana0503a52023-08-23 13:12:50 +09004515 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004516 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4517 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004518 ensureListEmpty(t, provideNativeLibs)
4519 ensureListContains(t, requireNativeLibs, "libfoo.so")
4520
Jooyung Hana0503a52023-08-23 13:12:50 +09004521 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004522 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4523 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004524 ensureListContains(t, provideNativeLibs, "libfoo.so")
4525 ensureListEmpty(t, requireNativeLibs)
4526
Jooyung Hana0503a52023-08-23 13:12:50 +09004527 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004528 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4529 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004530 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004531 ensureListEmpty(t, requireNativeLibs)
4532}
4533
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004534func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4535 ctx := testApex(t, `
4536 apex {
4537 name: "myapex",
4538 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004539 native_shared_libs: ["mylib"],
4540 updatable: false,
4541 }
4542
4543 apex_key {
4544 name: "myapex.key",
4545 public_key: "testkey.avbpubkey",
4546 private_key: "testkey.pem",
4547 }
4548
4549 cc_library {
4550 name: "mylib",
4551 srcs: ["mylib.cpp"],
4552 system_shared_libs: [],
4553 stl: "none",
4554 apex_available: [
4555 "//apex_available:platform",
4556 "myapex",
4557 ],
4558 }
4559 `, android.FixtureMergeEnv(map[string]string{
4560 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4561 }))
4562
Jooyung Hana0503a52023-08-23 13:12:50 +09004563 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004564 apexManifestRule := module.Rule("apexManifestRule")
4565 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4566}
4567
Vinh Tran8f5310f2022-10-07 18:16:47 -04004568func TestCompileMultilibProp(t *testing.T) {
4569 testCases := []struct {
4570 compileMultiLibProp string
4571 containedLibs []string
4572 notContainedLibs []string
4573 }{
4574 {
4575 containedLibs: []string{
4576 "image.apex/lib64/mylib.so",
4577 "image.apex/lib/mylib.so",
4578 },
4579 compileMultiLibProp: `compile_multilib: "both",`,
4580 },
4581 {
4582 containedLibs: []string{"image.apex/lib64/mylib.so"},
4583 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4584 compileMultiLibProp: `compile_multilib: "first",`,
4585 },
4586 {
4587 containedLibs: []string{"image.apex/lib64/mylib.so"},
4588 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4589 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4590 },
4591 {
4592 containedLibs: []string{"image.apex/lib64/mylib.so"},
4593 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4594 compileMultiLibProp: `compile_multilib: "64",`,
4595 },
4596 {
4597 containedLibs: []string{"image.apex/lib/mylib.so"},
4598 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4599 compileMultiLibProp: `compile_multilib: "32",`,
4600 },
4601 }
4602 for _, testCase := range testCases {
4603 ctx := testApex(t, fmt.Sprintf(`
4604 apex {
4605 name: "myapex",
4606 key: "myapex.key",
4607 %s
4608 native_shared_libs: ["mylib"],
4609 updatable: false,
4610 }
4611 apex_key {
4612 name: "myapex.key",
4613 public_key: "testkey.avbpubkey",
4614 private_key: "testkey.pem",
4615 }
4616 cc_library {
4617 name: "mylib",
4618 srcs: ["mylib.cpp"],
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
4623 }
4624 `, testCase.compileMultiLibProp),
4625 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004626 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004627 apexRule := module.Rule("apexRule")
4628 copyCmds := apexRule.Args["copy_commands"]
4629 for _, containedLib := range testCase.containedLibs {
4630 ensureContains(t, copyCmds, containedLib)
4631 }
4632 for _, notContainedLib := range testCase.notContainedLibs {
4633 ensureNotContains(t, copyCmds, notContainedLib)
4634 }
4635 }
4636}
4637
Alex Light0851b882019-02-07 13:20:53 -08004638func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004639 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004640 apex {
4641 name: "myapex",
4642 key: "myapex.key",
4643 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004644 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004645 }
4646
4647 apex_key {
4648 name: "myapex.key",
4649 public_key: "testkey.avbpubkey",
4650 private_key: "testkey.pem",
4651 }
4652
4653 cc_library {
4654 name: "mylib_common",
4655 srcs: ["mylib.cpp"],
4656 system_shared_libs: [],
4657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004658 apex_available: [
4659 "//apex_available:platform",
4660 "myapex",
4661 ],
Alex Light0851b882019-02-07 13:20:53 -08004662 }
4663 `)
4664
Jooyung Hana0503a52023-08-23 13:12:50 +09004665 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004666 apexRule := module.Rule("apexRule")
4667 copyCmds := apexRule.Args["copy_commands"]
4668
4669 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4670 t.Log("Apex was a test apex!")
4671 t.Fail()
4672 }
4673 // Ensure that main rule creates an output
4674 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4675
4676 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004677 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004678
4679 // Ensure that both direct and indirect deps are copied into apex
4680 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4681
Colin Cross7113d202019-11-20 16:39:12 -08004682 // Ensure that the platform variant ends with _shared
4683 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004684
Colin Cross56a83212020-09-15 18:30:11 -07004685 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004686 t.Log("Found mylib_common not in any apex!")
4687 t.Fail()
4688 }
4689}
4690
4691func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004692 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004693 apex_test {
4694 name: "myapex",
4695 key: "myapex.key",
4696 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004697 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004698 }
4699
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705
4706 cc_library {
4707 name: "mylib_common_test",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
Alex Light0851b882019-02-07 13:20:53 -08004716 }
4717 `)
4718
Jooyung Hana0503a52023-08-23 13:12:50 +09004719 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004720 apexRule := module.Rule("apexRule")
4721 copyCmds := apexRule.Args["copy_commands"]
4722
4723 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4724 t.Log("Apex was not a test apex!")
4725 t.Fail()
4726 }
4727 // Ensure that main rule creates an output
4728 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4729
4730 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004731 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004732
4733 // Ensure that both direct and indirect deps are copied into apex
4734 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4735
Colin Cross7113d202019-11-20 16:39:12 -08004736 // Ensure that the platform variant ends with _shared
4737 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004738}
4739
Jooyung Han85707de2023-12-01 14:21:13 +09004740func TestLibzVendorIsntStable(t *testing.T) {
4741 ctx := testApex(t, `
4742 apex {
4743 name: "myapex",
4744 key: "myapex.key",
4745 updatable: false,
4746 binaries: ["mybin"],
4747 }
4748 apex {
4749 name: "myvendorapex",
4750 key: "myapex.key",
4751 file_contexts: "myvendorapex_file_contexts",
4752 vendor: true,
4753 updatable: false,
4754 binaries: ["mybin"],
4755 }
4756 apex_key {
4757 name: "myapex.key",
4758 public_key: "testkey.avbpubkey",
4759 private_key: "testkey.pem",
4760 }
4761 cc_binary {
4762 name: "mybin",
4763 vendor_available: true,
4764 system_shared_libs: [],
4765 stl: "none",
4766 shared_libs: ["libz"],
4767 apex_available: ["//apex_available:anyapex"],
4768 }
4769 cc_library {
4770 name: "libz",
4771 vendor_available: true,
4772 system_shared_libs: [],
4773 stl: "none",
4774 stubs: {
4775 versions: ["28", "30"],
4776 },
4777 target: {
4778 vendor: {
4779 no_stubs: true,
4780 },
4781 },
4782 }
4783 `, withFiles(map[string][]byte{
4784 "myvendorapex_file_contexts": nil,
4785 }))
4786
4787 // libz provides stubs for core variant.
4788 {
4789 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4790 "bin/mybin",
4791 })
4792 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4793 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4794 }
4795 // libz doesn't provide stubs for vendor variant.
4796 {
4797 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4798 "bin/mybin",
4799 "lib64/libz.so",
4800 })
4801 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4802 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4803 }
4804}
4805
Alex Light9670d332019-01-29 18:07:33 -08004806func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004807 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004808 apex {
4809 name: "myapex",
4810 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004811 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004812 multilib: {
4813 first: {
4814 native_shared_libs: ["mylib_common"],
4815 }
4816 },
4817 target: {
4818 android: {
4819 multilib: {
4820 first: {
4821 native_shared_libs: ["mylib"],
4822 }
4823 }
4824 },
4825 host: {
4826 multilib: {
4827 first: {
4828 native_shared_libs: ["mylib2"],
4829 }
4830 }
4831 }
4832 }
4833 }
4834
4835 apex_key {
4836 name: "myapex.key",
4837 public_key: "testkey.avbpubkey",
4838 private_key: "testkey.pem",
4839 }
4840
4841 cc_library {
4842 name: "mylib",
4843 srcs: ["mylib.cpp"],
4844 system_shared_libs: [],
4845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004846 // TODO: remove //apex_available:platform
4847 apex_available: [
4848 "//apex_available:platform",
4849 "myapex",
4850 ],
Alex Light9670d332019-01-29 18:07:33 -08004851 }
4852
4853 cc_library {
4854 name: "mylib_common",
4855 srcs: ["mylib.cpp"],
4856 system_shared_libs: [],
4857 stl: "none",
4858 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004859 // TODO: remove //apex_available:platform
4860 apex_available: [
4861 "//apex_available:platform",
4862 "myapex",
4863 ],
Alex Light9670d332019-01-29 18:07:33 -08004864 }
4865
4866 cc_library {
4867 name: "mylib2",
4868 srcs: ["mylib.cpp"],
4869 system_shared_libs: [],
4870 stl: "none",
4871 compile_multilib: "first",
4872 }
4873 `)
4874
Jooyung Hana0503a52023-08-23 13:12:50 +09004875 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004876 copyCmds := apexRule.Args["copy_commands"]
4877
4878 // Ensure that main rule creates an output
4879 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4880
4881 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004882 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4884 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004885
4886 // Ensure that both direct and indirect deps are copied into apex
4887 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4888 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4889 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4890
Colin Cross7113d202019-11-20 16:39:12 -08004891 // Ensure that the platform variant ends with _shared
4892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4893 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4894 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004895}
Jiyong Park04480cf2019-02-06 00:16:29 +09004896
Jiyong Park59140302020-12-14 18:44:04 +09004897func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004898 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004899 apex {
4900 name: "myapex",
4901 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004902 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004903 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004904 arch: {
4905 arm64: {
4906 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004907 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004908 },
4909 x86_64: {
4910 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004911 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004912 },
4913 }
4914 }
4915
4916 apex_key {
4917 name: "myapex.key",
4918 public_key: "testkey.avbpubkey",
4919 private_key: "testkey.pem",
4920 }
4921
4922 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004923 name: "mylib.generic",
4924 srcs: ["mylib.cpp"],
4925 system_shared_libs: [],
4926 stl: "none",
4927 // TODO: remove //apex_available:platform
4928 apex_available: [
4929 "//apex_available:platform",
4930 "myapex",
4931 ],
4932 }
4933
4934 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004935 name: "mylib.arm64",
4936 srcs: ["mylib.cpp"],
4937 system_shared_libs: [],
4938 stl: "none",
4939 // TODO: remove //apex_available:platform
4940 apex_available: [
4941 "//apex_available:platform",
4942 "myapex",
4943 ],
4944 }
4945
4946 cc_library {
4947 name: "mylib.x64",
4948 srcs: ["mylib.cpp"],
4949 system_shared_libs: [],
4950 stl: "none",
4951 // TODO: remove //apex_available:platform
4952 apex_available: [
4953 "//apex_available:platform",
4954 "myapex",
4955 ],
4956 }
4957 `)
4958
Jooyung Hana0503a52023-08-23 13:12:50 +09004959 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004960 copyCmds := apexRule.Args["copy_commands"]
4961
4962 // Ensure that apex variant is created for the direct dep
4963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004964 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004965 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4966
4967 // Ensure that both direct and indirect deps are copied into apex
4968 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4969 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4970}
4971
Jiyong Park04480cf2019-02-06 00:16:29 +09004972func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004973 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004974 apex {
4975 name: "myapex",
4976 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004977 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004978 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004979 }
4980
4981 apex_key {
4982 name: "myapex.key",
4983 public_key: "testkey.avbpubkey",
4984 private_key: "testkey.pem",
4985 }
4986
4987 sh_binary {
4988 name: "myscript",
4989 src: "mylib.cpp",
4990 filename: "myscript.sh",
4991 sub_dir: "script",
4992 }
4993 `)
4994
Jooyung Hana0503a52023-08-23 13:12:50 +09004995 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004996 copyCmds := apexRule.Args["copy_commands"]
4997
4998 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4999}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005000
Jooyung Han91df2082019-11-20 01:49:42 +09005001func TestApexInVariousPartition(t *testing.T) {
5002 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005003 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005004 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005005 {"", "system"},
5006 {"product_specific: true", "product"},
5007 {"soc_specific: true", "vendor"},
5008 {"proprietary: true", "vendor"},
5009 {"vendor: true", "vendor"},
5010 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005011 }
5012 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005013 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005014 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005018 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005019 `+tc.propName+`
5020 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005021
Jooyung Han91df2082019-11-20 01:49:42 +09005022 apex_key {
5023 name: "myapex.key",
5024 public_key: "testkey.avbpubkey",
5025 private_key: "testkey.pem",
5026 }
5027 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005028
Jooyung Hana0503a52023-08-23 13:12:50 +09005029 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005030 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005031 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005032 if actual != expected {
5033 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5034 }
Jooyung Han91df2082019-11-20 01:49:42 +09005035 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005036 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005037}
Jiyong Park67882562019-03-21 01:11:21 +09005038
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005040 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 apex {
5042 name: "myapex",
5043 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005044 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex_key {
5048 name: "myapex.key",
5049 public_key: "testkey.avbpubkey",
5050 private_key: "testkey.pem",
5051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005052 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005053 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054 rule := module.Output("file_contexts")
5055 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5056}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005057
Jooyung Han580eb4f2020-06-24 19:33:06 +09005058func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060 apex {
5061 name: "myapex",
5062 key: "myapex.key",
5063 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005064 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005065 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005066
Jooyung Han580eb4f2020-06-24 19:33:06 +09005067 apex_key {
5068 name: "myapex.key",
5069 public_key: "testkey.avbpubkey",
5070 private_key: "testkey.pem",
5071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005072 `, withFiles(map[string][]byte{
5073 "my_own_file_contexts": nil,
5074 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005075}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079 apex {
5080 name: "myapex",
5081 key: "myapex.key",
5082 product_specific: true,
5083 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005084 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086
Jooyung Han580eb4f2020-06-24 19:33:06 +09005087 apex_key {
5088 name: "myapex.key",
5089 public_key: "testkey.avbpubkey",
5090 private_key: "testkey.pem",
5091 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005092 `)
5093
Colin Cross1c460562021-02-16 17:55:47 -08005094 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005095 apex {
5096 name: "myapex",
5097 key: "myapex.key",
5098 product_specific: true,
5099 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005100 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005102
Jooyung Han580eb4f2020-06-24 19:33:06 +09005103 apex_key {
5104 name: "myapex.key",
5105 public_key: "testkey.avbpubkey",
5106 private_key: "testkey.pem",
5107 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005108 `, withFiles(map[string][]byte{
5109 "product_specific_file_contexts": nil,
5110 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 rule := module.Output("file_contexts")
5113 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5114}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005115
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005117 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005118 apex {
5119 name: "myapex",
5120 key: "myapex.key",
5121 product_specific: true,
5122 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005123 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005124 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005125
Jooyung Han580eb4f2020-06-24 19:33:06 +09005126 apex_key {
5127 name: "myapex.key",
5128 public_key: "testkey.avbpubkey",
5129 private_key: "testkey.pem",
5130 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005131
Jooyung Han580eb4f2020-06-24 19:33:06 +09005132 filegroup {
5133 name: "my-file-contexts",
5134 srcs: ["product_specific_file_contexts"],
5135 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005136 `, withFiles(map[string][]byte{
5137 "product_specific_file_contexts": nil,
5138 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005139 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005140 rule := module.Output("file_contexts")
5141 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005142}
5143
Jiyong Park67882562019-03-21 01:11:21 +09005144func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005145 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005146 apex_key {
5147 name: "myapex.key",
5148 public_key: ":my.avbpubkey",
5149 private_key: ":my.pem",
5150 product_specific: true,
5151 }
5152
5153 filegroup {
5154 name: "my.avbpubkey",
5155 srcs: ["testkey2.avbpubkey"],
5156 }
5157
5158 filegroup {
5159 name: "my.pem",
5160 srcs: ["testkey2.pem"],
5161 }
5162 `)
5163
5164 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5165 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005166 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005167 if actual_pubkey != expected_pubkey {
5168 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5169 }
5170 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005171 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005172 if actual_privkey != expected_privkey {
5173 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5174 }
5175}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005176
5177func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005178 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005179 prebuilt_apex {
5180 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005181 arch: {
5182 arm64: {
5183 src: "myapex-arm64.apex",
5184 },
5185 arm: {
5186 src: "myapex-arm.apex",
5187 },
5188 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005189 }
5190 `)
5191
Wei Li340ee8e2022-03-18 17:33:24 -07005192 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5193 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005194
Jiyong Parkc95714e2019-03-29 14:23:10 +09005195 expectedInput := "myapex-arm64.apex"
5196 if prebuilt.inputApex.String() != expectedInput {
5197 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5198 }
Wei Li340ee8e2022-03-18 17:33:24 -07005199 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5200 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5201 rule := testingModule.Rule("genProvenanceMetaData")
5202 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5203 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5204 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5205 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005206
5207 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5208 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005209}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005210
Paul Duffinc0609c62021-03-01 17:27:16 +00005211func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005212 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005213 prebuilt_apex {
5214 name: "myapex",
5215 }
5216 `)
5217}
5218
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005219func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005220 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005221 prebuilt_apex {
5222 name: "myapex",
5223 src: "myapex-arm.apex",
5224 filename: "notmyapex.apex",
5225 }
5226 `)
5227
Wei Li340ee8e2022-03-18 17:33:24 -07005228 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5229 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005230
5231 expected := "notmyapex.apex"
5232 if p.installFilename != expected {
5233 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5234 }
Wei Li340ee8e2022-03-18 17:33:24 -07005235 rule := testingModule.Rule("genProvenanceMetaData")
5236 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5237 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5238 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5239 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005240}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005241
Samiul Islam7c02e262021-09-08 17:48:28 +01005242func TestApexSetFilenameOverride(t *testing.T) {
5243 testApex(t, `
5244 apex_set {
5245 name: "com.company.android.myapex",
5246 apex_name: "com.android.myapex",
5247 set: "company-myapex.apks",
5248 filename: "com.company.android.myapex.apex"
5249 }
5250 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5251
5252 testApex(t, `
5253 apex_set {
5254 name: "com.company.android.myapex",
5255 apex_name: "com.android.myapex",
5256 set: "company-myapex.apks",
5257 filename: "com.company.android.myapex.capex"
5258 }
5259 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5260
5261 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5262 apex_set {
5263 name: "com.company.android.myapex",
5264 apex_name: "com.android.myapex",
5265 set: "company-myapex.apks",
5266 filename: "some-random-suffix"
5267 }
5268 `)
5269}
5270
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005271func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005272 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005273 prebuilt_apex {
5274 name: "myapex.prebuilt",
5275 src: "myapex-arm.apex",
5276 overrides: [
5277 "myapex",
5278 ],
5279 }
5280 `)
5281
Wei Li340ee8e2022-03-18 17:33:24 -07005282 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5283 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005284
5285 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005286 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005287 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005288 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005289 }
Wei Li340ee8e2022-03-18 17:33:24 -07005290 rule := testingModule.Rule("genProvenanceMetaData")
5291 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5292 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5293 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5294 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005295}
5296
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005297func TestPrebuiltApexName(t *testing.T) {
5298 testApex(t, `
5299 prebuilt_apex {
5300 name: "com.company.android.myapex",
5301 apex_name: "com.android.myapex",
5302 src: "company-myapex-arm.apex",
5303 }
5304 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5305
5306 testApex(t, `
5307 apex_set {
5308 name: "com.company.android.myapex",
5309 apex_name: "com.android.myapex",
5310 set: "company-myapex.apks",
5311 }
5312 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5313}
5314
5315func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5316 _ = android.GroupFixturePreparers(
5317 java.PrepareForTestWithJavaDefaultModules,
5318 PrepareForTestWithApexBuildComponents,
5319 android.FixtureWithRootAndroidBp(`
5320 platform_bootclasspath {
5321 name: "platform-bootclasspath",
5322 fragments: [
5323 {
5324 apex: "com.android.art",
5325 module: "art-bootclasspath-fragment",
5326 },
5327 ],
5328 }
5329
5330 prebuilt_apex {
5331 name: "com.company.android.art",
5332 apex_name: "com.android.art",
5333 src: "com.company.android.art-arm.apex",
5334 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5335 }
5336
5337 prebuilt_bootclasspath_fragment {
5338 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005339 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005340 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005341 hidden_api: {
5342 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5343 metadata: "my-bootclasspath-fragment/metadata.csv",
5344 index: "my-bootclasspath-fragment/index.csv",
5345 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5346 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5347 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005348 }
5349
5350 java_import {
5351 name: "core-oj",
5352 jars: ["prebuilt.jar"],
5353 }
5354 `),
5355 ).RunTest(t)
5356}
5357
Spandan Das59a4a2b2024-01-09 21:35:56 +00005358// A minimal context object for use with DexJarBuildPath
5359type moduleErrorfTestCtx struct {
5360}
5361
5362func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5363}
5364
Paul Duffin092153d2021-01-26 11:42:39 +00005365// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5366// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005367func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005368 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005369
Paul Duffin89886cb2021-02-05 16:44:03 +00005370 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005371 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005372 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005373 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005374 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005375 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005376 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5377 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5378 android.NormalizePathForTesting(dexJarBuildPath))
5379 }
5380
5381 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005382 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 // Make sure the import has been given the correct path to the dex jar.
5384 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5385 dexJarBuildPath := p.DexJarInstallPath()
5386 stem := android.RemoveOptionalPrebuiltPrefix(name)
5387 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5388 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5389 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 }
5391
Paul Duffin39853512021-02-26 11:09:39 +00005392 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005393 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005394 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005395 android.AssertArrayString(t, "Check if there is no source variant",
5396 []string{"android_common"},
5397 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005398 }
5399
5400 t.Run("prebuilt only", func(t *testing.T) {
5401 bp := `
5402 prebuilt_apex {
5403 name: "myapex",
5404 arch: {
5405 arm64: {
5406 src: "myapex-arm64.apex",
5407 },
5408 arm: {
5409 src: "myapex-arm.apex",
5410 },
5411 },
Paul Duffin39853512021-02-26 11:09:39 +00005412 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005413 }
5414
5415 java_import {
5416 name: "libfoo",
5417 jars: ["libfoo.jar"],
5418 }
Paul Duffin39853512021-02-26 11:09:39 +00005419
5420 java_sdk_library_import {
5421 name: "libbar",
5422 public: {
5423 jars: ["libbar.jar"],
5424 },
5425 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005426 `
5427
5428 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5429 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5430
Martin Stjernholm44825602021-09-17 01:44:12 +01005431 deapexerName := deapexerModuleName("myapex")
5432 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5433
Paul Duffinf6932af2021-02-26 18:21:56 +00005434 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005435 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005436 rule := deapexer.Rule("deapexer")
5437 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5438 t.Errorf("expected: %q, found: %q", expected, actual)
5439 }
5440
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005441 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005442 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005443 rule = prebuiltApex.Rule("android/soong/android.Cp")
5444 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5445 t.Errorf("expected: %q, found: %q", expected, actual)
5446 }
5447
Paul Duffin89886cb2021-02-05 16:44:03 +00005448 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005450
5451 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005452 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005453 })
5454
5455 t.Run("prebuilt with source preferred", func(t *testing.T) {
5456
5457 bp := `
5458 prebuilt_apex {
5459 name: "myapex",
5460 arch: {
5461 arm64: {
5462 src: "myapex-arm64.apex",
5463 },
5464 arm: {
5465 src: "myapex-arm.apex",
5466 },
5467 },
Paul Duffin39853512021-02-26 11:09:39 +00005468 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005469 }
5470
5471 java_import {
5472 name: "libfoo",
5473 jars: ["libfoo.jar"],
5474 }
5475
5476 java_library {
5477 name: "libfoo",
5478 }
Paul Duffin39853512021-02-26 11:09:39 +00005479
5480 java_sdk_library_import {
5481 name: "libbar",
5482 public: {
5483 jars: ["libbar.jar"],
5484 },
5485 }
5486
5487 java_sdk_library {
5488 name: "libbar",
5489 srcs: ["foo/bar/MyClass.java"],
5490 unsafe_ignore_missing_latest_api: true,
5491 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005492 `
5493
5494 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5495 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5496
Paul Duffin89886cb2021-02-05 16:44:03 +00005497 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005498 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005499 ensureNoSourceVariant(t, ctx, "libfoo")
5500
5501 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005502 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005503 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005504 })
5505
5506 t.Run("prebuilt preferred with source", func(t *testing.T) {
5507 bp := `
5508 prebuilt_apex {
5509 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005510 arch: {
5511 arm64: {
5512 src: "myapex-arm64.apex",
5513 },
5514 arm: {
5515 src: "myapex-arm.apex",
5516 },
5517 },
Paul Duffin39853512021-02-26 11:09:39 +00005518 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005519 }
5520
5521 java_import {
5522 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005523 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005524 jars: ["libfoo.jar"],
5525 }
5526
5527 java_library {
5528 name: "libfoo",
5529 }
Paul Duffin39853512021-02-26 11:09:39 +00005530
5531 java_sdk_library_import {
5532 name: "libbar",
5533 prefer: true,
5534 public: {
5535 jars: ["libbar.jar"],
5536 },
5537 }
5538
5539 java_sdk_library {
5540 name: "libbar",
5541 srcs: ["foo/bar/MyClass.java"],
5542 unsafe_ignore_missing_latest_api: true,
5543 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005544 `
5545
5546 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5547 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5548
Paul Duffin89886cb2021-02-05 16:44:03 +00005549 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005550 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005551 ensureNoSourceVariant(t, ctx, "libfoo")
5552
5553 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005554 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005555 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005556 })
5557}
5558
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005559func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005560 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005561 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005562 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5563 // is disabled.
5564 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5565 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005566
Paul Duffin37856732021-02-26 14:24:15 +00005567 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5568 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005569 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005570 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005571 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005572 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005573 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 foundLibfooJar = true
5575 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005576 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005577 }
5578 }
5579 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005580 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 +00005581 }
5582 }
5583
Paul Duffin40a3f652021-07-19 13:11:24 +01005584 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005585 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005586 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005587 var rule android.TestingBuildParams
5588
5589 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5590 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005591 }
5592
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5594 t.Helper()
5595 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5596 var rule android.TestingBuildParams
5597
5598 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5599 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5600 }
5601
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 fragment := java.ApexVariantReference{
5603 Apex: proptools.StringPtr("myapex"),
5604 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5605 }
5606
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 t.Run("prebuilt only", func(t *testing.T) {
5608 bp := `
5609 prebuilt_apex {
5610 name: "myapex",
5611 arch: {
5612 arm64: {
5613 src: "myapex-arm64.apex",
5614 },
5615 arm: {
5616 src: "myapex-arm.apex",
5617 },
5618 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005619 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5620 }
5621
5622 prebuilt_bootclasspath_fragment {
5623 name: "my-bootclasspath-fragment",
5624 contents: ["libfoo", "libbar"],
5625 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005626 hidden_api: {
5627 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5628 metadata: "my-bootclasspath-fragment/metadata.csv",
5629 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005630 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5631 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5632 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005633 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 }
5635
5636 java_import {
5637 name: "libfoo",
5638 jars: ["libfoo.jar"],
5639 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005640 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005641 }
Paul Duffin37856732021-02-26 14:24:15 +00005642
5643 java_sdk_library_import {
5644 name: "libbar",
5645 public: {
5646 jars: ["libbar.jar"],
5647 },
5648 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005649 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005650 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005651 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 `
5653
Paul Duffin89f570a2021-06-16 01:42:33 +01005654 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005655 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5656 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005657
Paul Duffin537ea3d2021-05-14 10:38:00 +01005658 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005659 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005660 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005661 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005662 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005663 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 +01005664 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005665 })
5666
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005667 t.Run("apex_set only", func(t *testing.T) {
5668 bp := `
5669 apex_set {
5670 name: "myapex",
5671 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005672 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005673 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005674 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5675 }
5676
5677 java_import {
5678 name: "myjavalib",
5679 jars: ["myjavalib.jar"],
5680 apex_available: ["myapex"],
5681 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005682 }
5683
5684 prebuilt_bootclasspath_fragment {
5685 name: "my-bootclasspath-fragment",
5686 contents: ["libfoo", "libbar"],
5687 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005688 hidden_api: {
5689 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5690 metadata: "my-bootclasspath-fragment/metadata.csv",
5691 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005692 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5693 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5694 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005695 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 }
5697
Liz Kammer2dc72442023-04-20 10:10:48 -04005698 prebuilt_systemserverclasspath_fragment {
5699 name: "my-systemserverclasspath-fragment",
5700 contents: ["libbaz"],
5701 apex_available: ["myapex"],
5702 }
5703
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005704 java_import {
5705 name: "libfoo",
5706 jars: ["libfoo.jar"],
5707 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005708 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005709 }
5710
5711 java_sdk_library_import {
5712 name: "libbar",
5713 public: {
5714 jars: ["libbar.jar"],
5715 },
5716 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005717 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005718 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005719 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005720
5721 java_sdk_library_import {
5722 name: "libbaz",
5723 public: {
5724 jars: ["libbaz.jar"],
5725 },
5726 apex_available: ["myapex"],
5727 shared_library: false,
5728 permitted_packages: ["baz"],
5729 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005730 `
5731
Paul Duffin89f570a2021-06-16 01:42:33 +01005732 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005733 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5734 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5735
Paul Duffin537ea3d2021-05-14 10:38:00 +01005736 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005737 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005738 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005739 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005740 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005741 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 +01005742 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005743
5744 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5745
5746 overrideNames := []string{
5747 "",
5748 "myjavalib.myapex",
5749 "libfoo.myapex",
5750 "libbar.myapex",
5751 "libbaz.myapex",
5752 }
5753 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5754 for i, e := range mkEntries {
5755 g := e.OverrideName
5756 if w := overrideNames[i]; w != g {
5757 t.Errorf("Expected override name %q, got %q", w, g)
5758 }
5759 }
5760
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005761 })
5762
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005763 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5764 bp := `
5765 prebuilt_apex {
5766 name: "myapex",
5767 arch: {
5768 arm64: {
5769 src: "myapex-arm64.apex",
5770 },
5771 arm: {
5772 src: "myapex-arm.apex",
5773 },
5774 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005775 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5776 }
5777
5778 prebuilt_bootclasspath_fragment {
5779 name: "my-bootclasspath-fragment",
5780 contents: ["libfoo", "libbar"],
5781 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005782 hidden_api: {
5783 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5784 metadata: "my-bootclasspath-fragment/metadata.csv",
5785 index: "my-bootclasspath-fragment/index.csv",
5786 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5787 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5788 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005789 }
5790
5791 java_import {
5792 name: "libfoo",
5793 jars: ["libfoo.jar"],
5794 apex_available: ["myapex"],
5795 }
5796
5797 java_library {
5798 name: "libfoo",
5799 srcs: ["foo/bar/MyClass.java"],
5800 apex_available: ["myapex"],
5801 }
Paul Duffin37856732021-02-26 14:24:15 +00005802
5803 java_sdk_library_import {
5804 name: "libbar",
5805 public: {
5806 jars: ["libbar.jar"],
5807 },
5808 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005809 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005810 }
5811
5812 java_sdk_library {
5813 name: "libbar",
5814 srcs: ["foo/bar/MyClass.java"],
5815 unsafe_ignore_missing_latest_api: true,
5816 apex_available: ["myapex"],
5817 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005818 `
5819
5820 // In this test the source (java_library) libfoo is active since the
5821 // prebuilt (java_import) defaults to prefer:false. However the
5822 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5823 // find the dex boot jar in it. We either need to disable the source libfoo
5824 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005825 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005826 // dexbootjar check is skipped if AllowMissingDependencies is true
5827 preparerAllowMissingDeps := android.GroupFixturePreparers(
5828 preparer,
5829 android.PrepareForTestWithAllowMissingDependencies,
5830 )
5831 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005832 })
5833
5834 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5835 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005836 apex {
5837 name: "myapex",
5838 key: "myapex.key",
5839 updatable: false,
5840 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5841 }
5842
5843 apex_key {
5844 name: "myapex.key",
5845 public_key: "testkey.avbpubkey",
5846 private_key: "testkey.pem",
5847 }
5848
5849 bootclasspath_fragment {
5850 name: "my-bootclasspath-fragment",
5851 contents: ["libfoo", "libbar"],
5852 apex_available: ["myapex"],
5853 hidden_api: {
5854 split_packages: ["*"],
5855 },
5856 }
5857
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005873 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005874 contents: ["libfoo", "libbar"],
5875 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005876 hidden_api: {
5877 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5878 metadata: "my-bootclasspath-fragment/metadata.csv",
5879 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005880 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5881 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5882 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005883 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005884 }
5885
5886 java_import {
5887 name: "libfoo",
5888 prefer: true,
5889 jars: ["libfoo.jar"],
5890 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005891 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005892 }
5893
5894 java_library {
5895 name: "libfoo",
5896 srcs: ["foo/bar/MyClass.java"],
5897 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005898 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005899 }
Paul Duffin37856732021-02-26 14:24:15 +00005900
5901 java_sdk_library_import {
5902 name: "libbar",
5903 prefer: true,
5904 public: {
5905 jars: ["libbar.jar"],
5906 },
5907 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005908 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005909 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005910 }
5911
5912 java_sdk_library {
5913 name: "libbar",
5914 srcs: ["foo/bar/MyClass.java"],
5915 unsafe_ignore_missing_latest_api: true,
5916 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005917 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005918 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005919 `
5920
Paul Duffin89f570a2021-06-16 01:42:33 +01005921 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005922 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5923 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005924
Paul Duffin537ea3d2021-05-14 10:38:00 +01005925 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005926 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005927 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005928 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005929 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005930 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 +01005931 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005932 })
5933
5934 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5935 bp := `
5936 apex {
5937 name: "myapex",
5938 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005939 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005940 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005941 }
5942
5943 apex_key {
5944 name: "myapex.key",
5945 public_key: "testkey.avbpubkey",
5946 private_key: "testkey.pem",
5947 }
5948
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005949 bootclasspath_fragment {
5950 name: "my-bootclasspath-fragment",
5951 contents: ["libfoo", "libbar"],
5952 apex_available: ["myapex"],
5953 hidden_api: {
5954 split_packages: ["*"],
5955 },
5956 }
5957
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005958 prebuilt_apex {
5959 name: "myapex",
5960 arch: {
5961 arm64: {
5962 src: "myapex-arm64.apex",
5963 },
5964 arm: {
5965 src: "myapex-arm.apex",
5966 },
5967 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005968 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5969 }
5970
5971 prebuilt_bootclasspath_fragment {
5972 name: "my-bootclasspath-fragment",
5973 contents: ["libfoo", "libbar"],
5974 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005975 hidden_api: {
5976 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5977 metadata: "my-bootclasspath-fragment/metadata.csv",
5978 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005979 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5980 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5981 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005982 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005983 }
5984
5985 java_import {
5986 name: "libfoo",
5987 jars: ["libfoo.jar"],
5988 apex_available: ["myapex"],
5989 }
5990
5991 java_library {
5992 name: "libfoo",
5993 srcs: ["foo/bar/MyClass.java"],
5994 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005995 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005996 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005997 }
Paul Duffin37856732021-02-26 14:24:15 +00005998
5999 java_sdk_library_import {
6000 name: "libbar",
6001 public: {
6002 jars: ["libbar.jar"],
6003 },
6004 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006005 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006006 }
6007
6008 java_sdk_library {
6009 name: "libbar",
6010 srcs: ["foo/bar/MyClass.java"],
6011 unsafe_ignore_missing_latest_api: true,
6012 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006013 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006014 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006015 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006016 `
6017
Paul Duffin89f570a2021-06-16 01:42:33 +01006018 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006019 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6020 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 +00006021
Paul Duffin537ea3d2021-05-14 10:38:00 +01006022 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006023 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006024 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6025 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006026 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6027 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 +01006028 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006029 })
6030
6031 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6032 bp := `
6033 apex {
6034 name: "myapex",
6035 enabled: false,
6036 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006037 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006038 }
6039
6040 apex_key {
6041 name: "myapex.key",
6042 public_key: "testkey.avbpubkey",
6043 private_key: "testkey.pem",
6044 }
6045
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006046 bootclasspath_fragment {
6047 name: "my-bootclasspath-fragment",
6048 enabled: false,
6049 contents: ["libfoo", "libbar"],
6050 apex_available: ["myapex"],
6051 hidden_api: {
6052 split_packages: ["*"],
6053 },
6054 }
6055
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006056 prebuilt_apex {
6057 name: "myapex",
6058 arch: {
6059 arm64: {
6060 src: "myapex-arm64.apex",
6061 },
6062 arm: {
6063 src: "myapex-arm.apex",
6064 },
6065 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006066 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6067 }
6068
6069 prebuilt_bootclasspath_fragment {
6070 name: "my-bootclasspath-fragment",
6071 contents: ["libfoo", "libbar"],
6072 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006073 hidden_api: {
6074 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6075 metadata: "my-bootclasspath-fragment/metadata.csv",
6076 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006077 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6078 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6079 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006080 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006081 }
6082
6083 java_import {
6084 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006085 jars: ["libfoo.jar"],
6086 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006087 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006088 }
6089
6090 java_library {
6091 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006092 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006093 srcs: ["foo/bar/MyClass.java"],
6094 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006095 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006096 }
Paul Duffin37856732021-02-26 14:24:15 +00006097
6098 java_sdk_library_import {
6099 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006100 public: {
6101 jars: ["libbar.jar"],
6102 },
6103 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006104 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006105 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006106 }
6107
6108 java_sdk_library {
6109 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006110 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006111 srcs: ["foo/bar/MyClass.java"],
6112 unsafe_ignore_missing_latest_api: true,
6113 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006114 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006115 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006116 `
6117
Paul Duffin89f570a2021-06-16 01:42:33 +01006118 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006119 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6120 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006121
Paul Duffin537ea3d2021-05-14 10:38:00 +01006122 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006123 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006124 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006125 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006126 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006127 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 +01006128 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006129 })
6130}
6131
Roland Levillain630846d2019-06-26 12:48:34 +01006132func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006133 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006134 apex_test {
6135 name: "myapex",
6136 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006137 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006138 tests: [
6139 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006140 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006141 ],
6142 }
6143
6144 apex_key {
6145 name: "myapex.key",
6146 public_key: "testkey.avbpubkey",
6147 private_key: "testkey.pem",
6148 }
6149
Liz Kammer1c14a212020-05-12 15:26:55 -07006150 filegroup {
6151 name: "fg",
6152 srcs: [
6153 "baz",
6154 "bar/baz"
6155 ],
6156 }
6157
Roland Levillain630846d2019-06-26 12:48:34 +01006158 cc_test {
6159 name: "mytest",
6160 gtest: false,
6161 srcs: ["mytest.cpp"],
6162 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006163 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006164 system_shared_libs: [],
6165 static_executable: true,
6166 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006167 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006168 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006169
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006170 cc_library {
6171 name: "mylib",
6172 srcs: ["mylib.cpp"],
6173 system_shared_libs: [],
6174 stl: "none",
6175 }
6176
Liz Kammer5bd365f2020-05-27 15:15:11 -07006177 filegroup {
6178 name: "fg2",
6179 srcs: [
6180 "testdata/baz"
6181 ],
6182 }
6183
Roland Levillain9b5fde92019-06-28 15:41:19 +01006184 cc_test {
6185 name: "mytests",
6186 gtest: false,
6187 srcs: [
6188 "mytest1.cpp",
6189 "mytest2.cpp",
6190 "mytest3.cpp",
6191 ],
6192 test_per_src: true,
6193 relative_install_path: "test",
6194 system_shared_libs: [],
6195 static_executable: true,
6196 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006197 data: [
6198 ":fg",
6199 ":fg2",
6200 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006201 }
Roland Levillain630846d2019-06-26 12:48:34 +01006202 `)
6203
Jooyung Hana0503a52023-08-23 13:12:50 +09006204 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006205 copyCmds := apexRule.Args["copy_commands"]
6206
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006207 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006208 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006209 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006210
Liz Kammer1c14a212020-05-12 15:26:55 -07006211 //Ensure that test data are copied into apex.
6212 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6213 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6214
Roland Levillain9b5fde92019-06-28 15:41:19 +01006215 // Ensure that test deps built with `test_per_src` are copied into apex.
6216 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6217 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6218 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006219
6220 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006221 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006222 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006223 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006224 prefix := "TARGET_"
6225 var builder strings.Builder
6226 data.Custom(&builder, name, prefix, "", data)
6227 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006228 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6229 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6230 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6231 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006232 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006233}
6234
Jooyung Hand48f3c32019-08-23 11:18:57 +09006235func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6236 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6237 apex {
6238 name: "myapex",
6239 key: "myapex.key",
6240 native_shared_libs: ["libfoo"],
6241 }
6242
6243 apex_key {
6244 name: "myapex.key",
6245 public_key: "testkey.avbpubkey",
6246 private_key: "testkey.pem",
6247 }
6248
6249 cc_library {
6250 name: "libfoo",
6251 stl: "none",
6252 system_shared_libs: [],
6253 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006254 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006255 }
6256 `)
6257 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6258 apex {
6259 name: "myapex",
6260 key: "myapex.key",
6261 java_libs: ["myjar"],
6262 }
6263
6264 apex_key {
6265 name: "myapex.key",
6266 public_key: "testkey.avbpubkey",
6267 private_key: "testkey.pem",
6268 }
6269
6270 java_library {
6271 name: "myjar",
6272 srcs: ["foo/bar/MyClass.java"],
6273 sdk_version: "none",
6274 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006275 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006276 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006277 }
6278 `)
6279}
6280
Bill Peckhama41a6962021-01-11 10:58:54 -08006281func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006282 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006283 apex {
6284 name: "myapex",
6285 key: "myapex.key",
6286 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006287 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006288 }
6289
6290 apex_key {
6291 name: "myapex.key",
6292 public_key: "testkey.avbpubkey",
6293 private_key: "testkey.pem",
6294 }
6295
6296 java_import {
6297 name: "myjavaimport",
6298 apex_available: ["myapex"],
6299 jars: ["my.jar"],
6300 compile_dex: true,
6301 }
6302 `)
6303
Jooyung Hana0503a52023-08-23 13:12:50 +09006304 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006305 apexRule := module.Rule("apexRule")
6306 copyCmds := apexRule.Args["copy_commands"]
6307 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6308}
6309
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006310func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006311 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006312 apex {
6313 name: "myapex",
6314 key: "myapex.key",
6315 apps: [
6316 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006317 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006319 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006320 }
6321
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327
6328 android_app {
6329 name: "AppFoo",
6330 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006331 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006332 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006333 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006334 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006335 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006336 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006337
6338 android_app {
6339 name: "AppFooPriv",
6340 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006341 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006342 system_modules: "none",
6343 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006344 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006345 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006346 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006347 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006348
6349 cc_library_shared {
6350 name: "libjni",
6351 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006352 shared_libs: ["libfoo"],
6353 stl: "none",
6354 system_shared_libs: [],
6355 apex_available: [ "myapex" ],
6356 sdk_version: "current",
6357 }
6358
6359 cc_library_shared {
6360 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006361 stl: "none",
6362 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006363 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006364 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006365 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006366 `)
6367
Jooyung Hana0503a52023-08-23 13:12:50 +09006368 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006369 apexRule := module.Rule("apexRule")
6370 copyCmds := apexRule.Args["copy_commands"]
6371
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006372 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6373 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006374 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006375
Colin Crossaede88c2020-08-11 12:17:01 -07006376 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006377 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006378 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006379 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006380 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006381 // JNI libraries including transitive deps are
6382 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006383 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006384 // ... embedded inside APK (jnilibs.zip)
6385 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6386 // ... and not directly inside the APEX
6387 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6388 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006389
6390 apexBundle := module.Module().(*apexBundle)
6391 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6392 var builder strings.Builder
6393 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6394 androidMk := builder.String()
6395 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6396 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6397 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6398 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6399 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6400 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 +01006401}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006402
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006403func TestApexWithAppImportBuildId(t *testing.T) {
6404 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6405 for _, id := range invalidBuildIds {
6406 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6407 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6408 variables.BuildId = proptools.StringPtr(id)
6409 })
6410 testApexError(t, message, `apex {
6411 name: "myapex",
6412 key: "myapex.key",
6413 apps: ["AppFooPrebuilt"],
6414 updatable: false,
6415 }
6416
6417 apex_key {
6418 name: "myapex.key",
6419 public_key: "testkey.avbpubkey",
6420 private_key: "testkey.pem",
6421 }
6422
6423 android_app_import {
6424 name: "AppFooPrebuilt",
6425 apk: "PrebuiltAppFoo.apk",
6426 presigned: true,
6427 apex_available: ["myapex"],
6428 }
6429 `, fixture)
6430 }
6431}
6432
Dario Frenicde2a032019-10-27 00:29:22 +01006433func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006434 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006435 apex {
6436 name: "myapex",
6437 key: "myapex.key",
6438 apps: [
6439 "AppFooPrebuilt",
6440 "AppFooPrivPrebuilt",
6441 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006442 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006443 }
6444
6445 apex_key {
6446 name: "myapex.key",
6447 public_key: "testkey.avbpubkey",
6448 private_key: "testkey.pem",
6449 }
6450
6451 android_app_import {
6452 name: "AppFooPrebuilt",
6453 apk: "PrebuiltAppFoo.apk",
6454 presigned: true,
6455 dex_preopt: {
6456 enabled: false,
6457 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006458 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006459 }
6460
6461 android_app_import {
6462 name: "AppFooPrivPrebuilt",
6463 apk: "PrebuiltAppFooPriv.apk",
6464 privileged: true,
6465 presigned: true,
6466 dex_preopt: {
6467 enabled: false,
6468 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006469 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006470 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006471 }
6472 `)
6473
Jooyung Hana0503a52023-08-23 13:12:50 +09006474 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006475 apexRule := module.Rule("apexRule")
6476 copyCmds := apexRule.Args["copy_commands"]
6477
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006478 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6479 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006480}
6481
6482func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006483 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006484 apex {
6485 name: "myapex",
6486 key: "myapex.key",
6487 apps: [
6488 "AppFoo",
6489 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006490 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006491 }
6492
6493 apex_key {
6494 name: "myapex.key",
6495 public_key: "testkey.avbpubkey",
6496 private_key: "testkey.pem",
6497 }
6498
6499 android_app {
6500 name: "AppFoo",
6501 srcs: ["foo/bar/MyClass.java"],
6502 sdk_version: "none",
6503 system_modules: "none",
6504 apex_available: [ "myapex" ],
6505 }
6506
6507 android_app_import {
6508 name: "AppFoo",
6509 apk: "AppFooPrebuilt.apk",
6510 filename: "AppFooPrebuilt.apk",
6511 presigned: true,
6512 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006513 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006514 }
6515 `, withFiles(map[string][]byte{
6516 "AppFooPrebuilt.apk": nil,
6517 }))
6518
Jooyung Hana0503a52023-08-23 13:12:50 +09006519 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006520 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006521 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006522}
6523
Dario Freni6f3937c2019-12-20 22:58:03 +00006524func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006525 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006526 apex {
6527 name: "myapex",
6528 key: "myapex.key",
6529 apps: [
6530 "TesterHelpAppFoo",
6531 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006532 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006533 }
6534
6535 apex_key {
6536 name: "myapex.key",
6537 public_key: "testkey.avbpubkey",
6538 private_key: "testkey.pem",
6539 }
6540
6541 android_test_helper_app {
6542 name: "TesterHelpAppFoo",
6543 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006544 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006545 }
6546
6547 `)
6548
Jooyung Hana0503a52023-08-23 13:12:50 +09006549 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006550 apexRule := module.Rule("apexRule")
6551 copyCmds := apexRule.Args["copy_commands"]
6552
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006553 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006554}
6555
Jooyung Han18020ea2019-11-13 10:50:48 +09006556func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6557 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006558 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006559 apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006563 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006564 }
6565
6566 apex_key {
6567 name: "myapex.key",
6568 public_key: "testkey.avbpubkey",
6569 private_key: "testkey.pem",
6570 }
6571
6572 apex {
6573 name: "otherapex",
6574 key: "myapex.key",
6575 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006576 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006577 }
6578
6579 cc_defaults {
6580 name: "libfoo-defaults",
6581 apex_available: ["otherapex"],
6582 }
6583
6584 cc_library {
6585 name: "libfoo",
6586 defaults: ["libfoo-defaults"],
6587 stl: "none",
6588 system_shared_libs: [],
6589 }`)
6590}
6591
Paul Duffine52e66f2020-03-30 17:54:29 +01006592func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006593 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006594 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006595 apex {
6596 name: "myapex",
6597 key: "myapex.key",
6598 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006599 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006600 }
6601
6602 apex_key {
6603 name: "myapex.key",
6604 public_key: "testkey.avbpubkey",
6605 private_key: "testkey.pem",
6606 }
6607
6608 apex {
6609 name: "otherapex",
6610 key: "otherapex.key",
6611 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006612 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006613 }
6614
6615 apex_key {
6616 name: "otherapex.key",
6617 public_key: "testkey.avbpubkey",
6618 private_key: "testkey.pem",
6619 }
6620
6621 cc_library {
6622 name: "libfoo",
6623 stl: "none",
6624 system_shared_libs: [],
6625 apex_available: ["otherapex"],
6626 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006627}
Jiyong Park127b40b2019-09-30 16:04:35 +09006628
Paul Duffine52e66f2020-03-30 17:54:29 +01006629func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006630 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006631 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006632.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006633.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006634.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006635.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006636.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006637.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006638 apex {
6639 name: "myapex",
6640 key: "myapex.key",
6641 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006642 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006643 }
6644
6645 apex_key {
6646 name: "myapex.key",
6647 public_key: "testkey.avbpubkey",
6648 private_key: "testkey.pem",
6649 }
6650
Jiyong Park127b40b2019-09-30 16:04:35 +09006651 cc_library {
6652 name: "libfoo",
6653 stl: "none",
6654 shared_libs: ["libbar"],
6655 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006656 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006657 }
6658
6659 cc_library {
6660 name: "libbar",
6661 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006662 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006663 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006664 apex_available: ["myapex"],
6665 }
6666
6667 cc_library {
6668 name: "libbaz",
6669 stl: "none",
6670 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006671 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006672}
Jiyong Park127b40b2019-09-30 16:04:35 +09006673
Liz Kammer5f108fa2023-05-11 14:33:17 -04006674func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6675 testApex(t, `
6676 apex {
6677 name: "myapex",
6678 key: "myapex.key",
6679 native_shared_libs: ["libfoo"],
6680 updatable: false,
6681 }
6682
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
6688
6689 cc_library {
6690 name: "libfoo",
6691 stl: "none",
6692 static_libs: ["libbar"],
6693 system_shared_libs: [],
6694 apex_available: ["myapex"],
6695 }
6696
6697 cc_library {
6698 name: "libbar",
6699 stl: "none",
6700 shared_libs: ["libbaz"],
6701 system_shared_libs: [],
6702 apex_available: ["myapex"],
6703 }
6704
6705 cc_library {
6706 name: "libbaz",
6707 stl: "none",
6708 system_shared_libs: [],
6709 }`)
6710
6711 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6712 apex {
6713 name: "myapex",
6714 key: "myapex.key",
6715 native_shared_libs: ["libfoo"],
6716 updatable: false,
6717 }
6718
6719 apex_key {
6720 name: "myapex.key",
6721 public_key: "testkey.avbpubkey",
6722 private_key: "testkey.pem",
6723 }
6724
6725 cc_library {
6726 name: "libfoo",
6727 stl: "none",
6728 static_libs: ["libbar"],
6729 system_shared_libs: [],
6730 apex_available: ["myapex"],
6731 }
6732
6733 cc_library {
6734 name: "libbar",
6735 stl: "none",
6736 system_shared_libs: [],
6737 }`)
6738}
6739
Paul Duffine52e66f2020-03-30 17:54:29 +01006740func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006741 testApexError(t, "\"otherapex\" is not a valid module name", `
6742 apex {
6743 name: "myapex",
6744 key: "myapex.key",
6745 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006746 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006747 }
6748
6749 apex_key {
6750 name: "myapex.key",
6751 public_key: "testkey.avbpubkey",
6752 private_key: "testkey.pem",
6753 }
6754
6755 cc_library {
6756 name: "libfoo",
6757 stl: "none",
6758 system_shared_libs: [],
6759 apex_available: ["otherapex"],
6760 }`)
6761
Paul Duffine52e66f2020-03-30 17:54:29 +01006762 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006763 apex {
6764 name: "myapex",
6765 key: "myapex.key",
6766 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006767 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006768 }
6769
6770 apex_key {
6771 name: "myapex.key",
6772 public_key: "testkey.avbpubkey",
6773 private_key: "testkey.pem",
6774 }
6775
6776 cc_library {
6777 name: "libfoo",
6778 stl: "none",
6779 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006780 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006781 apex_available: ["myapex"],
6782 }
6783
6784 cc_library {
6785 name: "libbar",
6786 stl: "none",
6787 system_shared_libs: [],
6788 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006789 }
6790
6791 cc_library {
6792 name: "libbaz",
6793 stl: "none",
6794 system_shared_libs: [],
6795 stubs: {
6796 versions: ["10", "20", "30"],
6797 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006798 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006799}
Jiyong Park127b40b2019-09-30 16:04:35 +09006800
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006801func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6802 t.Run("negative variant_version produces error", func(t *testing.T) {
6803 testApexError(t, "expected an integer between 0-9; got -1", `
6804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
6807 apex_available_name: "com.android.foo",
6808 variant_version: "-1",
6809 updatable: false,
6810 }
6811 apex_key {
6812 name: "myapex.key",
6813 public_key: "testkey.avbpubkey",
6814 private_key: "testkey.pem",
6815 }
6816 `)
6817 })
6818
6819 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6820 testApexError(t, "expected an integer between 0-9; got 10", `
6821 apex {
6822 name: "myapex",
6823 key: "myapex.key",
6824 apex_available_name: "com.android.foo",
6825 variant_version: "10",
6826 updatable: false,
6827 }
6828 apex_key {
6829 name: "myapex.key",
6830 public_key: "testkey.avbpubkey",
6831 private_key: "testkey.pem",
6832 }
6833 `)
6834 })
6835}
6836
6837func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6838 context := android.GroupFixturePreparers(
6839 android.PrepareForIntegrationTestWithAndroid,
6840 PrepareForTestWithApexBuildComponents,
6841 android.FixtureMergeMockFs(android.MockFS{
6842 "system/sepolicy/apex/foo-file_contexts": nil,
6843 "system/sepolicy/apex/bar-file_contexts": nil,
6844 }),
6845 )
6846 result := context.RunTestWithBp(t, `
6847 apex {
6848 name: "foo",
6849 key: "myapex.key",
6850 apex_available_name: "com.android.foo",
6851 variant_version: "0",
6852 updatable: false,
6853 }
6854 apex {
6855 name: "bar",
6856 key: "myapex.key",
6857 apex_available_name: "com.android.foo",
6858 variant_version: "3",
6859 updatable: false,
6860 }
6861 apex_key {
6862 name: "myapex.key",
6863 public_key: "testkey.avbpubkey",
6864 private_key: "testkey.pem",
6865 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006866 override_apex {
6867 name: "myoverrideapex",
6868 base: "bar",
6869 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006870 `)
6871
Jooyung Hana0503a52023-08-23 13:12:50 +09006872 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006873 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6874 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6875 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6876 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6877 }
6878
Jooyung Hana0503a52023-08-23 13:12:50 +09006879 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006880 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6881 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6882 barActualDefaultVersion := barManifestRule.Args["default_version"]
6883 if barActualDefaultVersion != barExpectedDefaultVersion {
6884 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6885 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006886
Jooyung Hana0503a52023-08-23 13:12:50 +09006887 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006888 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6889 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6890 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6891 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006892}
6893
Sam Delmericoca816532023-06-02 14:09:50 -04006894func TestApexAvailable_ApexAvailableName(t *testing.T) {
6895 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6896 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6897 apex {
6898 name: "myapex_sminus",
6899 key: "myapex.key",
6900 apps: ["AppFoo"],
6901 apex_available_name: "myapex",
6902 updatable: false,
6903 }
6904 apex {
6905 name: "myapex",
6906 key: "myapex.key",
6907 apps: ["AppFoo"],
6908 updatable: false,
6909 }
6910 apex_key {
6911 name: "myapex.key",
6912 public_key: "testkey.avbpubkey",
6913 private_key: "testkey.pem",
6914 }
6915 android_app {
6916 name: "AppFoo",
6917 srcs: ["foo/bar/MyClass.java"],
6918 sdk_version: "none",
6919 system_modules: "none",
6920 apex_available: [ "myapex_sminus" ],
6921 }`,
6922 android.FixtureMergeMockFs(android.MockFS{
6923 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6924 }),
6925 )
6926 })
6927
6928 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6929 testApex(t, `
6930 apex {
6931 name: "myapex_sminus",
6932 key: "myapex.key",
6933 apps: ["AppFoo"],
6934 apex_available_name: "myapex",
6935 updatable: false,
6936 }
6937 apex {
6938 name: "myapex",
6939 key: "myapex.key",
6940 apps: ["AppFoo"],
6941 updatable: false,
6942 }
6943 apex_key {
6944 name: "myapex.key",
6945 public_key: "testkey.avbpubkey",
6946 private_key: "testkey.pem",
6947 }
6948 android_app {
6949 name: "AppFoo",
6950 srcs: ["foo/bar/MyClass.java"],
6951 sdk_version: "none",
6952 system_modules: "none",
6953 apex_available: [ "myapex" ],
6954 }`,
6955 android.FixtureMergeMockFs(android.MockFS{
6956 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6957 }),
6958 )
6959 })
6960
6961 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6962 testApex(t, `
6963 override_apex {
6964 name: "myoverrideapex_sminus",
6965 base: "myapex_sminus",
6966 key: "myapex.key",
6967 apps: ["AppFooOverride"],
6968 }
6969 override_apex {
6970 name: "myoverrideapex",
6971 base: "myapex",
6972 key: "myapex.key",
6973 apps: ["AppFooOverride"],
6974 }
6975 apex {
6976 name: "myapex_sminus",
6977 key: "myapex.key",
6978 apps: ["AppFoo"],
6979 apex_available_name: "myapex",
6980 updatable: false,
6981 }
6982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
6985 apps: ["AppFoo"],
6986 updatable: false,
6987 }
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993 android_app {
6994 name: "AppFooOverride",
6995 srcs: ["foo/bar/MyClass.java"],
6996 sdk_version: "none",
6997 system_modules: "none",
6998 apex_available: [ "myapex" ],
6999 }
7000 android_app {
7001 name: "AppFoo",
7002 srcs: ["foo/bar/MyClass.java"],
7003 sdk_version: "none",
7004 system_modules: "none",
7005 apex_available: [ "myapex" ],
7006 }`,
7007 android.FixtureMergeMockFs(android.MockFS{
7008 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7009 }),
7010 )
7011 })
7012}
7013
7014func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7015 context := android.GroupFixturePreparers(
7016 android.PrepareForIntegrationTestWithAndroid,
7017 PrepareForTestWithApexBuildComponents,
7018 java.PrepareForTestWithDexpreopt,
7019 android.FixtureMergeMockFs(android.MockFS{
7020 "system/sepolicy/apex/myapex-file_contexts": nil,
7021 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7022 }),
7023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7024 variables.BuildId = proptools.StringPtr("buildid")
7025 }),
7026 )
7027 context.RunTestWithBp(t, `
7028 override_apex {
7029 name: "myoverrideapex_sminus",
7030 base: "myapex_sminus",
7031 }
7032 override_apex {
7033 name: "myoverrideapex",
7034 base: "myapex",
7035 }
7036 apex {
7037 name: "myapex",
7038 key: "myapex.key",
7039 apps: ["AppFoo"],
7040 updatable: false,
7041 }
7042 apex {
7043 name: "myapex_sminus",
7044 apex_available_name: "myapex",
7045 key: "myapex.key",
7046 apps: ["AppFoo_sminus"],
7047 updatable: false,
7048 }
7049 apex_key {
7050 name: "myapex.key",
7051 public_key: "testkey.avbpubkey",
7052 private_key: "testkey.pem",
7053 }
7054 android_app {
7055 name: "AppFoo",
7056 srcs: ["foo/bar/MyClass.java"],
7057 sdk_version: "none",
7058 system_modules: "none",
7059 apex_available: [ "myapex" ],
7060 }
7061 android_app {
7062 name: "AppFoo_sminus",
7063 srcs: ["foo/bar/MyClass.java"],
7064 sdk_version: "none",
7065 min_sdk_version: "29",
7066 system_modules: "none",
7067 apex_available: [ "myapex" ],
7068 }`)
7069}
7070
Jiyong Park89e850a2020-04-07 16:37:39 +09007071func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007072 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007073 apex {
7074 name: "myapex",
7075 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007076 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007077 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007078 }
7079
7080 apex_key {
7081 name: "myapex.key",
7082 public_key: "testkey.avbpubkey",
7083 private_key: "testkey.pem",
7084 }
7085
7086 cc_library {
7087 name: "libfoo",
7088 stl: "none",
7089 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007090 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007091 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007092 }
7093
7094 cc_library {
7095 name: "libfoo2",
7096 stl: "none",
7097 system_shared_libs: [],
7098 shared_libs: ["libbaz"],
7099 apex_available: ["//apex_available:platform"],
7100 }
7101
7102 cc_library {
7103 name: "libbar",
7104 stl: "none",
7105 system_shared_libs: [],
7106 apex_available: ["myapex"],
7107 }
7108
7109 cc_library {
7110 name: "libbaz",
7111 stl: "none",
7112 system_shared_libs: [],
7113 apex_available: ["myapex"],
7114 stubs: {
7115 versions: ["1"],
7116 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007117 }`)
7118
Jiyong Park89e850a2020-04-07 16:37:39 +09007119 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7120 // because it depends on libbar which isn't available to platform
7121 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7122 if libfoo.NotAvailableForPlatform() != true {
7123 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7124 }
7125
7126 // libfoo2 however can be available to platform because it depends on libbaz which provides
7127 // stubs
7128 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7129 if libfoo2.NotAvailableForPlatform() == true {
7130 t.Errorf("%q should be available to platform", libfoo2.String())
7131 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007132}
Jiyong Parka90ca002019-10-07 15:47:24 +09007133
Paul Duffine52e66f2020-03-30 17:54:29 +01007134func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007135 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007136 apex {
7137 name: "myapex",
7138 key: "myapex.key",
7139 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007140 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007141 }
7142
7143 apex_key {
7144 name: "myapex.key",
7145 public_key: "testkey.avbpubkey",
7146 private_key: "testkey.pem",
7147 }
7148
7149 cc_library {
7150 name: "libfoo",
7151 stl: "none",
7152 system_shared_libs: [],
7153 apex_available: ["myapex"],
7154 static: {
7155 apex_available: ["//apex_available:platform"],
7156 },
7157 }`)
7158
Jiyong Park89e850a2020-04-07 16:37:39 +09007159 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7160 if libfooShared.NotAvailableForPlatform() != true {
7161 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7162 }
7163 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7164 if libfooStatic.NotAvailableForPlatform() != false {
7165 t.Errorf("%q should be available to platform", libfooStatic.String())
7166 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007167}
7168
Jiyong Park5d790c32019-11-15 18:40:32 +09007169func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007170 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007171 apex {
7172 name: "myapex",
7173 key: "myapex.key",
7174 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007175 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007176 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007177 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007178 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007179 }
7180
7181 override_apex {
7182 name: "override_myapex",
7183 base: "myapex",
7184 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007185 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007186 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007187 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007188 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007189 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007190 key: "mynewapex.key",
7191 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007192 }
7193
7194 apex_key {
7195 name: "myapex.key",
7196 public_key: "testkey.avbpubkey",
7197 private_key: "testkey.pem",
7198 }
7199
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007200 apex_key {
7201 name: "mynewapex.key",
7202 public_key: "testkey2.avbpubkey",
7203 private_key: "testkey2.pem",
7204 }
7205
7206 android_app_certificate {
7207 name: "myapex.certificate",
7208 certificate: "testkey",
7209 }
7210
Jiyong Park5d790c32019-11-15 18:40:32 +09007211 android_app {
7212 name: "app",
7213 srcs: ["foo/bar/MyClass.java"],
7214 package_name: "foo",
7215 sdk_version: "none",
7216 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007217 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007218 }
7219
7220 override_android_app {
7221 name: "override_app",
7222 base: "app",
7223 package_name: "bar",
7224 }
markchien7c803b82021-08-26 22:10:06 +08007225
7226 bpf {
7227 name: "bpf",
7228 srcs: ["bpf.c"],
7229 }
7230
7231 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007232 name: "overrideBpf",
7233 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007234 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007235
7236 prebuilt_etc {
7237 name: "myetc",
7238 src: "myprebuilt",
7239 }
7240
7241 prebuilt_etc {
7242 name: "override_myetc",
7243 src: "override_myprebuilt",
7244 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007245 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007246
Jooyung Hana0503a52023-08-23 13:12:50 +09007247 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7248 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007249 if originalVariant.GetOverriddenBy() != "" {
7250 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7251 }
7252 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7253 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7254 }
7255
Jooyung Hana0503a52023-08-23 13:12:50 +09007256 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007257 apexRule := module.Rule("apexRule")
7258 copyCmds := apexRule.Args["copy_commands"]
7259
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007260 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7261 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007262
markchien7c803b82021-08-26 22:10:06 +08007263 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007264 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007265
Daniel Norman5a3ce132021-08-26 15:44:43 -07007266 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7267 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7268
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007269 apexBundle := module.Module().(*apexBundle)
7270 name := apexBundle.Name()
7271 if name != "override_myapex" {
7272 t.Errorf("name should be \"override_myapex\", but was %q", name)
7273 }
7274
Baligh Uddin004d7172020-02-19 21:29:28 -08007275 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7276 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7277 }
7278
Jiyong Park20bacab2020-03-03 11:45:41 +09007279 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007280 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007281 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7282
7283 signApkRule := module.Rule("signapk")
7284 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007285
Colin Crossaa255532020-07-03 13:18:24 -07007286 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007287 var builder strings.Builder
7288 data.Custom(&builder, name, "TARGET_", "", data)
7289 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007290 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7291 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007292 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007293 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007294 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007295 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007296 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007297 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007298}
7299
Albert Martineefabcf2022-03-21 20:11:16 +00007300func TestMinSdkVersionOverride(t *testing.T) {
7301 // Override from 29 to 31
7302 minSdkOverride31 := "31"
7303 ctx := testApex(t, `
7304 apex {
7305 name: "myapex",
7306 key: "myapex.key",
7307 native_shared_libs: ["mylib"],
7308 updatable: true,
7309 min_sdk_version: "29"
7310 }
7311
7312 override_apex {
7313 name: "override_myapex",
7314 base: "myapex",
7315 logging_parent: "com.foo.bar",
7316 package_name: "test.overridden.package"
7317 }
7318
7319 apex_key {
7320 name: "myapex.key",
7321 public_key: "testkey.avbpubkey",
7322 private_key: "testkey.pem",
7323 }
7324
7325 cc_library {
7326 name: "mylib",
7327 srcs: ["mylib.cpp"],
7328 runtime_libs: ["libbar"],
7329 system_shared_libs: [],
7330 stl: "none",
7331 apex_available: [ "myapex" ],
7332 min_sdk_version: "apex_inherit"
7333 }
7334
7335 cc_library {
7336 name: "libbar",
7337 srcs: ["mylib.cpp"],
7338 system_shared_libs: [],
7339 stl: "none",
7340 apex_available: [ "myapex" ],
7341 min_sdk_version: "apex_inherit"
7342 }
7343
7344 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7345
Jooyung Hana0503a52023-08-23 13:12:50 +09007346 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007347 copyCmds := apexRule.Args["copy_commands"]
7348
7349 // Ensure that direct non-stubs dep is always included
7350 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7351
7352 // Ensure that runtime_libs dep in included
7353 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7354
7355 // Ensure libraries target overridden min_sdk_version value
7356 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7357}
7358
7359func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7360 // Attempt to override from 31 to 29, should be a NOOP
7361 minSdkOverride29 := "29"
7362 ctx := testApex(t, `
7363 apex {
7364 name: "myapex",
7365 key: "myapex.key",
7366 native_shared_libs: ["mylib"],
7367 updatable: true,
7368 min_sdk_version: "31"
7369 }
7370
7371 override_apex {
7372 name: "override_myapex",
7373 base: "myapex",
7374 logging_parent: "com.foo.bar",
7375 package_name: "test.overridden.package"
7376 }
7377
7378 apex_key {
7379 name: "myapex.key",
7380 public_key: "testkey.avbpubkey",
7381 private_key: "testkey.pem",
7382 }
7383
7384 cc_library {
7385 name: "mylib",
7386 srcs: ["mylib.cpp"],
7387 runtime_libs: ["libbar"],
7388 system_shared_libs: [],
7389 stl: "none",
7390 apex_available: [ "myapex" ],
7391 min_sdk_version: "apex_inherit"
7392 }
7393
7394 cc_library {
7395 name: "libbar",
7396 srcs: ["mylib.cpp"],
7397 system_shared_libs: [],
7398 stl: "none",
7399 apex_available: [ "myapex" ],
7400 min_sdk_version: "apex_inherit"
7401 }
7402
7403 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7404
Jooyung Hana0503a52023-08-23 13:12:50 +09007405 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007406 copyCmds := apexRule.Args["copy_commands"]
7407
7408 // Ensure that direct non-stubs dep is always included
7409 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7410
7411 // Ensure that runtime_libs dep in included
7412 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7413
7414 // Ensure libraries target the original min_sdk_version value rather than the overridden
7415 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7416}
7417
Jooyung Han214bf372019-11-12 13:03:50 +09007418func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007419 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007420 apex {
7421 name: "myapex",
7422 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007423 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007424 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007425 }
7426
7427 apex_key {
7428 name: "myapex.key",
7429 public_key: "testkey.avbpubkey",
7430 private_key: "testkey.pem",
7431 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007432
7433 cc_library {
7434 name: "mylib",
7435 srcs: ["mylib.cpp"],
7436 stl: "libc++",
7437 system_shared_libs: [],
7438 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007439 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007440 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007441 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007442
Jooyung Hana0503a52023-08-23 13:12:50 +09007443 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007444 args := module.Rule("apexRule").Args
7445 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007446 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007447
7448 // The copies of the libraries in the apex should have one more dependency than
7449 // the ones outside the apex, namely the unwinder. Ideally we should check
7450 // the dependency names directly here but for some reason the names are blank in
7451 // this test.
7452 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007453 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007454 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7455 if len(apexImplicits) != len(nonApexImplicits)+1 {
7456 t.Errorf("%q missing unwinder dep", lib)
7457 }
7458 }
Jooyung Han214bf372019-11-12 13:03:50 +09007459}
7460
Paul Duffine05480a2021-03-08 15:07:14 +00007461var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007462 "api/current.txt": nil,
7463 "api/removed.txt": nil,
7464 "api/system-current.txt": nil,
7465 "api/system-removed.txt": nil,
7466 "api/test-current.txt": nil,
7467 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007468
Anton Hanssondff2c782020-12-21 17:10:01 +00007469 "100/public/api/foo.txt": nil,
7470 "100/public/api/foo-removed.txt": nil,
7471 "100/system/api/foo.txt": nil,
7472 "100/system/api/foo-removed.txt": nil,
7473
Paul Duffineedc5d52020-06-12 17:46:39 +01007474 // For java_sdk_library_import
7475 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007476}
7477
Jooyung Han58f26ab2019-12-18 15:34:32 +09007478func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007479 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007480 apex {
7481 name: "myapex",
7482 key: "myapex.key",
7483 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007484 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007485 }
7486
7487 apex_key {
7488 name: "myapex.key",
7489 public_key: "testkey.avbpubkey",
7490 private_key: "testkey.pem",
7491 }
7492
7493 java_sdk_library {
7494 name: "foo",
7495 srcs: ["a.java"],
7496 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007497 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007498 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007499
7500 prebuilt_apis {
7501 name: "sdk",
7502 api_dirs: ["100"],
7503 }
Paul Duffin9b879592020-05-26 13:21:35 +01007504 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007505
7506 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007507 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007508 "javalib/foo.jar",
7509 "etc/permissions/foo.xml",
7510 })
7511 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007512 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007513 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 +09007514}
7515
Paul Duffin9b879592020-05-26 13:21:35 +01007516func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007517 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007518 apex {
7519 name: "myapex",
7520 key: "myapex.key",
7521 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007522 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007523 }
7524
7525 apex_key {
7526 name: "myapex.key",
7527 public_key: "testkey.avbpubkey",
7528 private_key: "testkey.pem",
7529 }
7530
7531 java_sdk_library {
7532 name: "foo",
7533 srcs: ["a.java"],
7534 api_packages: ["foo"],
7535 apex_available: ["myapex"],
7536 sdk_version: "none",
7537 system_modules: "none",
7538 }
7539
7540 java_library {
7541 name: "bar",
7542 srcs: ["a.java"],
7543 libs: ["foo"],
7544 apex_available: ["myapex"],
7545 sdk_version: "none",
7546 system_modules: "none",
7547 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007548
7549 prebuilt_apis {
7550 name: "sdk",
7551 api_dirs: ["100"],
7552 }
Paul Duffin9b879592020-05-26 13:21:35 +01007553 `, withFiles(filesForSdkLibrary))
7554
7555 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007556 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007557 "javalib/bar.jar",
7558 "javalib/foo.jar",
7559 "etc/permissions/foo.xml",
7560 })
7561
7562 // The bar library should depend on the implementation jar.
7563 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007564 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007565 t.Errorf("expected %q, found %#q", expected, actual)
7566 }
7567}
7568
7569func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007570 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007571 apex {
7572 name: "myapex",
7573 key: "myapex.key",
7574 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007575 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007576 }
7577
7578 apex_key {
7579 name: "myapex.key",
7580 public_key: "testkey.avbpubkey",
7581 private_key: "testkey.pem",
7582 }
7583
7584 java_sdk_library {
7585 name: "foo",
7586 srcs: ["a.java"],
7587 api_packages: ["foo"],
7588 apex_available: ["myapex"],
7589 sdk_version: "none",
7590 system_modules: "none",
7591 }
7592
7593 java_library {
7594 name: "bar",
7595 srcs: ["a.java"],
7596 libs: ["foo"],
7597 sdk_version: "none",
7598 system_modules: "none",
7599 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007600
7601 prebuilt_apis {
7602 name: "sdk",
7603 api_dirs: ["100"],
7604 }
Paul Duffin9b879592020-05-26 13:21:35 +01007605 `, withFiles(filesForSdkLibrary))
7606
7607 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007608 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007609 "javalib/foo.jar",
7610 "etc/permissions/foo.xml",
7611 })
7612
7613 // The bar library should depend on the stubs jar.
7614 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007615 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007616 t.Errorf("expected %q, found %#q", expected, actual)
7617 }
7618}
7619
Paul Duffineedc5d52020-06-12 17:46:39 +01007620func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007621 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007622 prebuilt_apis {
7623 name: "sdk",
7624 api_dirs: ["100"],
7625 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007626 withFiles(map[string][]byte{
7627 "apex/a.java": nil,
7628 "apex/apex_manifest.json": nil,
7629 "apex/Android.bp": []byte(`
7630 package {
7631 default_visibility: ["//visibility:private"],
7632 }
7633
7634 apex {
7635 name: "myapex",
7636 key: "myapex.key",
7637 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007638 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007639 }
7640
7641 apex_key {
7642 name: "myapex.key",
7643 public_key: "testkey.avbpubkey",
7644 private_key: "testkey.pem",
7645 }
7646
7647 java_library {
7648 name: "bar",
7649 srcs: ["a.java"],
7650 libs: ["foo"],
7651 apex_available: ["myapex"],
7652 sdk_version: "none",
7653 system_modules: "none",
7654 }
7655`),
7656 "source/a.java": nil,
7657 "source/api/current.txt": nil,
7658 "source/api/removed.txt": nil,
7659 "source/Android.bp": []byte(`
7660 package {
7661 default_visibility: ["//visibility:private"],
7662 }
7663
7664 java_sdk_library {
7665 name: "foo",
7666 visibility: ["//apex"],
7667 srcs: ["a.java"],
7668 api_packages: ["foo"],
7669 apex_available: ["myapex"],
7670 sdk_version: "none",
7671 system_modules: "none",
7672 public: {
7673 enabled: true,
7674 },
7675 }
7676`),
7677 "prebuilt/a.jar": nil,
7678 "prebuilt/Android.bp": []byte(`
7679 package {
7680 default_visibility: ["//visibility:private"],
7681 }
7682
7683 java_sdk_library_import {
7684 name: "foo",
7685 visibility: ["//apex", "//source"],
7686 apex_available: ["myapex"],
7687 prefer: true,
7688 public: {
7689 jars: ["a.jar"],
7690 },
7691 }
7692`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007693 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007694 )
7695
7696 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007697 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007698 "javalib/bar.jar",
7699 "javalib/foo.jar",
7700 "etc/permissions/foo.xml",
7701 })
7702
7703 // The bar library should depend on the implementation jar.
7704 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007705 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007706 t.Errorf("expected %q, found %#q", expected, actual)
7707 }
7708}
7709
7710func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7711 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7712 apex {
7713 name: "myapex",
7714 key: "myapex.key",
7715 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007716 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007717 }
7718
7719 apex_key {
7720 name: "myapex.key",
7721 public_key: "testkey.avbpubkey",
7722 private_key: "testkey.pem",
7723 }
7724
7725 java_sdk_library_import {
7726 name: "foo",
7727 apex_available: ["myapex"],
7728 prefer: true,
7729 public: {
7730 jars: ["a.jar"],
7731 },
7732 }
7733
7734 `, withFiles(filesForSdkLibrary))
7735}
7736
atrost6e126252020-01-27 17:01:16 +00007737func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007738 result := android.GroupFixturePreparers(
7739 prepareForApexTest,
7740 java.PrepareForTestWithPlatformCompatConfig,
7741 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007742 apex {
7743 name: "myapex",
7744 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007745 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007746 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007747 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007748 }
7749
7750 apex_key {
7751 name: "myapex.key",
7752 public_key: "testkey.avbpubkey",
7753 private_key: "testkey.pem",
7754 }
7755
7756 platform_compat_config {
7757 name: "myjar-platform-compat-config",
7758 src: ":myjar",
7759 }
7760
7761 java_library {
7762 name: "myjar",
7763 srcs: ["foo/bar/MyClass.java"],
7764 sdk_version: "none",
7765 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007766 apex_available: [ "myapex" ],
7767 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007768
7769 // Make sure that a preferred prebuilt does not affect the apex contents.
7770 prebuilt_platform_compat_config {
7771 name: "myjar-platform-compat-config",
7772 metadata: "compat-config/metadata.xml",
7773 prefer: true,
7774 }
atrost6e126252020-01-27 17:01:16 +00007775 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007776 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007777 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007778 "etc/compatconfig/myjar-platform-compat-config.xml",
7779 "javalib/myjar.jar",
7780 })
7781}
7782
Jooyung Han862c0d62022-12-21 10:15:37 +09007783func TestNoDupeApexFiles(t *testing.T) {
7784 android.GroupFixturePreparers(
7785 android.PrepareForTestWithAndroidBuildComponents,
7786 PrepareForTestWithApexBuildComponents,
7787 prepareForTestWithMyapex,
7788 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7789 ).
7790 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7791 RunTestWithBp(t, `
7792 apex {
7793 name: "myapex",
7794 key: "myapex.key",
7795 prebuilts: ["foo", "bar"],
7796 updatable: false,
7797 }
7798
7799 apex_key {
7800 name: "myapex.key",
7801 public_key: "testkey.avbpubkey",
7802 private_key: "testkey.pem",
7803 }
7804
7805 prebuilt_etc {
7806 name: "foo",
7807 src: "myprebuilt",
7808 filename_from_src: true,
7809 }
7810
7811 prebuilt_etc {
7812 name: "bar",
7813 src: "myprebuilt",
7814 filename_from_src: true,
7815 }
7816 `)
7817}
7818
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007819func TestApexUnwantedTransitiveDeps(t *testing.T) {
7820 bp := `
7821 apex {
7822 name: "myapex",
7823 key: "myapex.key",
7824 native_shared_libs: ["libfoo"],
7825 updatable: false,
7826 unwanted_transitive_deps: ["libbar"],
7827 }
7828
7829 apex_key {
7830 name: "myapex.key",
7831 public_key: "testkey.avbpubkey",
7832 private_key: "testkey.pem",
7833 }
7834
7835 cc_library {
7836 name: "libfoo",
7837 srcs: ["foo.cpp"],
7838 shared_libs: ["libbar"],
7839 apex_available: ["myapex"],
7840 }
7841
7842 cc_library {
7843 name: "libbar",
7844 srcs: ["bar.cpp"],
7845 apex_available: ["myapex"],
7846 }`
7847 ctx := testApex(t, bp)
7848 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7849 "*/libc++.so",
7850 "*/libfoo.so",
7851 // not libbar.so
7852 })
7853}
7854
Jiyong Park479321d2019-12-16 11:47:12 +09007855func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7856 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7857 apex {
7858 name: "myapex",
7859 key: "myapex.key",
7860 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007861 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007862 }
7863
7864 apex_key {
7865 name: "myapex.key",
7866 public_key: "testkey.avbpubkey",
7867 private_key: "testkey.pem",
7868 }
7869
7870 java_library {
7871 name: "myjar",
7872 srcs: ["foo/bar/MyClass.java"],
7873 sdk_version: "none",
7874 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007875 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007876 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007877 }
7878 `)
7879}
7880
Jiyong Park7afd1072019-12-30 16:56:33 +09007881func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007882 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007883 apex {
7884 name: "myapex",
7885 key: "myapex.key",
7886 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007887 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007888 }
7889
7890 apex_key {
7891 name: "myapex.key",
7892 public_key: "testkey.avbpubkey",
7893 private_key: "testkey.pem",
7894 }
7895
7896 cc_library {
7897 name: "mylib",
7898 srcs: ["mylib.cpp"],
7899 system_shared_libs: [],
7900 stl: "none",
7901 required: ["a", "b"],
7902 host_required: ["c", "d"],
7903 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007904 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007905 }
7906 `)
7907
Jooyung Hana0503a52023-08-23 13:12:50 +09007908 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007909 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007910 name := apexBundle.BaseModuleName()
7911 prefix := "TARGET_"
7912 var builder strings.Builder
7913 data.Custom(&builder, name, prefix, "", data)
7914 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007915 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007916 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7917 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007918}
7919
Jiyong Park7cd10e32020-01-14 09:22:18 +09007920func TestSymlinksFromApexToSystem(t *testing.T) {
7921 bp := `
7922 apex {
7923 name: "myapex",
7924 key: "myapex.key",
7925 native_shared_libs: ["mylib"],
7926 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007927 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007928 }
7929
Jiyong Park9d677202020-02-19 16:29:35 +09007930 apex {
7931 name: "myapex.updatable",
7932 key: "myapex.key",
7933 native_shared_libs: ["mylib"],
7934 java_libs: ["myjar"],
7935 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007936 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007937 }
7938
Jiyong Park7cd10e32020-01-14 09:22:18 +09007939 apex_key {
7940 name: "myapex.key",
7941 public_key: "testkey.avbpubkey",
7942 private_key: "testkey.pem",
7943 }
7944
7945 cc_library {
7946 name: "mylib",
7947 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007948 shared_libs: [
7949 "myotherlib",
7950 "myotherlib_ext",
7951 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007952 system_shared_libs: [],
7953 stl: "none",
7954 apex_available: [
7955 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007956 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007957 "//apex_available:platform",
7958 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007959 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007960 }
7961
7962 cc_library {
7963 name: "myotherlib",
7964 srcs: ["mylib.cpp"],
7965 system_shared_libs: [],
7966 stl: "none",
7967 apex_available: [
7968 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007969 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007970 "//apex_available:platform",
7971 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007972 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007973 }
7974
Jiyong Parkce243632023-02-17 18:22:25 +09007975 cc_library {
7976 name: "myotherlib_ext",
7977 srcs: ["mylib.cpp"],
7978 system_shared_libs: [],
7979 system_ext_specific: true,
7980 stl: "none",
7981 apex_available: [
7982 "myapex",
7983 "myapex.updatable",
7984 "//apex_available:platform",
7985 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007986 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007987 }
7988
Jiyong Park7cd10e32020-01-14 09:22:18 +09007989 java_library {
7990 name: "myjar",
7991 srcs: ["foo/bar/MyClass.java"],
7992 sdk_version: "none",
7993 system_modules: "none",
7994 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 apex_available: [
7996 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007997 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007998 "//apex_available:platform",
7999 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008000 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008001 }
8002
8003 java_library {
8004 name: "myotherjar",
8005 srcs: ["foo/bar/MyClass.java"],
8006 sdk_version: "none",
8007 system_modules: "none",
8008 apex_available: [
8009 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008010 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008011 "//apex_available:platform",
8012 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008013 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 }
8015 `
8016
8017 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8018 for _, f := range files {
8019 if f.path == file {
8020 if f.isLink {
8021 t.Errorf("%q is not a real file", file)
8022 }
8023 return
8024 }
8025 }
8026 t.Errorf("%q is not found", file)
8027 }
8028
Jiyong Parkce243632023-02-17 18:22:25 +09008029 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008030 for _, f := range files {
8031 if f.path == file {
8032 if !f.isLink {
8033 t.Errorf("%q is not a symlink", file)
8034 }
Jiyong Parkce243632023-02-17 18:22:25 +09008035 if f.src != target {
8036 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8037 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008038 return
8039 }
8040 }
8041 t.Errorf("%q is not found", file)
8042 }
8043
Jiyong Park9d677202020-02-19 16:29:35 +09008044 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8045 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008046 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008047 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008048 ensureRealfileExists(t, files, "javalib/myjar.jar")
8049 ensureRealfileExists(t, files, "lib64/mylib.so")
8050 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008051 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008052
Jooyung Hana0503a52023-08-23 13:12:50 +09008053 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008054 ensureRealfileExists(t, files, "javalib/myjar.jar")
8055 ensureRealfileExists(t, files, "lib64/mylib.so")
8056 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008057 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008058
8059 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008060 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008061 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008062 ensureRealfileExists(t, files, "javalib/myjar.jar")
8063 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008064 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8065 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008066
Jooyung Hana0503a52023-08-23 13:12:50 +09008067 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008068 ensureRealfileExists(t, files, "javalib/myjar.jar")
8069 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008070 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8071 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008072}
8073
Yo Chiange8128052020-07-23 20:09:18 +08008074func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008075 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008076 apex {
8077 name: "myapex",
8078 key: "myapex.key",
8079 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008080 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008081 }
8082
8083 apex_key {
8084 name: "myapex.key",
8085 public_key: "testkey.avbpubkey",
8086 private_key: "testkey.pem",
8087 }
8088
8089 cc_library_shared {
8090 name: "mylib",
8091 srcs: ["mylib.cpp"],
8092 shared_libs: ["myotherlib"],
8093 system_shared_libs: [],
8094 stl: "none",
8095 apex_available: [
8096 "myapex",
8097 "//apex_available:platform",
8098 ],
8099 }
8100
8101 cc_prebuilt_library_shared {
8102 name: "myotherlib",
8103 srcs: ["prebuilt.so"],
8104 system_shared_libs: [],
8105 stl: "none",
8106 apex_available: [
8107 "myapex",
8108 "//apex_available:platform",
8109 ],
8110 }
8111 `)
8112
Jooyung Hana0503a52023-08-23 13:12:50 +09008113 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008114 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008115 var builder strings.Builder
8116 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8117 androidMk := builder.String()
8118 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008119 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008120 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8121 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8122 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008123 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008124}
8125
Jooyung Han643adc42020-02-27 13:50:06 +09008126func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008127 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008128 apex {
8129 name: "myapex",
8130 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008131 binaries: ["mybin"],
8132 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008133 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008134 }
8135
8136 apex_key {
8137 name: "myapex.key",
8138 public_key: "testkey.avbpubkey",
8139 private_key: "testkey.pem",
8140 }
8141
8142 cc_library {
8143 name: "mylib",
8144 srcs: ["mylib.cpp"],
8145 shared_libs: ["mylib2"],
8146 system_shared_libs: [],
8147 stl: "none",
8148 apex_available: [ "myapex" ],
8149 }
8150
8151 cc_library {
8152 name: "mylib2",
8153 srcs: ["mylib.cpp"],
8154 system_shared_libs: [],
8155 stl: "none",
8156 apex_available: [ "myapex" ],
8157 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008158
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008159 // Used as both a JNI library and a regular shared library.
8160 cc_library {
8161 name: "mylib3",
8162 srcs: ["mylib.cpp"],
8163 system_shared_libs: [],
8164 stl: "none",
8165 apex_available: [ "myapex" ],
8166 }
8167
8168 cc_binary {
8169 name: "mybin",
8170 srcs: ["mybin.cpp"],
8171 shared_libs: ["mylib3"],
8172 system_shared_libs: [],
8173 stl: "none",
8174 apex_available: [ "myapex" ],
8175 }
8176
Jiyong Park34d5c332022-02-24 18:02:44 +09008177 rust_ffi_shared {
8178 name: "libfoo.rust",
8179 crate_name: "foo",
8180 srcs: ["foo.rs"],
8181 shared_libs: ["libfoo.shared_from_rust"],
8182 prefer_rlib: true,
8183 apex_available: ["myapex"],
8184 }
8185
8186 cc_library_shared {
8187 name: "libfoo.shared_from_rust",
8188 srcs: ["mylib.cpp"],
8189 system_shared_libs: [],
8190 stl: "none",
8191 stubs: {
8192 versions: ["10", "11", "12"],
8193 },
8194 }
8195
Jooyung Han643adc42020-02-27 13:50:06 +09008196 `)
8197
Jooyung Hana0503a52023-08-23 13:12:50 +09008198 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008199 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008200 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008201 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008202 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008203 "lib64/mylib.so",
8204 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008205 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008206 "lib64/libfoo.rust.so",
8207 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8208 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008209 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008210
8211 // b/220397949
8212 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008213}
8214
Jooyung Han49f67012020-04-17 13:43:10 +09008215func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008216 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008217 apex {
8218 name: "myapex",
8219 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008220 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008221 }
8222 apex_key {
8223 name: "myapex.key",
8224 public_key: "testkey.avbpubkey",
8225 private_key: "testkey.pem",
8226 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008227 `,
8228 android.FixtureModifyConfig(func(config android.Config) {
8229 delete(config.Targets, android.Android)
8230 config.AndroidCommonTarget = android.Target{}
8231 }),
8232 )
Jooyung Han49f67012020-04-17 13:43:10 +09008233
8234 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8235 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8236 }
8237}
8238
Jiyong Parkbd159612020-02-28 15:22:21 +09008239func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008240 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008241 apex {
8242 name: "myapex",
8243 key: "myapex.key",
8244 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008245 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008246 }
8247
8248 apex_key {
8249 name: "myapex.key",
8250 public_key: "testkey.avbpubkey",
8251 private_key: "testkey.pem",
8252 }
8253
8254 android_app {
8255 name: "AppFoo",
8256 srcs: ["foo/bar/MyClass.java"],
8257 sdk_version: "none",
8258 system_modules: "none",
8259 apex_available: [ "myapex" ],
8260 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008261 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008262
Jooyung Hana0503a52023-08-23 13:12:50 +09008263 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008264 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008265
8266 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008267 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 +09008268}
8269
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008270func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008271 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008272 apex {
8273 name: "myapex",
8274 key: "myapex.key",
8275 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008276 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008277 }
8278
8279 apex_key {
8280 name: "myapex.key",
8281 public_key: "testkey.avbpubkey",
8282 private_key: "testkey.pem",
8283 }
8284
8285 android_app_set {
8286 name: "AppSet",
8287 set: "AppSet.apks",
8288 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008289 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008290 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008291 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008292 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8293 s := mod.Rule("apexRule").Args["copy_commands"]
8294 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008295 if len(copyCmds) != 4 {
8296 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008297 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008298 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8299 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008300 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8301 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008302
8303 // Ensure that canned_fs_config has an entry for the app set zip file
8304 generateFsRule := mod.Rule("generateFsConfig")
8305 cmd := generateFsRule.RuleParams.Command
8306 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008307}
8308
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008309func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008310 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008311 apex_set {
8312 name: "myapex",
8313 filename: "foo_v2.apex",
8314 sanitized: {
8315 none: { set: "myapex.apks", },
8316 hwaddress: { set: "myapex.hwasan.apks", },
8317 },
Paul Duffin24704672021-04-06 16:09:30 +01008318 }
8319 `
8320 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008321
Paul Duffin24704672021-04-06 16:09:30 +01008322 // Check that the extractor produces the correct output file from the correct input file.
8323 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008324
Paul Duffin24704672021-04-06 16:09:30 +01008325 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8326 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008327
Paul Duffin24704672021-04-06 16:09:30 +01008328 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8329
8330 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008331 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8332 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008333
8334 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008335}
8336
Pranav Guptaeba03b02022-09-27 00:27:08 +00008337func TestApexSetApksModuleAssignment(t *testing.T) {
8338 ctx := testApex(t, `
8339 apex_set {
8340 name: "myapex",
8341 set: ":myapex_apks_file",
8342 }
8343
8344 filegroup {
8345 name: "myapex_apks_file",
8346 srcs: ["myapex.apks"],
8347 }
8348 `)
8349
8350 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8351
8352 // Check that the extractor produces the correct apks file from the input module
8353 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8354 extractedApex := m.Output(extractorOutput)
8355
8356 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8357}
8358
Paul Duffin89f570a2021-06-16 01:42:33 +01008359func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008360 t.Helper()
8361
Paul Duffin55607122021-03-30 23:32:51 +01008362 fs := android.MockFS{
8363 "a.java": nil,
8364 "a.jar": nil,
8365 "apex_manifest.json": nil,
8366 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008367 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008368 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8369 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8370 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008371 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008372 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008373
Paul Duffin55607122021-03-30 23:32:51 +01008374 errorHandler := android.FixtureExpectsNoErrors
8375 if errmsg != "" {
8376 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008377 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008378
Paul Duffin55607122021-03-30 23:32:51 +01008379 result := android.GroupFixturePreparers(
8380 cc.PrepareForTestWithCcDefaultModules,
8381 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008382 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008383 java.PrepareForTestWithJavaSdkLibraryFiles,
8384 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008385 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008386 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008387 android.FixtureModifyMockFS(func(fs android.MockFS) {
8388 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8389 insert := ""
8390 for _, fragment := range fragments {
8391 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8392 }
8393 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8394 platform_bootclasspath {
8395 name: "platform-bootclasspath",
8396 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008397 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008398 %s
8399 ],
8400 }
8401 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008402 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008403 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008404 // Dexpreopt for boot jars requires the ART boot image profile.
8405 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8406 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008407 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008408 ).
8409 ExtendWithErrorHandler(errorHandler).
8410 RunTestWithBp(t, bp)
8411
8412 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008413}
8414
Paul Duffin5556c5f2022-06-09 17:32:21 +00008415func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008416 preparers := android.GroupFixturePreparers(
8417 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008418 prepareForTestWithBootclasspathFragment,
8419 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008420 PrepareForTestWithApexBuildComponents,
8421 ).
8422 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das5be63332023-12-13 00:06:32 +00008423 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.art and com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008424
8425 bpBase := `
8426 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008427 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008428 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008429 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008430 set: "myapex.apks",
8431 }
8432
8433 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008434 name: "com.mycompany.android.art",
8435 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008436 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008437 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008438 set: "company-myapex.apks",
8439 }
8440
8441 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008442 name: "art-bootclasspath-fragment",
8443 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008444 hidden_api: {
8445 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8446 metadata: "my-bootclasspath-fragment/metadata.csv",
8447 index: "my-bootclasspath-fragment/index.csv",
8448 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8449 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8450 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008451 %s
8452 }
8453 `
8454
8455 t.Run("java_import", func(t *testing.T) {
8456 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8457 java_import {
8458 name: "libfoo",
8459 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008460 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008461 }
8462 `)
8463 })
8464
8465 t.Run("java_sdk_library_import", func(t *testing.T) {
8466 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8467 java_sdk_library_import {
8468 name: "libfoo",
8469 public: {
8470 jars: ["libbar.jar"],
8471 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008472 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008473 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008474 }
8475 `)
8476 })
8477
8478 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8479 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8480 image_name: "art",
8481 contents: ["libfoo"],
8482 `)+`
8483 java_sdk_library_import {
8484 name: "libfoo",
8485 public: {
8486 jars: ["libbar.jar"],
8487 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008488 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008489 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008490 }
8491 `)
8492 })
8493}
8494
Paul Duffin5556c5f2022-06-09 17:32:21 +00008495func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8496 preparers := android.GroupFixturePreparers(
8497 java.PrepareForTestWithJavaDefaultModules,
8498 PrepareForTestWithApexBuildComponents,
8499 )
8500
Spandan Das59a4a2b2024-01-09 21:35:56 +00008501 errCtx := moduleErrorfTestCtx{}
8502
Paul Duffin5556c5f2022-06-09 17:32:21 +00008503 bpBase := `
8504 apex_set {
8505 name: "com.android.myapex",
8506 installable: true,
8507 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8508 set: "myapex.apks",
8509 }
8510
8511 apex_set {
8512 name: "com.android.myapex_compressed",
8513 apex_name: "com.android.myapex",
8514 installable: true,
8515 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8516 set: "myapex_compressed.apks",
8517 }
8518
8519 prebuilt_bootclasspath_fragment {
8520 name: "my-bootclasspath-fragment",
8521 apex_available: [
8522 "com.android.myapex",
8523 "com.android.myapex_compressed",
8524 ],
8525 hidden_api: {
8526 annotation_flags: "annotation-flags.csv",
8527 metadata: "metadata.csv",
8528 index: "index.csv",
8529 signature_patterns: "signature_patterns.csv",
8530 },
8531 %s
8532 }
8533 `
8534
8535 t.Run("java_import", func(t *testing.T) {
8536 result := preparers.RunTestWithBp(t,
8537 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8538 java_import {
8539 name: "libfoo",
8540 jars: ["libfoo.jar"],
8541 apex_available: [
8542 "com.android.myapex",
8543 "com.android.myapex_compressed",
8544 ],
8545 }
8546 `)
8547
8548 module := result.Module("libfoo", "android_common_com.android.myapex")
8549 usesLibraryDep := module.(java.UsesLibraryDependency)
8550 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8551 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008552 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008553 })
8554
8555 t.Run("java_sdk_library_import", func(t *testing.T) {
8556 result := preparers.RunTestWithBp(t,
8557 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8558 java_sdk_library_import {
8559 name: "libfoo",
8560 public: {
8561 jars: ["libbar.jar"],
8562 },
8563 apex_available: [
8564 "com.android.myapex",
8565 "com.android.myapex_compressed",
8566 ],
8567 compile_dex: true,
8568 }
8569 `)
8570
8571 module := result.Module("libfoo", "android_common_com.android.myapex")
8572 usesLibraryDep := module.(java.UsesLibraryDependency)
8573 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8574 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008575 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008576 })
8577
8578 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8579 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8580 image_name: "art",
8581 contents: ["libfoo"],
8582 `)+`
8583 java_sdk_library_import {
8584 name: "libfoo",
8585 public: {
8586 jars: ["libbar.jar"],
8587 },
8588 apex_available: [
8589 "com.android.myapex",
8590 "com.android.myapex_compressed",
8591 ],
8592 compile_dex: true,
8593 }
8594 `)
8595 })
8596}
8597
Jooyung Han548640b2020-04-27 12:10:30 +09008598func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8599 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8600 apex {
8601 name: "myapex",
8602 key: "myapex.key",
8603 updatable: true,
8604 }
8605
8606 apex_key {
8607 name: "myapex.key",
8608 public_key: "testkey.avbpubkey",
8609 private_key: "testkey.pem",
8610 }
8611 `)
8612}
8613
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008614func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8615 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8616 apex {
8617 name: "myapex",
8618 key: "myapex.key",
8619 }
8620
8621 apex_key {
8622 name: "myapex.key",
8623 public_key: "testkey.avbpubkey",
8624 private_key: "testkey.pem",
8625 }
8626 `)
8627}
8628
Jooyung Handfc864c2023-03-20 18:19:07 +09008629func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8630 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008631 apex {
8632 name: "myapex",
8633 key: "myapex.key",
8634 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008635 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008636 soc_specific: true,
8637 }
8638
8639 apex_key {
8640 name: "myapex.key",
8641 public_key: "testkey.avbpubkey",
8642 private_key: "testkey.pem",
8643 }
8644 `)
8645}
8646
Jooyung Han02873da2023-03-22 17:41:03 +09008647func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8648 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8649 apex {
8650 name: "myapex",
8651 key: "myapex.key",
8652 updatable: false,
8653 min_sdk_version: "29",
8654 use_vndk_as_stable: true,
8655 vendor: true,
8656 }
8657
8658 apex_key {
8659 name: "myapex.key",
8660 public_key: "testkey.avbpubkey",
8661 private_key: "testkey.pem",
8662 }
8663 `)
8664}
8665
Jooyung Handfc864c2023-03-20 18:19:07 +09008666func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8667 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8668 apex {
8669 name: "myapex",
8670 key: "myapex.key",
8671 updatable: false,
8672 use_vndk_as_stable: true,
8673 }
8674
8675 apex_key {
8676 name: "myapex.key",
8677 public_key: "testkey.avbpubkey",
8678 private_key: "testkey.pem",
8679 }
8680 `)
8681}
8682
satayevb98371c2021-06-15 16:49:50 +01008683func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8684 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8685 apex {
8686 name: "myapex",
8687 key: "myapex.key",
8688 systemserverclasspath_fragments: [
8689 "mysystemserverclasspathfragment",
8690 ],
8691 min_sdk_version: "29",
8692 updatable: true,
8693 }
8694
8695 apex_key {
8696 name: "myapex.key",
8697 public_key: "testkey.avbpubkey",
8698 private_key: "testkey.pem",
8699 }
8700
8701 java_library {
8702 name: "foo",
8703 srcs: ["b.java"],
8704 min_sdk_version: "29",
8705 installable: true,
8706 apex_available: [
8707 "myapex",
8708 ],
8709 }
8710
8711 systemserverclasspath_fragment {
8712 name: "mysystemserverclasspathfragment",
8713 generate_classpaths_proto: false,
8714 contents: [
8715 "foo",
8716 ],
8717 apex_available: [
8718 "myapex",
8719 ],
8720 }
satayevabcd5972021-08-06 17:49:46 +01008721 `,
8722 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8723 )
satayevb98371c2021-06-15 16:49:50 +01008724}
8725
Paul Duffin064b70c2020-11-02 17:32:38 +00008726func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008727 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008728 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008729 fragment := java.ApexVariantReference{
8730 Apex: proptools.StringPtr("myapex"),
8731 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8732 }
8733
Paul Duffin064b70c2020-11-02 17:32:38 +00008734 testDexpreoptWithApexes(t, `
8735 prebuilt_apex {
8736 name: "myapex" ,
8737 arch: {
8738 arm64: {
8739 src: "myapex-arm64.apex",
8740 },
8741 arm: {
8742 src: "myapex-arm.apex",
8743 },
8744 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008745 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8746 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008747
Paul Duffin89f570a2021-06-16 01:42:33 +01008748 prebuilt_bootclasspath_fragment {
8749 name: "my-bootclasspath-fragment",
8750 contents: ["libfoo"],
8751 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008752 hidden_api: {
8753 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8754 metadata: "my-bootclasspath-fragment/metadata.csv",
8755 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008756 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8757 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8758 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008759 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008760 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008761
Paul Duffin89f570a2021-06-16 01:42:33 +01008762 java_import {
8763 name: "libfoo",
8764 jars: ["libfoo.jar"],
8765 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008766 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008767 }
8768 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008769 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008770}
8771
Spandan Dasf14e2542021-11-12 00:01:37 +00008772func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008773 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008774 bp += `
8775 apex_key {
8776 name: "myapex.key",
8777 public_key: "testkey.avbpubkey",
8778 private_key: "testkey.pem",
8779 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008780 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008781 "lib1/src/A.java": nil,
8782 "lib2/src/B.java": nil,
8783 "system/sepolicy/apex/myapex-file_contexts": nil,
8784 }
8785
Paul Duffin45338f02021-03-30 23:07:52 +01008786 errorHandler := android.FixtureExpectsNoErrors
8787 if errmsg != "" {
8788 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008789 }
Colin Crossae8600b2020-10-29 17:09:13 -07008790
Paul Duffin45338f02021-03-30 23:07:52 +01008791 android.GroupFixturePreparers(
8792 android.PrepareForTestWithAndroidBuildComponents,
8793 java.PrepareForTestWithJavaBuildComponents,
8794 PrepareForTestWithApexBuildComponents,
8795 android.PrepareForTestWithNeverallowRules(rules),
8796 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008797 apexBootJars := make([]string, 0, len(bootJars))
8798 for _, apexBootJar := range bootJars {
8799 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008800 }
satayevd604b212021-07-21 14:23:52 +01008801 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008802 }),
8803 fs.AddToFixture(),
8804 ).
8805 ExtendWithErrorHandler(errorHandler).
8806 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008807}
8808
8809func TestApexPermittedPackagesRules(t *testing.T) {
8810 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008811 name string
8812 expectedError string
8813 bp string
8814 bootJars []string
8815 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008816 }{
8817
8818 {
8819 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8820 expectedError: "",
8821 bp: `
8822 java_library {
8823 name: "bcp_lib1",
8824 srcs: ["lib1/src/*.java"],
8825 permitted_packages: ["foo.bar"],
8826 apex_available: ["myapex"],
8827 sdk_version: "none",
8828 system_modules: "none",
8829 }
8830 java_library {
8831 name: "nonbcp_lib2",
8832 srcs: ["lib2/src/*.java"],
8833 apex_available: ["myapex"],
8834 permitted_packages: ["a.b"],
8835 sdk_version: "none",
8836 system_modules: "none",
8837 }
8838 apex {
8839 name: "myapex",
8840 key: "myapex.key",
8841 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008842 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008843 }`,
8844 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008845 bcpPermittedPackages: map[string][]string{
8846 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008847 "foo.bar",
8848 },
8849 },
8850 },
8851 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008852 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008853 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 +01008854 bp: `
8855 java_library {
8856 name: "bcp_lib1",
8857 srcs: ["lib1/src/*.java"],
8858 apex_available: ["myapex"],
8859 permitted_packages: ["foo.bar"],
8860 sdk_version: "none",
8861 system_modules: "none",
8862 }
8863 java_library {
8864 name: "bcp_lib2",
8865 srcs: ["lib2/src/*.java"],
8866 apex_available: ["myapex"],
8867 permitted_packages: ["foo.bar", "bar.baz"],
8868 sdk_version: "none",
8869 system_modules: "none",
8870 }
8871 apex {
8872 name: "myapex",
8873 key: "myapex.key",
8874 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008875 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008876 }
8877 `,
8878 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008879 bcpPermittedPackages: map[string][]string{
8880 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008881 "foo.bar",
8882 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008883 "bcp_lib2": []string{
8884 "foo.bar",
8885 },
8886 },
8887 },
8888 {
8889 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8890 expectedError: "",
8891 bp: `
8892 java_library {
8893 name: "bcp_lib_restricted",
8894 srcs: ["lib1/src/*.java"],
8895 apex_available: ["myapex"],
8896 permitted_packages: ["foo.bar"],
8897 sdk_version: "none",
8898 min_sdk_version: "29",
8899 system_modules: "none",
8900 }
8901 java_library {
8902 name: "bcp_lib_unrestricted",
8903 srcs: ["lib2/src/*.java"],
8904 apex_available: ["myapex"],
8905 permitted_packages: ["foo.bar", "bar.baz"],
8906 sdk_version: "none",
8907 min_sdk_version: "29",
8908 system_modules: "none",
8909 }
8910 apex {
8911 name: "myapex",
8912 key: "myapex.key",
8913 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8914 updatable: true,
8915 min_sdk_version: "29",
8916 }
8917 `,
8918 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8919 bcpPermittedPackages: map[string][]string{
8920 "bcp_lib1_non_updateable": []string{
8921 "foo.bar",
8922 },
8923 // 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 +01008924 },
8925 },
8926 }
8927 for _, tc := range testcases {
8928 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008929 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8930 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008931 })
8932 }
8933}
8934
Jiyong Park62304bb2020-04-13 16:19:48 +09008935func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008936 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008937 apex {
8938 name: "myapex",
8939 key: "myapex.key",
8940 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008941 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008942 }
8943
8944 apex_key {
8945 name: "myapex.key",
8946 public_key: "testkey.avbpubkey",
8947 private_key: "testkey.pem",
8948 }
8949
8950 cc_library {
8951 name: "mylib",
8952 srcs: ["mylib.cpp"],
8953 system_shared_libs: [],
8954 stl: "none",
8955 stubs: {
8956 versions: ["1"],
8957 },
8958 apex_available: ["myapex"],
8959 }
8960
8961 cc_library {
8962 name: "myprivlib",
8963 srcs: ["mylib.cpp"],
8964 system_shared_libs: [],
8965 stl: "none",
8966 apex_available: ["myapex"],
8967 }
8968
8969
8970 cc_test {
8971 name: "mytest",
8972 gtest: false,
8973 srcs: ["mylib.cpp"],
8974 system_shared_libs: [],
8975 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008976 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008977 test_for: ["myapex"]
8978 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008979
8980 cc_library {
8981 name: "mytestlib",
8982 srcs: ["mylib.cpp"],
8983 system_shared_libs: [],
8984 shared_libs: ["mylib", "myprivlib"],
8985 stl: "none",
8986 test_for: ["myapex"],
8987 }
8988
8989 cc_benchmark {
8990 name: "mybench",
8991 srcs: ["mylib.cpp"],
8992 system_shared_libs: [],
8993 shared_libs: ["mylib", "myprivlib"],
8994 stl: "none",
8995 test_for: ["myapex"],
8996 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008997 `)
8998
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008999 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009000 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009001 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9002 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9003 }
9004
9005 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009006 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009007 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9008 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9009 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9010}
Jiyong Park46a512f2020-12-04 18:02:13 +09009011
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009012func TestIndirectTestFor(t *testing.T) {
9013 ctx := testApex(t, `
9014 apex {
9015 name: "myapex",
9016 key: "myapex.key",
9017 native_shared_libs: ["mylib", "myprivlib"],
9018 updatable: false,
9019 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009020
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009021 apex_key {
9022 name: "myapex.key",
9023 public_key: "testkey.avbpubkey",
9024 private_key: "testkey.pem",
9025 }
9026
9027 cc_library {
9028 name: "mylib",
9029 srcs: ["mylib.cpp"],
9030 system_shared_libs: [],
9031 stl: "none",
9032 stubs: {
9033 versions: ["1"],
9034 },
9035 apex_available: ["myapex"],
9036 }
9037
9038 cc_library {
9039 name: "myprivlib",
9040 srcs: ["mylib.cpp"],
9041 system_shared_libs: [],
9042 stl: "none",
9043 shared_libs: ["mylib"],
9044 apex_available: ["myapex"],
9045 }
9046
9047 cc_library {
9048 name: "mytestlib",
9049 srcs: ["mylib.cpp"],
9050 system_shared_libs: [],
9051 shared_libs: ["myprivlib"],
9052 stl: "none",
9053 test_for: ["myapex"],
9054 }
9055 `)
9056
9057 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009058 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009059 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9060 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9061 }
9062
9063 // The platform variant of mytestlib links to the platform variant of the
9064 // internal myprivlib.
9065 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9066
9067 // The platform variant of myprivlib links to the platform variant of mylib
9068 // and bypasses its stubs.
9069 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 +09009070}
9071
Martin Stjernholmec009002021-03-27 15:18:31 +00009072func TestTestForForLibInOtherApex(t *testing.T) {
9073 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9074 _ = testApex(t, `
9075 apex {
9076 name: "com.android.art",
9077 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009078 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009079 updatable: false,
9080 }
9081
9082 apex {
9083 name: "com.android.art.debug",
9084 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009085 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009086 updatable: false,
9087 }
9088
9089 apex_key {
9090 name: "myapex.key",
9091 public_key: "testkey.avbpubkey",
9092 private_key: "testkey.pem",
9093 }
9094
9095 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009096 name: "libnativebridge",
9097 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009098 system_shared_libs: [],
9099 stl: "none",
9100 stubs: {
9101 versions: ["1"],
9102 },
9103 apex_available: ["com.android.art", "com.android.art.debug"],
9104 }
9105
9106 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009107 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009108 srcs: ["mylib.cpp"],
9109 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009110 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009111 stl: "none",
9112 apex_available: ["com.android.art.debug"],
9113 test_for: ["com.android.art"],
9114 }
9115 `,
9116 android.MockFS{
9117 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9118 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9119 }.AddToFixture())
9120}
9121
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009122// TODO(jungjw): Move this to proptools
9123func intPtr(i int) *int {
9124 return &i
9125}
9126
9127func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009128 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009129 apex_set {
9130 name: "myapex",
9131 set: "myapex.apks",
9132 filename: "foo_v2.apex",
9133 overrides: ["foo"],
9134 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009135 `,
9136 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9137 variables.Platform_sdk_version = intPtr(30)
9138 }),
9139 android.FixtureModifyConfig(func(config android.Config) {
9140 config.Targets[android.Android] = []android.Target{
9141 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9142 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9143 }
9144 }),
9145 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009146
Paul Duffin24704672021-04-06 16:09:30 +01009147 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009148
9149 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009150 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009151 actual := extractedApex.Args["abis"]
9152 expected := "ARMEABI_V7A,ARM64_V8A"
9153 if actual != expected {
9154 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9155 }
9156 actual = extractedApex.Args["sdk-version"]
9157 expected = "30"
9158 if actual != expected {
9159 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9160 }
9161
Paul Duffin6717d882021-06-15 19:09:41 +01009162 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009163 a := m.Module().(*ApexSet)
9164 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009165 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009166 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9167 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9168 }
9169}
9170
Anton Hansson805e0a52022-11-25 14:06:46 +00009171func TestApexSet_NativeBridge(t *testing.T) {
9172 ctx := testApex(t, `
9173 apex_set {
9174 name: "myapex",
9175 set: "myapex.apks",
9176 filename: "foo_v2.apex",
9177 overrides: ["foo"],
9178 }
9179 `,
9180 android.FixtureModifyConfig(func(config android.Config) {
9181 config.Targets[android.Android] = []android.Target{
9182 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9183 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9184 }
9185 }),
9186 )
9187
9188 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9189
9190 // Check extract_apks tool parameters. No native bridge arch expected
9191 extractedApex := m.Output("extracted/myapex.apks")
9192 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9193}
9194
Jiyong Park7d95a512020-05-10 15:16:24 +09009195func TestNoStaticLinkingToStubsLib(t *testing.T) {
9196 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9197 apex {
9198 name: "myapex",
9199 key: "myapex.key",
9200 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009201 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009202 }
9203
9204 apex_key {
9205 name: "myapex.key",
9206 public_key: "testkey.avbpubkey",
9207 private_key: "testkey.pem",
9208 }
9209
9210 cc_library {
9211 name: "mylib",
9212 srcs: ["mylib.cpp"],
9213 static_libs: ["otherlib"],
9214 system_shared_libs: [],
9215 stl: "none",
9216 apex_available: [ "myapex" ],
9217 }
9218
9219 cc_library {
9220 name: "otherlib",
9221 srcs: ["mylib.cpp"],
9222 system_shared_libs: [],
9223 stl: "none",
9224 stubs: {
9225 versions: ["1", "2", "3"],
9226 },
9227 apex_available: [ "myapex" ],
9228 }
9229 `)
9230}
9231
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009232func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009233 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009234 apex {
9235 name: "myapex",
9236 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009237 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009238 custom_sign_tool: "sign_myapex",
9239 }
9240
9241 apex_key {
9242 name: "myapex.key",
9243 public_key: "testkey.avbpubkey",
9244 private_key: "testkey.pem",
9245 }
9246 `)
9247
Jooyung Han286957d2023-10-30 16:17:56 +09009248 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009249 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009250 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 +09009251}
9252
9253func TestApexKeysTxtOverrides(t *testing.T) {
9254 ctx := testApex(t, `
9255 apex {
9256 name: "myapex",
9257 key: "myapex.key",
9258 updatable: false,
9259 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009260 }
9261
9262 apex_key {
9263 name: "myapex.key",
9264 public_key: "testkey.avbpubkey",
9265 private_key: "testkey.pem",
9266 }
9267
9268 prebuilt_apex {
9269 name: "myapex",
9270 prefer: true,
9271 arch: {
9272 arm64: {
9273 src: "myapex-arm64.apex",
9274 },
9275 arm: {
9276 src: "myapex-arm.apex",
9277 },
9278 },
9279 }
9280
9281 apex_set {
9282 name: "myapex_set",
9283 set: "myapex.apks",
9284 filename: "myapex_set.apex",
9285 overrides: ["myapex"],
9286 }
9287 `)
9288
Colin Crossf61d03d2023-11-02 16:56:39 -07009289 content := android.ContentFromFileRuleForTests(t, ctx,
9290 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009291 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 -07009292 content = android.ContentFromFileRuleForTests(t, ctx,
9293 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009294 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 +09009295}
9296
Jooyung Han938b5932020-06-20 12:47:47 +09009297func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009298 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009299 apex {
9300 name: "myapex",
9301 key: "myapex.key",
9302 apps: ["app"],
9303 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009304 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009305 }
9306
9307 apex_key {
9308 name: "myapex.key",
9309 public_key: "testkey.avbpubkey",
9310 private_key: "testkey.pem",
9311 }
9312
9313 android_app {
9314 name: "app",
9315 srcs: ["foo/bar/MyClass.java"],
9316 package_name: "foo",
9317 sdk_version: "none",
9318 system_modules: "none",
9319 apex_available: [ "myapex" ],
9320 }
9321 `, withFiles(map[string][]byte{
9322 "sub/Android.bp": []byte(`
9323 override_apex {
9324 name: "override_myapex",
9325 base: "myapex",
9326 apps: ["override_app"],
9327 allowed_files: ":allowed",
9328 }
9329 // Overridable "path" property should be referenced indirectly
9330 filegroup {
9331 name: "allowed",
9332 srcs: ["allowed.txt"],
9333 }
9334 override_android_app {
9335 name: "override_app",
9336 base: "app",
9337 package_name: "bar",
9338 }
9339 `),
9340 }))
9341
Jooyung Hana0503a52023-08-23 13:12:50 +09009342 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009343 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9344 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9345 }
9346
Jooyung Hana0503a52023-08-23 13:12:50 +09009347 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009348 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9349 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9350 }
9351}
9352
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009353func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009354 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009355 apex {
9356 name: "myapex",
9357 key: "myapex.key",
9358 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009359 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009360 }
9361
9362 apex_key {
9363 name: "myapex.key",
9364 public_key: "testkey.avbpubkey",
9365 private_key: "testkey.pem",
9366 }
9367
9368 cc_library {
9369 name: "mylib",
9370 srcs: ["mylib.cpp"],
9371 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009372 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009373 },
9374 apex_available: ["myapex"],
9375 }
9376
9377 cc_prebuilt_library_shared {
9378 name: "mylib",
9379 prefer: false,
9380 srcs: ["prebuilt.so"],
9381 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009382 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009383 },
9384 apex_available: ["myapex"],
9385 }
9386 `)
9387}
9388
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009389func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009390 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009391 apex {
9392 name: "myapex",
9393 key: "myapex.key",
9394 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009395 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009396 }
9397 apex_key {
9398 name: "myapex.key",
9399 public_key: "testkey.avbpubkey",
9400 private_key: "testkey.pem",
9401 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009402 `,
9403 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9404 variables.CompressedApex = proptools.BoolPtr(true)
9405 }),
9406 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009407
Jooyung Hana0503a52023-08-23 13:12:50 +09009408 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009409 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9410
Jooyung Hana0503a52023-08-23 13:12:50 +09009411 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009412 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9413
9414 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009415 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009416 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9417
9418 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009419 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009420 var builder strings.Builder
9421 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9422 androidMk := builder.String()
9423 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9424}
9425
Martin Stjernholm2856c662020-12-02 15:03:42 +00009426func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009427 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009428 apex {
9429 name: "myapex",
9430 key: "myapex.key",
9431 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009432 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009433 }
9434
9435 apex_key {
9436 name: "myapex.key",
9437 public_key: "testkey.avbpubkey",
9438 private_key: "testkey.pem",
9439 }
9440
9441 cc_library {
9442 name: "mylib",
9443 srcs: ["mylib.cpp"],
9444 apex_available: ["myapex"],
9445 shared_libs: ["otherlib"],
9446 system_shared_libs: [],
9447 }
9448
9449 cc_library {
9450 name: "otherlib",
9451 srcs: ["mylib.cpp"],
9452 stubs: {
9453 versions: ["current"],
9454 },
9455 }
9456
9457 cc_prebuilt_library_shared {
9458 name: "otherlib",
9459 prefer: true,
9460 srcs: ["prebuilt.so"],
9461 stubs: {
9462 versions: ["current"],
9463 },
9464 }
9465 `)
9466
Jooyung Hana0503a52023-08-23 13:12:50 +09009467 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009468 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009469 var builder strings.Builder
9470 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9471 androidMk := builder.String()
9472
9473 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9474 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009475 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009476}
9477
Jiyong Parke3867542020-12-03 17:28:25 +09009478func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009479 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009480 apex {
9481 name: "myapex",
9482 key: "myapex.key",
9483 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009484 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009485 }
9486
9487 apex_key {
9488 name: "myapex.key",
9489 public_key: "testkey.avbpubkey",
9490 private_key: "testkey.pem",
9491 }
9492
9493 cc_library {
9494 name: "mylib",
9495 srcs: ["mylib.cpp"],
9496 system_shared_libs: [],
9497 stl: "none",
9498 apex_available: ["myapex"],
9499 shared_libs: ["mylib2"],
9500 target: {
9501 apex: {
9502 exclude_shared_libs: ["mylib2"],
9503 },
9504 },
9505 }
9506
9507 cc_library {
9508 name: "mylib2",
9509 srcs: ["mylib.cpp"],
9510 system_shared_libs: [],
9511 stl: "none",
9512 }
9513 `)
9514
9515 // Check if mylib is linked to mylib2 for the non-apex target
9516 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9517 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9518
9519 // Make sure that the link doesn't occur for the apex target
9520 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9521 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9522
9523 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009524 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009525 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9526}
9527
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009528func TestPrebuiltStubLibDep(t *testing.T) {
9529 bpBase := `
9530 apex {
9531 name: "myapex",
9532 key: "myapex.key",
9533 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009534 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009535 }
9536 apex_key {
9537 name: "myapex.key",
9538 public_key: "testkey.avbpubkey",
9539 private_key: "testkey.pem",
9540 }
9541 cc_library {
9542 name: "mylib",
9543 srcs: ["mylib.cpp"],
9544 apex_available: ["myapex"],
9545 shared_libs: ["stublib"],
9546 system_shared_libs: [],
9547 }
9548 apex {
9549 name: "otherapex",
9550 enabled: %s,
9551 key: "myapex.key",
9552 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009553 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009554 }
9555 `
9556
9557 stublibSourceBp := `
9558 cc_library {
9559 name: "stublib",
9560 srcs: ["mylib.cpp"],
9561 apex_available: ["otherapex"],
9562 system_shared_libs: [],
9563 stl: "none",
9564 stubs: {
9565 versions: ["1"],
9566 },
9567 }
9568 `
9569
9570 stublibPrebuiltBp := `
9571 cc_prebuilt_library_shared {
9572 name: "stublib",
9573 srcs: ["prebuilt.so"],
9574 apex_available: ["otherapex"],
9575 stubs: {
9576 versions: ["1"],
9577 },
9578 %s
9579 }
9580 `
9581
9582 tests := []struct {
9583 name string
9584 stublibBp string
9585 usePrebuilt bool
9586 modNames []string // Modules to collect AndroidMkEntries for
9587 otherApexEnabled []string
9588 }{
9589 {
9590 name: "only_source",
9591 stublibBp: stublibSourceBp,
9592 usePrebuilt: false,
9593 modNames: []string{"stublib"},
9594 otherApexEnabled: []string{"true", "false"},
9595 },
9596 {
9597 name: "source_preferred",
9598 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9599 usePrebuilt: false,
9600 modNames: []string{"stublib", "prebuilt_stublib"},
9601 otherApexEnabled: []string{"true", "false"},
9602 },
9603 {
9604 name: "prebuilt_preferred",
9605 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9606 usePrebuilt: true,
9607 modNames: []string{"stublib", "prebuilt_stublib"},
9608 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9609 },
9610 {
9611 name: "only_prebuilt",
9612 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9613 usePrebuilt: true,
9614 modNames: []string{"stublib"},
9615 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9616 },
9617 }
9618
9619 for _, test := range tests {
9620 t.Run(test.name, func(t *testing.T) {
9621 for _, otherApexEnabled := range test.otherApexEnabled {
9622 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009623 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009624
9625 type modAndMkEntries struct {
9626 mod *cc.Module
9627 mkEntries android.AndroidMkEntries
9628 }
9629 entries := []*modAndMkEntries{}
9630
9631 // Gather shared lib modules that are installable
9632 for _, modName := range test.modNames {
9633 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9634 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9635 continue
9636 }
9637 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009638 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009639 continue
9640 }
Colin Crossaa255532020-07-03 13:18:24 -07009641 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009642 if ent.Disabled {
9643 continue
9644 }
9645 entries = append(entries, &modAndMkEntries{
9646 mod: mod,
9647 mkEntries: ent,
9648 })
9649 }
9650 }
9651 }
9652
9653 var entry *modAndMkEntries = nil
9654 for _, ent := range entries {
9655 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9656 if entry != nil {
9657 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9658 } else {
9659 entry = ent
9660 }
9661 }
9662 }
9663
9664 if entry == nil {
9665 t.Errorf("AndroidMk entry for \"stublib\" missing")
9666 } else {
9667 isPrebuilt := entry.mod.Prebuilt() != nil
9668 if isPrebuilt != test.usePrebuilt {
9669 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9670 }
9671 if !entry.mod.IsStubs() {
9672 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9673 }
9674 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9675 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9676 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009677 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009678 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009679 if !android.InList(expected, cflags) {
9680 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9681 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009682 }
9683 })
9684 }
9685 })
9686 }
9687}
9688
Colin Crossc33e5212021-05-25 18:16:02 -07009689func TestApexJavaCoverage(t *testing.T) {
9690 bp := `
9691 apex {
9692 name: "myapex",
9693 key: "myapex.key",
9694 java_libs: ["mylib"],
9695 bootclasspath_fragments: ["mybootclasspathfragment"],
9696 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9697 updatable: false,
9698 }
9699
9700 apex_key {
9701 name: "myapex.key",
9702 public_key: "testkey.avbpubkey",
9703 private_key: "testkey.pem",
9704 }
9705
9706 java_library {
9707 name: "mylib",
9708 srcs: ["mylib.java"],
9709 apex_available: ["myapex"],
9710 compile_dex: true,
9711 }
9712
9713 bootclasspath_fragment {
9714 name: "mybootclasspathfragment",
9715 contents: ["mybootclasspathlib"],
9716 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009717 hidden_api: {
9718 split_packages: ["*"],
9719 },
Colin Crossc33e5212021-05-25 18:16:02 -07009720 }
9721
9722 java_library {
9723 name: "mybootclasspathlib",
9724 srcs: ["mybootclasspathlib.java"],
9725 apex_available: ["myapex"],
9726 compile_dex: true,
9727 }
9728
9729 systemserverclasspath_fragment {
9730 name: "mysystemserverclasspathfragment",
9731 contents: ["mysystemserverclasspathlib"],
9732 apex_available: ["myapex"],
9733 }
9734
9735 java_library {
9736 name: "mysystemserverclasspathlib",
9737 srcs: ["mysystemserverclasspathlib.java"],
9738 apex_available: ["myapex"],
9739 compile_dex: true,
9740 }
9741 `
9742
9743 result := android.GroupFixturePreparers(
9744 PrepareForTestWithApexBuildComponents,
9745 prepareForTestWithMyapex,
9746 java.PrepareForTestWithJavaDefaultModules,
9747 android.PrepareForTestWithAndroidBuildComponents,
9748 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009749 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9750 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009751 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009752 ).RunTest(t)
9753
9754 // Make sure jacoco ran on both mylib and mybootclasspathlib
9755 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9756 t.Errorf("Failed to find jacoco rule for mylib")
9757 }
9758 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9759 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9760 }
9761 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9762 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9763 }
9764}
9765
Jiyong Park192600a2021-08-03 07:52:17 +00009766func TestProhibitStaticExecutable(t *testing.T) {
9767 testApexError(t, `executable mybin is static`, `
9768 apex {
9769 name: "myapex",
9770 key: "myapex.key",
9771 binaries: ["mybin"],
9772 min_sdk_version: "29",
9773 }
9774
9775 apex_key {
9776 name: "myapex.key",
9777 public_key: "testkey.avbpubkey",
9778 private_key: "testkey.pem",
9779 }
9780
9781 cc_binary {
9782 name: "mybin",
9783 srcs: ["mylib.cpp"],
9784 relative_install_path: "foo/bar",
9785 static_executable: true,
9786 system_shared_libs: [],
9787 stl: "none",
9788 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009789 min_sdk_version: "29",
9790 }
9791 `)
9792
9793 testApexError(t, `executable mybin.rust is static`, `
9794 apex {
9795 name: "myapex",
9796 key: "myapex.key",
9797 binaries: ["mybin.rust"],
9798 min_sdk_version: "29",
9799 }
9800
9801 apex_key {
9802 name: "myapex.key",
9803 public_key: "testkey.avbpubkey",
9804 private_key: "testkey.pem",
9805 }
9806
9807 rust_binary {
9808 name: "mybin.rust",
9809 srcs: ["foo.rs"],
9810 static_executable: true,
9811 apex_available: ["myapex"],
9812 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009813 }
9814 `)
9815}
9816
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009817func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9818 ctx := testApex(t, `
9819 apex {
9820 name: "myapex",
9821 key: "myapex.key",
9822 updatable: false,
9823 java_libs: ["foo"],
9824 }
9825
9826 apex_key {
9827 name: "myapex.key",
9828 public_key: "testkey.avbpubkey",
9829 private_key: "testkey.pem",
9830 }
9831
9832 java_library {
9833 name: "foo",
9834 srcs: ["foo.java"],
9835 apex_available: ["myapex"],
9836 installable: true,
9837 }
9838 `,
9839 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9840 )
9841
Jooyung Hana0503a52023-08-23 13:12:50 +09009842 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009843 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9844 var builder strings.Builder
9845 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9846 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009847 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 +00009848}
9849
9850func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9851 ctx := testApex(t, `
9852 prebuilt_apex {
9853 name: "myapex",
9854 arch: {
9855 arm64: {
9856 src: "myapex-arm64.apex",
9857 },
9858 arm: {
9859 src: "myapex-arm.apex",
9860 },
9861 },
9862 exported_java_libs: ["foo"],
9863 }
9864
9865 java_import {
9866 name: "foo",
9867 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009868 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009869 }
9870 `,
9871 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9872 )
9873
9874 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9875 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9876 mainModuleEntries := entriesList[0]
9877 android.AssertArrayString(t,
9878 "LOCAL_REQUIRED_MODULES",
9879 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9880 []string{
9881 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9882 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9883 })
9884}
9885
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009886func TestAndroidMk_RequiredModules(t *testing.T) {
9887 ctx := testApex(t, `
9888 apex {
9889 name: "myapex",
9890 key: "myapex.key",
9891 updatable: false,
9892 java_libs: ["foo"],
9893 required: ["otherapex"],
9894 }
9895
9896 apex {
9897 name: "otherapex",
9898 key: "myapex.key",
9899 updatable: false,
9900 java_libs: ["foo"],
9901 required: ["otherapex"],
9902 }
9903
9904 apex_key {
9905 name: "myapex.key",
9906 public_key: "testkey.avbpubkey",
9907 private_key: "testkey.pem",
9908 }
9909
9910 java_library {
9911 name: "foo",
9912 srcs: ["foo.java"],
9913 apex_available: ["myapex", "otherapex"],
9914 installable: true,
9915 }
9916 `)
9917
Jooyung Hana0503a52023-08-23 13:12:50 +09009918 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009919 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9920 var builder strings.Builder
9921 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9922 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009923 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009924}
9925
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009926func TestAndroidMk_RequiredDeps(t *testing.T) {
9927 ctx := testApex(t, `
9928 apex {
9929 name: "myapex",
9930 key: "myapex.key",
9931 updatable: false,
9932 }
9933
9934 apex_key {
9935 name: "myapex.key",
9936 public_key: "testkey.avbpubkey",
9937 private_key: "testkey.pem",
9938 }
9939 `)
9940
Jooyung Hana0503a52023-08-23 13:12:50 +09009941 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009942 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009943 data := android.AndroidMkDataForTest(t, ctx, bundle)
9944 var builder strings.Builder
9945 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9946 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009947 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009948}
9949
Jooyung Hana6d36672022-02-24 13:58:07 +09009950func TestApexOutputFileProducer(t *testing.T) {
9951 for _, tc := range []struct {
9952 name string
9953 ref string
9954 expected_data []string
9955 }{
9956 {
9957 name: "test_using_output",
9958 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009959 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009960 },
9961 {
9962 name: "test_using_apex",
9963 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009964 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009965 },
9966 } {
9967 t.Run(tc.name, func(t *testing.T) {
9968 ctx := testApex(t, `
9969 apex {
9970 name: "myapex",
9971 key: "myapex.key",
9972 compressible: true,
9973 updatable: false,
9974 }
9975
9976 apex_key {
9977 name: "myapex.key",
9978 public_key: "testkey.avbpubkey",
9979 private_key: "testkey.pem",
9980 }
9981
9982 java_test {
9983 name: "`+tc.name+`",
9984 srcs: ["a.java"],
9985 data: ["`+tc.ref+`"],
9986 }
9987 `,
9988 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9989 variables.CompressedApex = proptools.BoolPtr(true)
9990 }))
9991 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9992 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9993 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9994 })
9995 }
9996}
9997
satayev758968a2021-12-06 11:42:40 +00009998func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9999 preparer := android.GroupFixturePreparers(
10000 PrepareForTestWithApexBuildComponents,
10001 prepareForTestWithMyapex,
10002 java.PrepareForTestWithJavaSdkLibraryFiles,
10003 java.PrepareForTestWithJavaDefaultModules,
10004 android.PrepareForTestWithAndroidBuildComponents,
10005 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10006 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10007 )
10008
10009 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10010 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10011 preparer.RunTestWithBp(t, `
10012 apex {
10013 name: "myapex",
10014 key: "myapex.key",
10015 bootclasspath_fragments: ["mybootclasspathfragment"],
10016 min_sdk_version: "30",
10017 updatable: false,
10018 }
10019
10020 apex_key {
10021 name: "myapex.key",
10022 public_key: "testkey.avbpubkey",
10023 private_key: "testkey.pem",
10024 }
10025
10026 bootclasspath_fragment {
10027 name: "mybootclasspathfragment",
10028 contents: ["mybootclasspathlib"],
10029 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010030 hidden_api: {
10031 split_packages: ["*"],
10032 },
satayev758968a2021-12-06 11:42:40 +000010033 }
10034
10035 java_sdk_library {
10036 name: "mybootclasspathlib",
10037 srcs: ["mybootclasspathlib.java"],
10038 apex_available: ["myapex"],
10039 compile_dex: true,
10040 unsafe_ignore_missing_latest_api: true,
10041 min_sdk_version: "31",
10042 static_libs: ["util"],
10043 }
10044
10045 java_library {
10046 name: "util",
10047 srcs: ["a.java"],
10048 apex_available: ["myapex"],
10049 min_sdk_version: "31",
10050 static_libs: ["another_util"],
10051 }
10052
10053 java_library {
10054 name: "another_util",
10055 srcs: ["a.java"],
10056 min_sdk_version: "31",
10057 apex_available: ["myapex"],
10058 }
10059 `)
10060 })
10061
10062 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10063 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10064 preparer.RunTestWithBp(t, `
10065 apex {
10066 name: "myapex",
10067 key: "myapex.key",
10068 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10069 min_sdk_version: "30",
10070 updatable: false,
10071 }
10072
10073 apex_key {
10074 name: "myapex.key",
10075 public_key: "testkey.avbpubkey",
10076 private_key: "testkey.pem",
10077 }
10078
10079 systemserverclasspath_fragment {
10080 name: "mysystemserverclasspathfragment",
10081 contents: ["mysystemserverclasspathlib"],
10082 apex_available: ["myapex"],
10083 }
10084
10085 java_sdk_library {
10086 name: "mysystemserverclasspathlib",
10087 srcs: ["mysystemserverclasspathlib.java"],
10088 apex_available: ["myapex"],
10089 compile_dex: true,
10090 min_sdk_version: "32",
10091 unsafe_ignore_missing_latest_api: true,
10092 static_libs: ["util"],
10093 }
10094
10095 java_library {
10096 name: "util",
10097 srcs: ["a.java"],
10098 apex_available: ["myapex"],
10099 min_sdk_version: "31",
10100 static_libs: ["another_util"],
10101 }
10102
10103 java_library {
10104 name: "another_util",
10105 srcs: ["a.java"],
10106 min_sdk_version: "31",
10107 apex_available: ["myapex"],
10108 }
10109 `)
10110 })
10111
10112 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10113 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10114 RunTestWithBp(t, `
10115 apex {
10116 name: "myapex",
10117 key: "myapex.key",
10118 bootclasspath_fragments: ["mybootclasspathfragment"],
10119 min_sdk_version: "30",
10120 updatable: false,
10121 }
10122
10123 apex_key {
10124 name: "myapex.key",
10125 public_key: "testkey.avbpubkey",
10126 private_key: "testkey.pem",
10127 }
10128
10129 bootclasspath_fragment {
10130 name: "mybootclasspathfragment",
10131 contents: ["mybootclasspathlib"],
10132 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010133 hidden_api: {
10134 split_packages: ["*"],
10135 },
satayev758968a2021-12-06 11:42:40 +000010136 }
10137
10138 java_sdk_library {
10139 name: "mybootclasspathlib",
10140 srcs: ["mybootclasspathlib.java"],
10141 apex_available: ["myapex"],
10142 compile_dex: true,
10143 unsafe_ignore_missing_latest_api: true,
10144 }
10145 `)
10146 })
10147
10148 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10149 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10150 RunTestWithBp(t, `
10151 apex {
10152 name: "myapex",
10153 key: "myapex.key",
10154 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10155 min_sdk_version: "30",
10156 updatable: false,
10157 }
10158
10159 apex_key {
10160 name: "myapex.key",
10161 public_key: "testkey.avbpubkey",
10162 private_key: "testkey.pem",
10163 }
10164
10165 systemserverclasspath_fragment {
10166 name: "mysystemserverclasspathfragment",
10167 contents: ["mysystemserverclasspathlib"],
10168 apex_available: ["myapex"],
10169 }
10170
10171 java_sdk_library {
10172 name: "mysystemserverclasspathlib",
10173 srcs: ["mysystemserverclasspathlib.java"],
10174 apex_available: ["myapex"],
10175 compile_dex: true,
10176 unsafe_ignore_missing_latest_api: true,
10177 }
10178 `)
10179 })
10180}
10181
Jiakai Zhang6decef92022-01-12 17:56:19 +000010182// Verifies that the APEX depends on all the Make modules in the list.
10183func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10184 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10185 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010186 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010187 }
10188}
10189
10190// Verifies that the APEX does not depend on any of the Make modules in the list.
10191func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10192 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10193 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010194 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010195 }
10196}
10197
Cole Faust1021ccd2023-02-26 21:15:25 -080010198// TODO(b/193460475): Re-enable this test
10199//func TestApexStrictUpdtabilityLint(t *testing.T) {
10200// bpTemplate := `
10201// apex {
10202// name: "myapex",
10203// key: "myapex.key",
10204// java_libs: ["myjavalib"],
10205// updatable: %v,
10206// min_sdk_version: "29",
10207// }
10208// apex_key {
10209// name: "myapex.key",
10210// }
10211// java_library {
10212// name: "myjavalib",
10213// srcs: ["MyClass.java"],
10214// apex_available: [ "myapex" ],
10215// lint: {
10216// strict_updatability_linting: %v,
10217// },
10218// sdk_version: "current",
10219// min_sdk_version: "29",
10220// }
10221// `
10222// fs := android.MockFS{
10223// "lint-baseline.xml": nil,
10224// }
10225//
10226// testCases := []struct {
10227// testCaseName string
10228// apexUpdatable bool
10229// javaStrictUpdtabilityLint bool
10230// lintFileExists bool
10231// disallowedFlagExpected bool
10232// }{
10233// {
10234// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10235// apexUpdatable: true,
10236// javaStrictUpdtabilityLint: true,
10237// lintFileExists: false,
10238// disallowedFlagExpected: false,
10239// },
10240// {
10241// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10242// apexUpdatable: false,
10243// javaStrictUpdtabilityLint: false,
10244// lintFileExists: true,
10245// disallowedFlagExpected: false,
10246// },
10247// {
10248// testCaseName: "non-updatable apex respects strict updatability of javalib",
10249// apexUpdatable: false,
10250// javaStrictUpdtabilityLint: true,
10251// lintFileExists: true,
10252// disallowedFlagExpected: true,
10253// },
10254// {
10255// testCaseName: "updatable apex sets strict updatability of javalib to true",
10256// apexUpdatable: true,
10257// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10258// lintFileExists: true,
10259// disallowedFlagExpected: true,
10260// },
10261// }
10262//
10263// for _, testCase := range testCases {
10264// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10265// fixtures := []android.FixturePreparer{}
10266// if testCase.lintFileExists {
10267// fixtures = append(fixtures, fs.AddToFixture())
10268// }
10269//
10270// result := testApex(t, bp, fixtures...)
10271// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10272// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10273// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10274//
10275// if disallowedFlagActual != testCase.disallowedFlagExpected {
10276// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10277// }
10278// }
10279//}
10280//
10281//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10282// bp := `
10283// apex {
10284// name: "myapex",
10285// key: "myapex.key",
10286// java_libs: ["myjavalib"],
10287// updatable: true,
10288// min_sdk_version: "29",
10289// }
10290// apex_key {
10291// name: "myapex.key",
10292// }
10293// java_library {
10294// name: "myjavalib",
10295// srcs: ["MyClass.java"],
10296// apex_available: [ "myapex" ],
10297// sdk_version: "current",
10298// min_sdk_version: "29",
10299// }
10300// `
10301//
10302// testCases := []struct {
10303// testCaseName string
10304// moduleDirectory string
10305// disallowedFlagExpected bool
10306// }{
10307// {
10308// testCaseName: "lintable module defined outside libcore",
10309// moduleDirectory: "",
10310// disallowedFlagExpected: true,
10311// },
10312// {
10313// testCaseName: "lintable module defined in libcore root directory",
10314// moduleDirectory: "libcore/",
10315// disallowedFlagExpected: false,
10316// },
10317// {
10318// testCaseName: "lintable module defined in libcore child directory",
10319// moduleDirectory: "libcore/childdir/",
10320// disallowedFlagExpected: true,
10321// },
10322// }
10323//
10324// for _, testCase := range testCases {
10325// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10326// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10327// result := testApex(t, "", lintFileCreator, bpFileCreator)
10328// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10329// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10330// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10331// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10332//
10333// if disallowedFlagActual != testCase.disallowedFlagExpected {
10334// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10335// }
10336// }
10337//}
10338//
10339//// checks transtive deps of an apex coming from bootclasspath_fragment
10340//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10341// bp := `
10342// apex {
10343// name: "myapex",
10344// key: "myapex.key",
10345// bootclasspath_fragments: ["mybootclasspathfragment"],
10346// updatable: true,
10347// min_sdk_version: "29",
10348// }
10349// apex_key {
10350// name: "myapex.key",
10351// }
10352// bootclasspath_fragment {
10353// name: "mybootclasspathfragment",
10354// contents: ["myjavalib"],
10355// apex_available: ["myapex"],
10356// hidden_api: {
10357// split_packages: ["*"],
10358// },
10359// }
10360// java_library {
10361// name: "myjavalib",
10362// srcs: ["MyClass.java"],
10363// apex_available: [ "myapex" ],
10364// sdk_version: "current",
10365// min_sdk_version: "29",
10366// compile_dex: true,
10367// }
10368// `
10369// fs := android.MockFS{
10370// "lint-baseline.xml": nil,
10371// }
10372//
10373// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10374// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10375// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10376// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10377// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10378// }
10379//}
Spandan Das66773252022-01-15 00:23:18 +000010380
Spandan Das42e89502022-05-06 22:12:55 +000010381// updatable apexes should propagate updatable=true to its apps
10382func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10383 bp := `
10384 apex {
10385 name: "myapex",
10386 key: "myapex.key",
10387 updatable: %v,
10388 apps: [
10389 "myapp",
10390 ],
10391 min_sdk_version: "30",
10392 }
10393 apex_key {
10394 name: "myapex.key",
10395 }
10396 android_app {
10397 name: "myapp",
10398 updatable: %v,
10399 apex_available: [
10400 "myapex",
10401 ],
10402 sdk_version: "current",
10403 min_sdk_version: "30",
10404 }
10405 `
10406 testCases := []struct {
10407 name string
10408 apex_is_updatable_bp bool
10409 app_is_updatable_bp bool
10410 app_is_updatable_expected bool
10411 }{
10412 {
10413 name: "Non-updatable apex respects updatable property of non-updatable app",
10414 apex_is_updatable_bp: false,
10415 app_is_updatable_bp: false,
10416 app_is_updatable_expected: false,
10417 },
10418 {
10419 name: "Non-updatable apex respects updatable property of updatable app",
10420 apex_is_updatable_bp: false,
10421 app_is_updatable_bp: true,
10422 app_is_updatable_expected: true,
10423 },
10424 {
10425 name: "Updatable apex respects updatable property of updatable app",
10426 apex_is_updatable_bp: true,
10427 app_is_updatable_bp: true,
10428 app_is_updatable_expected: true,
10429 },
10430 {
10431 name: "Updatable apex sets updatable=true on non-updatable app",
10432 apex_is_updatable_bp: true,
10433 app_is_updatable_bp: false,
10434 app_is_updatable_expected: true,
10435 },
10436 }
10437 for _, testCase := range testCases {
10438 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10439 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10440 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10441 }
10442}
10443
Kiyoung Kim487689e2022-07-26 09:48:22 +090010444func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10445 bp := `
10446 apex {
10447 name: "myapex",
10448 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010449 native_shared_libs: ["libbaz"],
10450 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010451 min_sdk_version: "29",
10452 }
10453 apex_key {
10454 name: "myapex.key",
10455 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010456 cc_binary {
10457 name: "binfoo",
10458 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010459 apex_available: ["myapex"],
10460 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010461 recovery_available: false,
10462 }
10463 cc_library {
10464 name: "libbar",
10465 srcs: ["libbar.cc"],
10466 stubs: {
10467 symbol_file: "libbar.map.txt",
10468 versions: [
10469 "29",
10470 ],
10471 },
10472 }
10473 cc_library {
10474 name: "libbaz",
10475 srcs: ["libbaz.cc"],
10476 apex_available: ["myapex"],
10477 min_sdk_version: "29",
10478 stubs: {
10479 symbol_file: "libbaz.map.txt",
10480 versions: [
10481 "29",
10482 ],
10483 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010484 }
10485 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010486 name: "libbar",
10487 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010488 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010489 variants: ["apex.29"],
10490 }
10491 cc_api_variant {
10492 name: "libbar",
10493 variant: "apex",
10494 version: "29",
10495 src: "libbar_apex_29.so",
10496 }
10497 cc_api_library {
10498 name: "libbaz",
10499 src: "libbaz_stub.so",
10500 min_sdk_version: "29",
10501 variants: ["apex.29"],
10502 }
10503 cc_api_variant {
10504 name: "libbaz",
10505 variant: "apex",
10506 version: "29",
10507 src: "libbaz_apex_29.so",
10508 }
10509 cc_api_library {
10510 name: "libqux",
10511 src: "libqux_stub.so",
10512 min_sdk_version: "29",
10513 variants: ["apex.29"],
10514 }
10515 cc_api_variant {
10516 name: "libqux",
10517 variant: "apex",
10518 version: "29",
10519 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010520 }
10521 api_imports {
10522 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010523 apex_shared_libs: [
10524 "libbar",
10525 "libbaz",
10526 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010527 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010528 }
10529 `
10530 result := testApex(t, bp)
10531
10532 hasDep := func(m android.Module, wantDep android.Module) bool {
10533 t.Helper()
10534 var found bool
10535 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10536 if dep == wantDep {
10537 found = true
10538 }
10539 })
10540 return found
10541 }
10542
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010543 // Library defines stubs and cc_api_library should be used with cc_api_library
10544 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10545 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10546 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010547
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010548 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10549 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010550
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010551 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10552 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10553 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10554 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10555
10556 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10557 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10558 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10559 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10560 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10561
10562 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10563 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10564 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10565
10566 // cc_api_library defined without original library should be linked with cc_api_library
10567 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10568 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10569 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10570}
10571
10572func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10573 bp := `
10574 apex {
10575 name: "myapex",
10576 key: "myapex.key",
10577 native_shared_libs: ["libbar"],
10578 min_sdk_version: "29",
10579 }
10580 apex_key {
10581 name: "myapex.key",
10582 }
10583 cc_binary {
10584 name: "binfoo",
10585 shared_libs: ["libbar"],
10586 recovery_available: false,
10587 }
10588 cc_library {
10589 name: "libbar",
10590 srcs: ["libbar.cc"],
10591 apex_available: ["myapex"],
10592 min_sdk_version: "29",
10593 stubs: {
10594 symbol_file: "libbar.map.txt",
10595 versions: [
10596 "29",
10597 ],
10598 },
10599 }
10600 cc_api_library {
10601 name: "libbar",
10602 src: "libbar_stub.so",
10603 variants: ["apex.29"],
10604 }
10605 cc_api_variant {
10606 name: "libbar",
10607 variant: "apex",
10608 version: "29",
10609 src: "libbar_apex_29.so",
10610 }
10611 api_imports {
10612 name: "api_imports",
10613 apex_shared_libs: [
10614 "libbar",
10615 ],
10616 }
10617 `
10618
10619 result := testApex(t, bp)
10620
10621 hasDep := func(m android.Module, wantDep android.Module) bool {
10622 t.Helper()
10623 var found bool
10624 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10625 if dep == wantDep {
10626 found = true
10627 }
10628 })
10629 return found
10630 }
10631
10632 // Library defines stubs and cc_api_library should be used with cc_api_library
10633 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10634 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10635 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10636
10637 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10638 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10639
10640 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10641 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10642 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10643 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010644}
Dennis Shend4f5d932023-01-31 20:27:21 +000010645
10646func TestTrimmedApex(t *testing.T) {
10647 bp := `
10648 apex {
10649 name: "myapex",
10650 key: "myapex.key",
10651 native_shared_libs: ["libfoo","libbaz"],
10652 min_sdk_version: "29",
10653 trim_against: "mydcla",
10654 }
10655 apex {
10656 name: "mydcla",
10657 key: "myapex.key",
10658 native_shared_libs: ["libfoo","libbar"],
10659 min_sdk_version: "29",
10660 file_contexts: ":myapex-file_contexts",
10661 dynamic_common_lib_apex: true,
10662 }
10663 apex_key {
10664 name: "myapex.key",
10665 }
10666 cc_library {
10667 name: "libfoo",
10668 shared_libs: ["libc"],
10669 apex_available: ["myapex","mydcla"],
10670 min_sdk_version: "29",
10671 }
10672 cc_library {
10673 name: "libbar",
10674 shared_libs: ["libc"],
10675 apex_available: ["myapex","mydcla"],
10676 min_sdk_version: "29",
10677 }
10678 cc_library {
10679 name: "libbaz",
10680 shared_libs: ["libc"],
10681 apex_available: ["myapex","mydcla"],
10682 min_sdk_version: "29",
10683 }
10684 cc_api_library {
10685 name: "libc",
10686 src: "libc.so",
10687 min_sdk_version: "29",
10688 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010689 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010690 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010691 }
10692 api_imports {
10693 name: "api_imports",
10694 shared_libs: [
10695 "libc",
10696 ],
10697 header_libs: [],
10698 }
10699 `
10700 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010701 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010702 apexRule := module.MaybeRule("apexRule")
10703 if apexRule.Rule == nil {
10704 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10705 }
10706
10707 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010708 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010709 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10710 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10711 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10712 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10713}
Jingwen Chendea7a642023-03-28 11:30:50 +000010714
10715func TestCannedFsConfig(t *testing.T) {
10716 ctx := testApex(t, `
10717 apex {
10718 name: "myapex",
10719 key: "myapex.key",
10720 updatable: false,
10721 }
10722
10723 apex_key {
10724 name: "myapex.key",
10725 public_key: "testkey.avbpubkey",
10726 private_key: "testkey.pem",
10727 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010728 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010729 generateFsRule := mod.Rule("generateFsConfig")
10730 cmd := generateFsRule.RuleParams.Command
10731
10732 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10733}
10734
10735func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10736 ctx := testApex(t, `
10737 apex {
10738 name: "myapex",
10739 key: "myapex.key",
10740 canned_fs_config: "my_config",
10741 updatable: false,
10742 }
10743
10744 apex_key {
10745 name: "myapex.key",
10746 public_key: "testkey.avbpubkey",
10747 private_key: "testkey.pem",
10748 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010749 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010750 generateFsRule := mod.Rule("generateFsConfig")
10751 cmd := generateFsRule.RuleParams.Command
10752
10753 // Ensure that canned_fs_config has "cat my_config" at the end
10754 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10755}
Spandan Das20fce2d2023-04-12 17:21:39 +000010756
10757func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10758 testCases := []struct {
10759 desc string
10760 hasStubs bool
10761 apexAvailable string
10762 expectedError string
10763 }{
10764 {
10765 desc: "non-stub library can have multiple apex_available",
10766 hasStubs: false,
10767 apexAvailable: `["myapex", "otherapex"]`,
10768 },
10769 {
10770 desc: "stub library should not be available to anyapex",
10771 hasStubs: true,
10772 apexAvailable: `["//apex_available:anyapex"]`,
10773 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10774 },
10775 {
10776 desc: "stub library should not be available to multiple apexes",
10777 hasStubs: true,
10778 apexAvailable: `["myapex", "otherapex"]`,
10779 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10780 },
10781 {
10782 desc: "stub library can be available to a core apex and a test apex",
10783 hasStubs: true,
10784 apexAvailable: `["myapex", "test_myapex"]`,
10785 },
10786 }
10787 bpTemplate := `
10788 cc_library {
10789 name: "libfoo",
10790 %v
10791 apex_available: %v,
10792 }
10793 apex {
10794 name: "myapex",
10795 key: "apex.key",
10796 updatable: false,
10797 native_shared_libs: ["libfoo"],
10798 }
10799 apex {
10800 name: "otherapex",
10801 key: "apex.key",
10802 updatable: false,
10803 }
10804 apex_test {
10805 name: "test_myapex",
10806 key: "apex.key",
10807 updatable: false,
10808 native_shared_libs: ["libfoo"],
10809 }
10810 apex_key {
10811 name: "apex.key",
10812 }
10813 `
10814 for _, tc := range testCases {
10815 stubs := ""
10816 if tc.hasStubs {
10817 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10818 }
10819 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10820 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10821 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10822 })
10823 if tc.expectedError == "" {
10824 testApex(t, bp, mockFsFixturePreparer)
10825 } else {
10826 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10827 }
10828 }
10829}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010830
10831func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10832 context := android.GroupFixturePreparers(
10833 android.PrepareForIntegrationTestWithAndroid,
10834 cc.PrepareForIntegrationTestWithCc,
10835 PrepareForTestWithApexBuildComponents,
10836 prepareForTestWithMyapex,
10837 filesystem.PrepareForTestWithFilesystemBuildComponents,
10838 )
10839 result := context.RunTestWithBp(t, `
10840 android_system_image {
10841 name: "myfilesystem",
10842 deps: [
10843 "libfoo",
10844 ],
10845 linker_config_src: "linker.config.json",
10846 }
10847
10848 cc_library {
10849 name: "libfoo",
10850 shared_libs: [
10851 "libbar",
10852 ],
10853 stl: "none",
10854 }
10855
10856 cc_library {
10857 name: "libbar",
10858 stl: "none",
10859 apex_available: ["myapex"],
10860 }
10861
10862 apex {
10863 name: "myapex",
10864 native_shared_libs: ["libbar"],
10865 key: "myapex.key",
10866 updatable: false,
10867 }
10868
10869 apex_key {
10870 name: "myapex.key",
10871 public_key: "testkey.avbpubkey",
10872 private_key: "testkey.pem",
10873 }
10874 `)
10875
10876 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10877 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10878 inputs.Strings(),
10879 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10880}
Yu Liueae7b362023-11-16 17:05:47 -080010881
10882var apex_default_bp = `
10883 apex_key {
10884 name: "myapex.key",
10885 public_key: "testkey.avbpubkey",
10886 private_key: "testkey.pem",
10887 }
10888
10889 filegroup {
10890 name: "myapex.manifest",
10891 srcs: ["apex_manifest.json"],
10892 }
10893
10894 filegroup {
10895 name: "myapex.androidmanifest",
10896 srcs: ["AndroidManifest.xml"],
10897 }
10898`
10899
10900func TestAconfigFilesJavaDeps(t *testing.T) {
10901 ctx := testApex(t, apex_default_bp+`
10902 apex {
10903 name: "myapex",
10904 manifest: ":myapex.manifest",
10905 androidManifest: ":myapex.androidmanifest",
10906 key: "myapex.key",
10907 java_libs: [
10908 "my_java_library_foo",
10909 "my_java_library_bar",
10910 ],
10911 updatable: false,
10912 }
10913
10914 java_library {
10915 name: "my_java_library_foo",
10916 srcs: ["foo/bar/MyClass.java"],
10917 sdk_version: "none",
10918 system_modules: "none",
10919 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010920 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010921 "myapex",
10922 ],
10923 }
10924
10925 java_library {
10926 name: "my_java_library_bar",
10927 srcs: ["foo/bar/MyClass.java"],
10928 sdk_version: "none",
10929 system_modules: "none",
10930 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010931 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010932 "myapex",
10933 ],
10934 }
10935
10936 aconfig_declarations {
10937 name: "my_aconfig_declarations_foo",
10938 package: "com.example.package",
10939 container: "myapex",
10940 srcs: ["foo.aconfig"],
10941 }
10942
10943 java_aconfig_library {
10944 name: "my_java_aconfig_library_foo",
10945 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010946 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010947 "myapex",
10948 ],
10949 }
10950
10951 aconfig_declarations {
10952 name: "my_aconfig_declarations_bar",
10953 package: "com.example.package",
10954 container: "myapex",
10955 srcs: ["bar.aconfig"],
10956 }
10957
10958 java_aconfig_library {
10959 name: "my_java_aconfig_library_bar",
10960 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010961 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010962 "myapex",
10963 ],
10964 }
10965 `)
10966
10967 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10968 s := mod.Rule("apexRule").Args["copy_commands"]
10969 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10970 if len(copyCmds) != 5 {
10971 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10972 }
10973
10974 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10975
10976 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10977 s = " " + combineAconfigRule.Args["cache_files"]
10978 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10979 if len(aconfigArgs) != 2 {
10980 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
10981 }
10982 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10983 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
10984
10985 buildParams := combineAconfigRule.BuildParams
10986 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10987 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
10988 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10989}
10990
10991func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10992 ctx := testApex(t, apex_default_bp+`
10993 apex {
10994 name: "myapex",
10995 manifest: ":myapex.manifest",
10996 androidManifest: ":myapex.androidmanifest",
10997 key: "myapex.key",
10998 java_libs: [
10999 "my_java_library_foo",
11000 ],
11001 native_shared_libs: [
11002 "my_cc_library_bar",
11003 ],
11004 binaries: [
11005 "my_cc_binary_baz",
11006 ],
11007 updatable: false,
11008 }
11009
11010 java_library {
11011 name: "my_java_library_foo",
11012 srcs: ["foo/bar/MyClass.java"],
11013 sdk_version: "none",
11014 system_modules: "none",
11015 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011016 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011017 "myapex",
11018 ],
11019 }
11020
11021 cc_library {
11022 name: "my_cc_library_bar",
11023 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011024 static_libs: [
11025 "my_cc_aconfig_library_bar",
11026 "my_cc_aconfig_library_baz",
11027 ],
Yu Liueae7b362023-11-16 17:05:47 -080011028 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011029 "myapex",
11030 ],
11031 }
11032
11033 cc_binary {
11034 name: "my_cc_binary_baz",
11035 srcs: ["foo/bar/MyClass.cc"],
11036 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011037 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011038 "myapex",
11039 ],
11040 }
11041
11042 aconfig_declarations {
11043 name: "my_aconfig_declarations_foo",
11044 package: "com.example.package",
11045 container: "myapex",
11046 srcs: ["foo.aconfig"],
11047 }
11048
11049 java_aconfig_library {
11050 name: "my_java_aconfig_library_foo",
11051 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011052 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011053 "myapex",
11054 ],
11055 }
11056
11057 aconfig_declarations {
11058 name: "my_aconfig_declarations_bar",
11059 package: "com.example.package",
11060 container: "myapex",
11061 srcs: ["bar.aconfig"],
11062 }
11063
11064 cc_aconfig_library {
11065 name: "my_cc_aconfig_library_bar",
11066 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011067 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011068 "myapex",
11069 ],
11070 }
11071
11072 aconfig_declarations {
11073 name: "my_aconfig_declarations_baz",
11074 package: "com.example.package",
11075 container: "myapex",
11076 srcs: ["baz.aconfig"],
11077 }
11078
11079 cc_aconfig_library {
11080 name: "my_cc_aconfig_library_baz",
11081 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011082 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011083 "myapex",
11084 ],
11085 }
11086
11087 cc_library {
11088 name: "server_configurable_flags",
11089 srcs: ["server_configurable_flags.cc"],
11090 }
11091 `)
11092
11093 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11094 s := mod.Rule("apexRule").Args["copy_commands"]
11095 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11096 if len(copyCmds) != 9 {
11097 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11098 }
11099
11100 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11101
11102 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11103 s = " " + combineAconfigRule.Args["cache_files"]
11104 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11105 if len(aconfigArgs) != 3 {
11106 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11107 }
11108 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Colin Crossd788b3e2023-11-28 13:14:56 -080011109 android.EnsureListContainsSuffix(t, aconfigArgs, "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011110 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11111
11112 buildParams := combineAconfigRule.BuildParams
11113 if len(buildParams.Inputs) != 3 {
11114 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11115 }
11116 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Colin Crossd788b3e2023-11-28 13:14:56 -080011117 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011118 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11119 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11120}
11121
Yu Liucec0e412023-11-30 16:45:50 -080011122func TestAconfigFilesRustDeps(t *testing.T) {
11123 ctx := testApex(t, apex_default_bp+`
11124 apex {
11125 name: "myapex",
11126 manifest: ":myapex.manifest",
11127 androidManifest: ":myapex.androidmanifest",
11128 key: "myapex.key",
11129 native_shared_libs: [
11130 "libmy_rust_library",
11131 ],
11132 binaries: [
11133 "my_rust_binary",
11134 ],
11135 rust_dyn_libs: [
11136 "libmy_rust_dylib",
11137 ],
11138 updatable: false,
11139 }
11140
11141 rust_library {
11142 name: "libflags_rust", // test mock
11143 crate_name: "flags_rust",
11144 srcs: ["lib.rs"],
11145 apex_available: [
11146 "myapex",
11147 ],
11148 }
11149
11150 rust_library {
11151 name: "liblazy_static", // test mock
11152 crate_name: "lazy_static",
11153 srcs: ["src/lib.rs"],
11154 apex_available: [
11155 "myapex",
11156 ],
11157 }
11158
11159 rust_ffi_shared {
11160 name: "libmy_rust_library",
11161 srcs: ["src/lib.rs"],
11162 rustlibs: ["libmy_rust_aconfig_library_foo"],
11163 crate_name: "my_rust_library",
11164 apex_available: [
11165 "myapex",
11166 ],
11167 }
11168
11169 rust_library_dylib {
11170 name: "libmy_rust_dylib",
11171 srcs: ["foo/bar/MyClass.rs"],
11172 rustlibs: ["libmy_rust_aconfig_library_bar"],
11173 crate_name: "my_rust_dylib",
11174 apex_available: [
11175 "myapex",
11176 ],
11177 }
11178
11179 rust_binary {
11180 name: "my_rust_binary",
11181 srcs: ["foo/bar/MyClass.rs"],
11182 rustlibs: [
11183 "libmy_rust_aconfig_library_baz",
11184 "libmy_rust_dylib",
11185 ],
11186 apex_available: [
11187 "myapex",
11188 ],
11189 }
11190
11191 aconfig_declarations {
11192 name: "my_aconfig_declarations_foo",
11193 package: "com.example.package",
11194 container: "myapex",
11195 srcs: ["foo.aconfig"],
11196 }
11197
11198 aconfig_declarations {
11199 name: "my_aconfig_declarations_bar",
11200 package: "com.example.package",
11201 container: "myapex",
11202 srcs: ["bar.aconfig"],
11203 }
11204
11205 aconfig_declarations {
11206 name: "my_aconfig_declarations_baz",
11207 package: "com.example.package",
11208 container: "myapex",
11209 srcs: ["baz.aconfig"],
11210 }
11211
11212 rust_aconfig_library {
11213 name: "libmy_rust_aconfig_library_foo",
11214 aconfig_declarations: "my_aconfig_declarations_foo",
11215 crate_name: "my_rust_aconfig_library_foo",
11216 apex_available: [
11217 "myapex",
11218 ],
11219 }
11220
11221 rust_aconfig_library {
11222 name: "libmy_rust_aconfig_library_bar",
11223 aconfig_declarations: "my_aconfig_declarations_bar",
11224 crate_name: "my_rust_aconfig_library_bar",
11225 apex_available: [
11226 "myapex",
11227 ],
11228 }
11229
11230 rust_aconfig_library {
11231 name: "libmy_rust_aconfig_library_baz",
11232 aconfig_declarations: "my_aconfig_declarations_baz",
11233 crate_name: "my_rust_aconfig_library_baz",
11234 apex_available: [
11235 "myapex",
11236 ],
11237 }
11238 `)
11239
11240 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11241 s := mod.Rule("apexRule").Args["copy_commands"]
11242 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11243 if len(copyCmds) != 23 {
11244 t.Fatalf("Expected 23 commands, got %d in:\n%s", len(copyCmds), s)
11245 }
11246
11247 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11248
11249 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11250 s = " " + combineAconfigRule.Args["cache_files"]
11251 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11252 if len(aconfigArgs) != 2 {
11253 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11254 }
11255 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11256 android.EnsureListContainsSuffix(t, aconfigArgs, "my_rust_binary/android_arm64_armv8-a_apex10000/aconfig_merged.pb")
11257
11258 buildParams := combineAconfigRule.BuildParams
11259 if len(buildParams.Inputs) != 2 {
11260 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11261 }
11262 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11263 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_rust_binary/android_arm64_armv8-a_apex10000/aconfig_merged.pb")
11264 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11265}
11266
Yu Liueae7b362023-11-16 17:05:47 -080011267func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11268 ctx := testApex(t, apex_default_bp+`
11269 apex {
11270 name: "myapex",
11271 manifest: ":myapex.manifest",
11272 androidManifest: ":myapex.androidmanifest",
11273 key: "myapex.key",
11274 java_libs: [
11275 "my_java_library_foo",
11276 "other_java_library_bar",
11277 ],
11278 updatable: false,
11279 }
11280
11281 java_library {
11282 name: "my_java_library_foo",
11283 srcs: ["foo/bar/MyClass.java"],
11284 sdk_version: "none",
11285 system_modules: "none",
11286 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011287 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011288 "myapex",
11289 ],
11290 }
11291
11292 java_library {
11293 name: "other_java_library_bar",
11294 srcs: ["foo/bar/MyClass.java"],
11295 sdk_version: "none",
11296 system_modules: "none",
11297 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011298 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011299 "myapex",
11300 ],
11301 }
11302
11303 aconfig_declarations {
11304 name: "my_aconfig_declarations_foo",
11305 package: "com.example.package",
11306 container: "myapex",
11307 srcs: ["foo.aconfig"],
11308 }
11309
11310 java_aconfig_library {
11311 name: "my_java_aconfig_library_foo",
11312 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011313 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011314 "myapex",
11315 ],
11316 }
11317
11318 aconfig_declarations {
11319 name: "other_aconfig_declarations_bar",
11320 package: "com.example.package",
11321 container: "otherapex",
11322 srcs: ["bar.aconfig"],
11323 }
11324
11325 java_aconfig_library {
11326 name: "other_java_aconfig_library_bar",
11327 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011328 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011329 "myapex",
11330 ],
11331 }
11332 `)
11333
11334 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11335 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11336 s := " " + combineAconfigRule.Args["cache_files"]
11337 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11338 if len(aconfigArgs) != 1 {
11339 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11340 }
11341 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11342
11343 buildParams := combineAconfigRule.BuildParams
11344 if len(buildParams.Inputs) != 1 {
11345 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11346 }
11347 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11348 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11349}
11350
11351func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11352 ctx := testApex(t, apex_default_bp+`
11353 apex {
11354 name: "myapex",
11355 manifest: ":myapex.manifest",
11356 androidManifest: ":myapex.androidmanifest",
11357 key: "myapex.key",
11358 java_libs: [
11359 "my_java_library_foo",
11360 "my_java_library_bar",
11361 ],
11362 updatable: false,
11363 }
11364
11365 java_library {
11366 name: "my_java_library_foo",
11367 srcs: ["foo/bar/MyClass.java"],
11368 sdk_version: "none",
11369 system_modules: "none",
11370 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011371 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011372 "myapex",
11373 ],
11374 }
11375
11376 java_library {
11377 name: "my_java_library_bar",
11378 srcs: ["foo/bar/MyClass.java"],
11379 sdk_version: "none",
11380 system_modules: "none",
11381 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011382 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011383 "myapex",
11384 ],
11385 }
11386
11387 aconfig_declarations {
11388 name: "my_aconfig_declarations_foo",
11389 package: "com.example.package",
11390 container: "myapex",
11391 srcs: ["foo.aconfig"],
11392 }
11393
11394 java_aconfig_library {
11395 name: "my_java_aconfig_library_foo",
11396 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011397 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011398 "myapex",
11399 ],
11400 }
11401
11402 java_aconfig_library {
11403 name: "my_java_aconfig_library_bar",
11404 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011405 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011406 "myapex",
11407 ],
11408 }
11409 `)
11410
11411 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11412 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11413 s := " " + combineAconfigRule.Args["cache_files"]
11414 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11415 if len(aconfigArgs) != 1 {
11416 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11417 }
11418 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11419
11420 buildParams := combineAconfigRule.BuildParams
11421 if len(buildParams.Inputs) != 1 {
11422 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11423 }
11424 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11425 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11426}
Spandan Das5be63332023-12-13 00:06:32 +000011427
11428// Test that the boot jars come from the _selected_ apex prebuilt
11429// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11430func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11431 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11432 t.Helper()
11433 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11434 foundLibfooJar := false
11435 base := stem + ".jar"
11436 for _, output := range s.AllOutputs() {
11437 if filepath.Base(output) == base {
11438 foundLibfooJar = true
11439 buildRule := s.Output(output)
11440 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11441 }
11442 }
11443 if !foundLibfooJar {
11444 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11445 }
11446 }
11447
Spandan Das64c9e0c2023-12-20 20:13:34 +000011448 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11449 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11450 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11451 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11452 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11453 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)
11454 }
11455
11456 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11457 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11458 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11459 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11460 }
11461
Spandan Das5be63332023-12-13 00:06:32 +000011462 bp := `
11463 // Source APEX.
11464
11465 java_library {
11466 name: "framework-foo",
11467 srcs: ["foo.java"],
11468 installable: true,
11469 apex_available: [
11470 "com.android.foo",
11471 ],
11472 }
11473
11474 bootclasspath_fragment {
11475 name: "foo-bootclasspath-fragment",
11476 contents: ["framework-foo"],
11477 apex_available: [
11478 "com.android.foo",
11479 ],
11480 hidden_api: {
11481 split_packages: ["*"],
11482 },
11483 }
11484
11485 apex_key {
11486 name: "com.android.foo.key",
11487 public_key: "com.android.foo.avbpubkey",
11488 private_key: "com.android.foo.pem",
11489 }
11490
11491 apex {
11492 name: "com.android.foo",
11493 key: "com.android.foo.key",
11494 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11495 updatable: false,
11496 }
11497
11498 // Prebuilt APEX.
11499
11500 java_sdk_library_import {
11501 name: "framework-foo",
11502 public: {
11503 jars: ["foo.jar"],
11504 },
11505 apex_available: ["com.android.foo"],
11506 shared_library: false,
11507 }
11508
11509 prebuilt_bootclasspath_fragment {
11510 name: "foo-bootclasspath-fragment",
11511 contents: ["framework-foo"],
11512 hidden_api: {
11513 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11514 metadata: "my-bootclasspath-fragment/metadata.csv",
11515 index: "my-bootclasspath-fragment/index.csv",
11516 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11517 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11518 },
11519 apex_available: [
11520 "com.android.foo",
11521 ],
11522 }
11523
11524 prebuilt_apex {
11525 name: "com.android.foo",
11526 apex_name: "com.android.foo",
11527 src: "com.android.foo-arm.apex",
11528 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11529 }
11530
11531 // Another Prebuilt ART APEX
11532 prebuilt_apex {
11533 name: "com.android.foo.v2",
11534 apex_name: "com.android.foo", // Used to determine the API domain
11535 src: "com.android.foo-arm.apex",
11536 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11537 }
11538
11539 // APEX contribution modules
11540
11541 apex_contributions {
11542 name: "foo.source.contributions",
11543 api_domain: "com.android.foo",
11544 contents: ["com.android.foo"],
11545 }
11546
11547 apex_contributions {
11548 name: "foo.prebuilt.contributions",
11549 api_domain: "com.android.foo",
11550 contents: ["prebuilt_com.android.foo"],
11551 }
11552
11553 apex_contributions {
11554 name: "foo.prebuilt.v2.contributions",
11555 api_domain: "com.android.foo",
11556 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
11557 }
11558 `
11559
11560 testCases := []struct {
11561 desc string
11562 selectedApexContributions string
11563 expectedBootJar string
11564 }{
11565 {
11566 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11567 selectedApexContributions: "foo.source.contributions",
11568 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
11569 },
11570 {
11571 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11572 selectedApexContributions: "foo.prebuilt.contributions",
11573 expectedBootJar: "out/soong/.intermediates/com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
11574 },
11575 {
11576 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11577 selectedApexContributions: "foo.prebuilt.v2.contributions",
11578 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
11579 },
11580 }
11581
11582 fragment := java.ApexVariantReference{
11583 Apex: proptools.StringPtr("com.android.foo"),
11584 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11585 }
11586
11587 for _, tc := range testCases {
11588 preparer := android.GroupFixturePreparers(
11589 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11590 android.FixtureMergeMockFs(map[string][]byte{
11591 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11592 }),
11593 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11594 variables.BuildFlags = map[string]string{
11595 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11596 }
11597 }),
11598 )
11599 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
11600 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011601 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11602 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011603 }
11604}