blob: 3bc00ba3e0edb0d70353d12e2430a218d989cc5b [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,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001458 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459 stl: "none",
1460 system_shared_libs: [],
1461 stubs: { versions: ["1"] },
1462 apex_available: ["com.android.runtime"],
1463
1464 sanitize: {
1465 hwaddress: true,
1466 }
1467 }
1468
1469 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001470 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001471 no_libcrt: true,
1472 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001473 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001474 stl: "none",
1475 system_shared_libs: [],
1476 srcs: [""],
1477 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001478 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479
1480 sanitize: {
1481 never: true,
1482 },
Spandan Das4de7b492023-05-05 21:13:01 +00001483 apex_available: [
1484 "//apex_available:anyapex",
1485 "//apex_available:platform",
1486 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001487 } `)
1488 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489
Jooyung Hana0503a52023-08-23 13:12:50 +09001490 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 "lib64/bionic/libc.so",
1492 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1493 })
1494
Colin Cross4c4c1be2022-02-10 11:41:18 -08001495 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001496
1497 installed := hwasan.Description("install libclang_rt.hwasan")
1498 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1499
1500 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1501 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1502 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1503}
1504
1505func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001506 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001507 prepareForTestOfRuntimeApexWithHwasan,
1508 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1509 variables.SanitizeDevice = []string{"hwaddress"}
1510 }),
1511 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512 cc_library {
1513 name: "libc",
1514 no_libcrt: true,
1515 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001516 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001517 stl: "none",
1518 system_shared_libs: [],
1519 stubs: { versions: ["1"] },
1520 apex_available: ["com.android.runtime"],
1521 }
1522
1523 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001524 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001525 no_libcrt: true,
1526 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001527 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001528 stl: "none",
1529 system_shared_libs: [],
1530 srcs: [""],
1531 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001532 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001533
1534 sanitize: {
1535 never: true,
1536 },
Spandan Das4de7b492023-05-05 21:13:01 +00001537 apex_available: [
1538 "//apex_available:anyapex",
1539 "//apex_available:platform",
1540 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001541 }
Paul Duffina02cae32021-03-09 01:44:06 +00001542 `)
1543 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544
Jooyung Hana0503a52023-08-23 13:12:50 +09001545 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001546 "lib64/bionic/libc.so",
1547 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1548 })
1549
Colin Cross4c4c1be2022-02-10 11:41:18 -08001550 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001551
1552 installed := hwasan.Description("install libclang_rt.hwasan")
1553 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1554
1555 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1556 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1557 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1558}
1559
Jooyung Han61b66e92020-03-21 14:21:46 +00001560func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1561 testcases := []struct {
1562 name string
1563 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001564 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 shouldLink string
1566 shouldNotLink []string
1567 }{
1568 {
Jiyong Park55549df2021-02-26 23:57:23 +09001569 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001570 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001571 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001572 shouldLink: "current",
1573 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 },
1575 {
Jiyong Park55549df2021-02-26 23:57:23 +09001576 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001577 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001578 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001579 shouldLink: "current",
1580 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 },
1582 }
1583 for _, tc := range testcases {
1584 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001589 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001591 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001592 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001593
Jooyung Han61b66e92020-03-21 14:21:46 +00001594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 cc_library {
1601 name: "mylib",
1602 srcs: ["mylib.cpp"],
1603 vendor_available: true,
1604 shared_libs: ["libbar"],
1605 system_shared_libs: [],
1606 stl: "none",
1607 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001608 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Jooyung Han61b66e92020-03-21 14:21:46 +00001611 cc_library {
1612 name: "libbar",
1613 srcs: ["mylib.cpp"],
1614 system_shared_libs: [],
1615 stl: "none",
1616 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001617 llndk: {
1618 symbol_file: "libbar.map.txt",
1619 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001620 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001621 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001622 withUnbundledBuild,
1623 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001624
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001626 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001627 "lib64/mylib.so",
1628 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001629
Jooyung Han61b66e92020-03-21 14:21:46 +00001630 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001631 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001632 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1633 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001634
Steven Moreland2c4000c2021-04-27 02:08:49 +00001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1636 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001638 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001640
Steven Moreland2c4000c2021-04-27 02:08:49 +00001641 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ver := tc.shouldLink
1643 if tc.shouldLink == "current" {
1644 ver = strconv.Itoa(android.FutureApiLevelInt)
1645 }
1646 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 })
1648 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001649}
1650
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001652 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 apex {
1654 name: "myapex",
1655 key: "myapex.key",
1656 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001657 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001658 }
1659
1660 apex_key {
1661 name: "myapex.key",
1662 public_key: "testkey.avbpubkey",
1663 private_key: "testkey.pem",
1664 }
1665
1666 cc_library {
1667 name: "mylib",
1668 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001669 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 shared_libs: ["libdl#27"],
1671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001672 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001673 }
1674
1675 cc_library_shared {
1676 name: "mylib_shared",
1677 srcs: ["mylib.cpp"],
1678 shared_libs: ["libdl#27"],
1679 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001680 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 }
1682
1683 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001684 name: "libBootstrap",
1685 srcs: ["mylib.cpp"],
1686 stl: "none",
1687 bootstrap: true,
1688 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 `)
1690
Jooyung Hana0503a52023-08-23 13:12:50 +09001691 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001692 copyCmds := apexRule.Args["copy_commands"]
1693
1694 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001695 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001696 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1697 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698
1699 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001700 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701
Colin Crossaede88c2020-08-11 12:17:01 -07001702 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1703 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1704 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001705
1706 // For dependency to libc
1707 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001709 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001710 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001711 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001712 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1713 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714
1715 // For dependency to libm
1716 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001717 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001719 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001720 // ... and is not compiling with the stub
1721 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1722 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1723
1724 // For dependency to libdl
1725 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001726 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001727 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001728 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1729 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001730 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001731 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001732 // ... Cflags from stub is correctly exported to mylib
1733 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1734 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001735
1736 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001737 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1738 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1739 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1740 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001742
Jooyung Han749dc692020-04-15 11:03:39 +09001743func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001744 // there are three links between liba --> libz.
1745 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001746 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001747 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001748 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001749 apex {
1750 name: "myapex",
1751 key: "myapex.key",
1752 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001753 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 apex {
1757 name: "otherapex",
1758 key: "myapex.key",
1759 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001760 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001761 }
1762
1763 apex_key {
1764 name: "myapex.key",
1765 public_key: "testkey.avbpubkey",
1766 private_key: "testkey.pem",
1767 }
1768
1769 cc_library {
1770 name: "libx",
1771 shared_libs: ["liba"],
1772 system_shared_libs: [],
1773 stl: "none",
1774 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001775 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001776 }
1777
1778 cc_library {
1779 name: "liby",
1780 shared_libs: ["liba"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001785 }
1786
1787 cc_library {
1788 name: "liba",
1789 shared_libs: ["libz"],
1790 system_shared_libs: [],
1791 stl: "none",
1792 apex_available: [
1793 "//apex_available:anyapex",
1794 "//apex_available:platform",
1795 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001796 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001797 }
1798
1799 cc_library {
1800 name: "libz",
1801 system_shared_libs: [],
1802 stl: "none",
1803 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001804 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001805 },
1806 }
Jooyung Han749dc692020-04-15 11:03:39 +09001807 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001808
1809 expectLink := func(from, from_variant, to, to_variant string) {
1810 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1811 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1812 }
1813 expectNoLink := func(from, from_variant, to, to_variant string) {
1814 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1815 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1816 }
1817 // platform liba is linked to non-stub version
1818 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001819 // liba in myapex is linked to current
1820 expectLink("liba", "shared_apex29", "libz", "shared_current")
1821 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001822 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001823 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001824 // liba in otherapex is linked to current
1825 expectLink("liba", "shared_apex30", "libz", "shared_current")
1826 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001827 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1828 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001829}
1830
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001832 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001833 apex {
1834 name: "myapex",
1835 key: "myapex.key",
1836 native_shared_libs: ["libx"],
1837 min_sdk_version: "R",
1838 }
1839
1840 apex_key {
1841 name: "myapex.key",
1842 public_key: "testkey.avbpubkey",
1843 private_key: "testkey.pem",
1844 }
1845
1846 cc_library {
1847 name: "libx",
1848 shared_libs: ["libz"],
1849 system_shared_libs: [],
1850 stl: "none",
1851 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001852 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001853 }
1854
1855 cc_library {
1856 name: "libz",
1857 system_shared_libs: [],
1858 stl: "none",
1859 stubs: {
1860 versions: ["29", "R"],
1861 },
1862 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001863 `,
1864 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1865 variables.Platform_version_active_codenames = []string{"R"}
1866 }),
1867 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001868
1869 expectLink := func(from, from_variant, to, to_variant string) {
1870 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1871 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1872 }
1873 expectNoLink := func(from, from_variant, to, to_variant string) {
1874 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1875 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1876 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001877 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1878 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001879 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1880 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001881}
1882
Jooyung Han4c4da062021-06-23 10:23:16 +09001883func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1884 testApex(t, `
1885 apex {
1886 name: "myapex",
1887 key: "myapex.key",
1888 java_libs: ["libx"],
1889 min_sdk_version: "S",
1890 }
1891
1892 apex_key {
1893 name: "myapex.key",
1894 public_key: "testkey.avbpubkey",
1895 private_key: "testkey.pem",
1896 }
1897
1898 java_library {
1899 name: "libx",
1900 srcs: ["a.java"],
1901 apex_available: [ "myapex" ],
1902 sdk_version: "current",
1903 min_sdk_version: "S", // should be okay
1904 }
1905 `,
1906 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1907 variables.Platform_version_active_codenames = []string{"S"}
1908 variables.Platform_sdk_codename = proptools.StringPtr("S")
1909 }),
1910 )
1911}
1912
Jooyung Han749dc692020-04-15 11:03:39 +09001913func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001914 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001915 apex {
1916 name: "myapex",
1917 key: "myapex.key",
1918 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001919 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001920 }
1921
1922 apex_key {
1923 name: "myapex.key",
1924 public_key: "testkey.avbpubkey",
1925 private_key: "testkey.pem",
1926 }
1927
1928 cc_library {
1929 name: "libx",
1930 shared_libs: ["libz"],
1931 system_shared_libs: [],
1932 stl: "none",
1933 apex_available: [ "myapex" ],
1934 }
1935
1936 cc_library {
1937 name: "libz",
1938 system_shared_libs: [],
1939 stl: "none",
1940 stubs: {
1941 versions: ["1", "2"],
1942 },
1943 }
1944 `)
1945
1946 expectLink := func(from, from_variant, to, to_variant string) {
1947 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1948 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1949 }
1950 expectNoLink := func(from, from_variant, to, to_variant string) {
1951 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1952 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1953 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001954 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001955 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001956 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001957 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001958}
1959
Jooyung Handfc864c2023-03-20 18:19:07 +09001960func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001961 ctx := testApex(t, `
1962 apex {
1963 name: "myapex",
1964 key: "myapex.key",
1965 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001966 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001967 vendor: true,
1968 min_sdk_version: "29",
1969 }
1970
1971 apex_key {
1972 name: "myapex.key",
1973 public_key: "testkey.avbpubkey",
1974 private_key: "testkey.pem",
1975 }
1976
1977 cc_library {
1978 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001979 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001980 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001981 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001982 shared_libs: ["libbar"],
1983 }
1984
1985 cc_library {
1986 name: "libbar",
1987 stubs: { versions: ["29", "30"] },
1988 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001989 }
1990 `)
1991
1992 vendorVariant := "android_vendor.29_arm64_armv8-a"
1993
Jooyung Handfc864c2023-03-20 18:19:07 +09001994 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1995
1996 // Ensure that mylib links with "current" LLNDK
1997 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1998 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1999
2000 // Ensure that mylib is targeting 29
2001 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2002 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2003
2004 // Ensure that the correct variant of crtbegin_so is used.
2005 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2006 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002007
2008 // Ensure that the crtbegin_so used by the APEX is targeting 29
2009 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2010 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2011}
2012
Jooyung Han4495f842023-04-25 16:39:59 +09002013func TestTrackAllowedDeps(t *testing.T) {
2014 ctx := testApex(t, `
2015 apex {
2016 name: "myapex",
2017 key: "myapex.key",
2018 updatable: true,
2019 native_shared_libs: [
2020 "mylib",
2021 "yourlib",
2022 ],
2023 min_sdk_version: "29",
2024 }
2025
2026 apex {
2027 name: "myapex2",
2028 key: "myapex.key",
2029 updatable: false,
2030 native_shared_libs: ["yourlib"],
2031 }
2032
2033 apex_key {
2034 name: "myapex.key",
2035 public_key: "testkey.avbpubkey",
2036 private_key: "testkey.pem",
2037 }
2038
2039 cc_library {
2040 name: "mylib",
2041 srcs: ["mylib.cpp"],
2042 shared_libs: ["libbar"],
2043 min_sdk_version: "29",
2044 apex_available: ["myapex"],
2045 }
2046
2047 cc_library {
2048 name: "libbar",
2049 stubs: { versions: ["29", "30"] },
2050 }
2051
2052 cc_library {
2053 name: "yourlib",
2054 srcs: ["mylib.cpp"],
2055 min_sdk_version: "29",
2056 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2057 }
2058 `, withFiles(android.MockFS{
2059 "packages/modules/common/build/allowed_deps.txt": nil,
2060 }))
2061
2062 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2063 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2064 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002065 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002066 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002067 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002068
Jooyung Hana0503a52023-08-23 13:12:50 +09002069 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002070 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2071 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002072 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2073 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2074 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2075 flatlist, "mylib:(minSdkVersion:29)")
2076 android.AssertStringListContains(t, "track platform-available lib",
2077 flatlist, "yourlib(minSdkVersion:29)")
2078}
2079
2080func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2081 ctx := testApex(t, `
2082 apex {
2083 name: "myapex",
2084 key: "myapex.key",
2085 updatable: true,
2086 min_sdk_version: "29",
2087 }
2088
2089 apex_key {
2090 name: "myapex.key",
2091 public_key: "testkey.avbpubkey",
2092 private_key: "testkey.pem",
2093 }
2094 `)
2095 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2096 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2097 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2098 }
2099}
2100
Jooyung Han03b51852020-02-26 22:45:42 +09002101func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002102 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002103 apex {
2104 name: "myapex",
2105 key: "myapex.key",
2106 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002107 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002108 }
2109
2110 apex_key {
2111 name: "myapex.key",
2112 public_key: "testkey.avbpubkey",
2113 private_key: "testkey.pem",
2114 }
2115
2116 cc_library {
2117 name: "libx",
2118 system_shared_libs: [],
2119 stl: "none",
2120 apex_available: [ "myapex" ],
2121 stubs: {
2122 versions: ["1", "2"],
2123 },
2124 }
2125
2126 cc_library {
2127 name: "libz",
2128 shared_libs: ["libx"],
2129 system_shared_libs: [],
2130 stl: "none",
2131 }
2132 `)
2133
2134 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002135 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002136 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2137 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2138 }
2139 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002140 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002141 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2142 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2143 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002144 expectLink("libz", "shared", "libx", "shared_current")
2145 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002146 expectNoLink("libz", "shared", "libz", "shared_1")
2147 expectNoLink("libz", "shared", "libz", "shared")
2148}
2149
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002150var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2151 func(variables android.FixtureProductVariables) {
2152 variables.SanitizeDevice = []string{"hwaddress"}
2153 },
2154)
2155
Jooyung Han75568392020-03-20 04:29:24 +09002156func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002157 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002158 apex {
2159 name: "myapex",
2160 key: "myapex.key",
2161 native_shared_libs: ["libx"],
2162 min_sdk_version: "29",
2163 }
2164
2165 apex_key {
2166 name: "myapex.key",
2167 public_key: "testkey.avbpubkey",
2168 private_key: "testkey.pem",
2169 }
2170
2171 cc_library {
2172 name: "libx",
2173 shared_libs: ["libbar"],
2174 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002176 }
2177
2178 cc_library {
2179 name: "libbar",
2180 stubs: {
2181 versions: ["29", "30"],
2182 },
2183 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002184 `,
2185 prepareForTestWithSantitizeHwaddress,
2186 )
Jooyung Han03b51852020-02-26 22:45:42 +09002187 expectLink := func(from, from_variant, to, to_variant string) {
2188 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2189 libFlags := ld.Args["libFlags"]
2190 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2191 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002192 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002193}
2194
Jooyung Han75568392020-03-20 04:29:24 +09002195func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002196 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002197 apex {
2198 name: "myapex",
2199 key: "myapex.key",
2200 native_shared_libs: ["libx"],
2201 min_sdk_version: "29",
2202 }
2203
2204 apex_key {
2205 name: "myapex.key",
2206 public_key: "testkey.avbpubkey",
2207 private_key: "testkey.pem",
2208 }
2209
2210 cc_library {
2211 name: "libx",
2212 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002213 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002214 }
Jooyung Han75568392020-03-20 04:29:24 +09002215 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002216
2217 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002218 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002219 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002220 // note that platform variant is not.
2221 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002222 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002223}
2224
Jooyung Han749dc692020-04-15 11:03:39 +09002225func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2226 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002227 apex {
2228 name: "myapex",
2229 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002230 native_shared_libs: ["mylib"],
2231 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002232 }
2233
2234 apex_key {
2235 name: "myapex.key",
2236 public_key: "testkey.avbpubkey",
2237 private_key: "testkey.pem",
2238 }
Jooyung Han749dc692020-04-15 11:03:39 +09002239
2240 cc_library {
2241 name: "mylib",
2242 srcs: ["mylib.cpp"],
2243 system_shared_libs: [],
2244 stl: "none",
2245 apex_available: [
2246 "myapex",
2247 ],
2248 min_sdk_version: "30",
2249 }
2250 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002251
2252 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2253 apex {
2254 name: "myapex",
2255 key: "myapex.key",
2256 native_shared_libs: ["libfoo.ffi"],
2257 min_sdk_version: "29",
2258 }
2259
2260 apex_key {
2261 name: "myapex.key",
2262 public_key: "testkey.avbpubkey",
2263 private_key: "testkey.pem",
2264 }
2265
2266 rust_ffi_shared {
2267 name: "libfoo.ffi",
2268 srcs: ["foo.rs"],
2269 crate_name: "foo",
2270 apex_available: [
2271 "myapex",
2272 ],
2273 min_sdk_version: "30",
2274 }
2275 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002276
2277 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2278 apex {
2279 name: "myapex",
2280 key: "myapex.key",
2281 java_libs: ["libfoo"],
2282 min_sdk_version: "29",
2283 }
2284
2285 apex_key {
2286 name: "myapex.key",
2287 public_key: "testkey.avbpubkey",
2288 private_key: "testkey.pem",
2289 }
2290
2291 java_import {
2292 name: "libfoo",
2293 jars: ["libfoo.jar"],
2294 apex_available: [
2295 "myapex",
2296 ],
2297 min_sdk_version: "30",
2298 }
2299 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002300
2301 // Skip check for modules compiling against core API surface
2302 testApex(t, `
2303 apex {
2304 name: "myapex",
2305 key: "myapex.key",
2306 java_libs: ["libfoo"],
2307 min_sdk_version: "29",
2308 }
2309
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315
2316 java_library {
2317 name: "libfoo",
2318 srcs: ["Foo.java"],
2319 apex_available: [
2320 "myapex",
2321 ],
2322 // Compile against core API surface
2323 sdk_version: "core_current",
2324 min_sdk_version: "30",
2325 }
2326 `)
2327
Jooyung Han749dc692020-04-15 11:03:39 +09002328}
2329
2330func TestApexMinSdkVersion_Okay(t *testing.T) {
2331 testApex(t, `
2332 apex {
2333 name: "myapex",
2334 key: "myapex.key",
2335 native_shared_libs: ["libfoo"],
2336 java_libs: ["libbar"],
2337 min_sdk_version: "29",
2338 }
2339
2340 apex_key {
2341 name: "myapex.key",
2342 public_key: "testkey.avbpubkey",
2343 private_key: "testkey.pem",
2344 }
2345
2346 cc_library {
2347 name: "libfoo",
2348 srcs: ["mylib.cpp"],
2349 shared_libs: ["libfoo_dep"],
2350 apex_available: ["myapex"],
2351 min_sdk_version: "29",
2352 }
2353
2354 cc_library {
2355 name: "libfoo_dep",
2356 srcs: ["mylib.cpp"],
2357 apex_available: ["myapex"],
2358 min_sdk_version: "29",
2359 }
2360
2361 java_library {
2362 name: "libbar",
2363 sdk_version: "current",
2364 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002365 static_libs: [
2366 "libbar_dep",
2367 "libbar_import_dep",
2368 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002369 apex_available: ["myapex"],
2370 min_sdk_version: "29",
2371 }
2372
2373 java_library {
2374 name: "libbar_dep",
2375 sdk_version: "current",
2376 srcs: ["a.java"],
2377 apex_available: ["myapex"],
2378 min_sdk_version: "29",
2379 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002380
2381 java_import {
2382 name: "libbar_import_dep",
2383 jars: ["libbar.jar"],
2384 apex_available: ["myapex"],
2385 min_sdk_version: "29",
2386 }
Jooyung Han03b51852020-02-26 22:45:42 +09002387 `)
2388}
2389
Colin Cross8ca61c12022-10-06 21:00:14 -07002390func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2391 // Tests that an apex dependency with min_sdk_version higher than the
2392 // min_sdk_version of the apex is allowed as long as the dependency's
2393 // min_sdk_version is less than or equal to the api level that the
2394 // architecture was introduced in. In this case, arm64 didn't exist
2395 // until api level 21, so the arm64 code will never need to run on
2396 // an api level 20 device, even if other architectures of the apex
2397 // will.
2398 testApex(t, `
2399 apex {
2400 name: "myapex",
2401 key: "myapex.key",
2402 native_shared_libs: ["libfoo"],
2403 min_sdk_version: "20",
2404 }
2405
2406 apex_key {
2407 name: "myapex.key",
2408 public_key: "testkey.avbpubkey",
2409 private_key: "testkey.pem",
2410 }
2411
2412 cc_library {
2413 name: "libfoo",
2414 srcs: ["mylib.cpp"],
2415 apex_available: ["myapex"],
2416 min_sdk_version: "21",
2417 stl: "none",
2418 }
2419 `)
2420}
2421
Artur Satayev8cf899a2020-04-15 17:29:42 +01002422func TestJavaStableSdkVersion(t *testing.T) {
2423 testCases := []struct {
2424 name string
2425 expectedError string
2426 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002427 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002428 }{
2429 {
2430 name: "Non-updatable apex with non-stable dep",
2431 bp: `
2432 apex {
2433 name: "myapex",
2434 java_libs: ["myjar"],
2435 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002436 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002437 }
2438 apex_key {
2439 name: "myapex.key",
2440 public_key: "testkey.avbpubkey",
2441 private_key: "testkey.pem",
2442 }
2443 java_library {
2444 name: "myjar",
2445 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002446 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002447 apex_available: ["myapex"],
2448 }
2449 `,
2450 },
2451 {
2452 name: "Updatable apex with stable dep",
2453 bp: `
2454 apex {
2455 name: "myapex",
2456 java_libs: ["myjar"],
2457 key: "myapex.key",
2458 updatable: true,
2459 min_sdk_version: "29",
2460 }
2461 apex_key {
2462 name: "myapex.key",
2463 public_key: "testkey.avbpubkey",
2464 private_key: "testkey.pem",
2465 }
2466 java_library {
2467 name: "myjar",
2468 srcs: ["foo/bar/MyClass.java"],
2469 sdk_version: "current",
2470 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002471 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002472 }
2473 `,
2474 },
2475 {
2476 name: "Updatable apex with non-stable dep",
2477 expectedError: "cannot depend on \"myjar\"",
2478 bp: `
2479 apex {
2480 name: "myapex",
2481 java_libs: ["myjar"],
2482 key: "myapex.key",
2483 updatable: true,
2484 }
2485 apex_key {
2486 name: "myapex.key",
2487 public_key: "testkey.avbpubkey",
2488 private_key: "testkey.pem",
2489 }
2490 java_library {
2491 name: "myjar",
2492 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002493 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002494 apex_available: ["myapex"],
2495 }
2496 `,
2497 },
2498 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002499 name: "Updatable apex with non-stable legacy core platform dep",
2500 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2501 bp: `
2502 apex {
2503 name: "myapex",
2504 java_libs: ["myjar-uses-legacy"],
2505 key: "myapex.key",
2506 updatable: true,
2507 }
2508 apex_key {
2509 name: "myapex.key",
2510 public_key: "testkey.avbpubkey",
2511 private_key: "testkey.pem",
2512 }
2513 java_library {
2514 name: "myjar-uses-legacy",
2515 srcs: ["foo/bar/MyClass.java"],
2516 sdk_version: "core_platform",
2517 apex_available: ["myapex"],
2518 }
2519 `,
2520 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2521 },
2522 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002523 name: "Updatable apex with non-stable transitive dep",
2524 // This is not actually detecting that the transitive dependency is unstable, rather it is
2525 // detecting that the transitive dependency is building against a wider API surface than the
2526 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002527 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002528 bp: `
2529 apex {
2530 name: "myapex",
2531 java_libs: ["myjar"],
2532 key: "myapex.key",
2533 updatable: true,
2534 }
2535 apex_key {
2536 name: "myapex.key",
2537 public_key: "testkey.avbpubkey",
2538 private_key: "testkey.pem",
2539 }
2540 java_library {
2541 name: "myjar",
2542 srcs: ["foo/bar/MyClass.java"],
2543 sdk_version: "current",
2544 apex_available: ["myapex"],
2545 static_libs: ["transitive-jar"],
2546 }
2547 java_library {
2548 name: "transitive-jar",
2549 srcs: ["foo/bar/MyClass.java"],
2550 sdk_version: "core_platform",
2551 apex_available: ["myapex"],
2552 }
2553 `,
2554 },
2555 }
2556
2557 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002558 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2559 continue
2560 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002561 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 errorHandler := android.FixtureExpectsNoErrors
2563 if test.expectedError != "" {
2564 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002565 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002566 android.GroupFixturePreparers(
2567 java.PrepareForTestWithJavaDefaultModules,
2568 PrepareForTestWithApexBuildComponents,
2569 prepareForTestWithMyapex,
2570 android.OptionalFixturePreparer(test.preparer),
2571 ).
2572 ExtendWithErrorHandler(errorHandler).
2573 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002574 })
2575 }
2576}
2577
Jooyung Han749dc692020-04-15 11:03:39 +09002578func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2579 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2580 apex {
2581 name: "myapex",
2582 key: "myapex.key",
2583 native_shared_libs: ["mylib"],
2584 min_sdk_version: "29",
2585 }
2586
2587 apex_key {
2588 name: "myapex.key",
2589 public_key: "testkey.avbpubkey",
2590 private_key: "testkey.pem",
2591 }
2592
2593 cc_library {
2594 name: "mylib",
2595 srcs: ["mylib.cpp"],
2596 shared_libs: ["mylib2"],
2597 system_shared_libs: [],
2598 stl: "none",
2599 apex_available: [
2600 "myapex",
2601 ],
2602 min_sdk_version: "29",
2603 }
2604
2605 // indirect part of the apex
2606 cc_library {
2607 name: "mylib2",
2608 srcs: ["mylib.cpp"],
2609 system_shared_libs: [],
2610 stl: "none",
2611 apex_available: [
2612 "myapex",
2613 ],
2614 min_sdk_version: "30",
2615 }
2616 `)
2617}
2618
2619func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2620 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2621 apex {
2622 name: "myapex",
2623 key: "myapex.key",
2624 apps: ["AppFoo"],
2625 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002626 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002627 }
2628
2629 apex_key {
2630 name: "myapex.key",
2631 public_key: "testkey.avbpubkey",
2632 private_key: "testkey.pem",
2633 }
2634
2635 android_app {
2636 name: "AppFoo",
2637 srcs: ["foo/bar/MyClass.java"],
2638 sdk_version: "current",
2639 min_sdk_version: "29",
2640 system_modules: "none",
2641 stl: "none",
2642 static_libs: ["bar"],
2643 apex_available: [ "myapex" ],
2644 }
2645
2646 java_library {
2647 name: "bar",
2648 sdk_version: "current",
2649 srcs: ["a.java"],
2650 apex_available: [ "myapex" ],
2651 }
2652 `)
2653}
2654
2655func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002656 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002657 apex {
2658 name: "myapex",
2659 key: "myapex.key",
2660 native_shared_libs: ["mylib"],
2661 min_sdk_version: "29",
2662 }
2663
2664 apex_key {
2665 name: "myapex.key",
2666 public_key: "testkey.avbpubkey",
2667 private_key: "testkey.pem",
2668 }
2669
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002670 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002671 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2672 cc_library {
2673 name: "mylib",
2674 srcs: ["mylib.cpp"],
2675 shared_libs: ["mylib2"],
2676 system_shared_libs: [],
2677 stl: "none",
2678 apex_available: ["myapex", "otherapex"],
2679 min_sdk_version: "29",
2680 }
2681
2682 cc_library {
2683 name: "mylib2",
2684 srcs: ["mylib.cpp"],
2685 system_shared_libs: [],
2686 stl: "none",
2687 apex_available: ["otherapex"],
2688 stubs: { versions: ["29", "30"] },
2689 min_sdk_version: "30",
2690 }
2691
2692 apex {
2693 name: "otherapex",
2694 key: "myapex.key",
2695 native_shared_libs: ["mylib", "mylib2"],
2696 min_sdk_version: "30",
2697 }
2698 `)
2699 expectLink := func(from, from_variant, to, to_variant string) {
2700 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2701 libFlags := ld.Args["libFlags"]
2702 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2703 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002704 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002705 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002706}
2707
Jooyung Haned124c32021-01-26 11:43:46 +09002708func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002709 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2710 func(variables android.FixtureProductVariables) {
2711 variables.Platform_sdk_codename = proptools.StringPtr("S")
2712 variables.Platform_version_active_codenames = []string{"S"}
2713 },
2714 )
Jooyung Haned124c32021-01-26 11:43:46 +09002715 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2716 apex {
2717 name: "myapex",
2718 key: "myapex.key",
2719 native_shared_libs: ["libfoo"],
2720 min_sdk_version: "S",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 cc_library {
2728 name: "libfoo",
2729 shared_libs: ["libbar"],
2730 apex_available: ["myapex"],
2731 min_sdk_version: "29",
2732 }
2733 cc_library {
2734 name: "libbar",
2735 apex_available: ["myapex"],
2736 }
2737 `, withSAsActiveCodeNames)
2738}
2739
2740func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002741 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2742 variables.Platform_sdk_codename = proptools.StringPtr("S")
2743 variables.Platform_version_active_codenames = []string{"S", "T"}
2744 })
Colin Cross1c460562021-02-16 17:55:47 -08002745 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002746 apex {
2747 name: "myapex",
2748 key: "myapex.key",
2749 native_shared_libs: ["libfoo"],
2750 min_sdk_version: "S",
2751 }
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757 cc_library {
2758 name: "libfoo",
2759 shared_libs: ["libbar"],
2760 apex_available: ["myapex"],
2761 min_sdk_version: "S",
2762 }
2763 cc_library {
2764 name: "libbar",
2765 stubs: {
2766 symbol_file: "libbar.map.txt",
2767 versions: ["30", "S", "T"],
2768 },
2769 }
2770 `, withSAsActiveCodeNames)
2771
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002772 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002773 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2774 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002775 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002776}
2777
Jiyong Park7c2ee712018-12-07 00:42:25 +09002778func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002779 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002780 apex {
2781 name: "myapex",
2782 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002783 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002784 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002785 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002786 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002787 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 }
2789
2790 apex_key {
2791 name: "myapex.key",
2792 public_key: "testkey.avbpubkey",
2793 private_key: "testkey.pem",
2794 }
2795
2796 prebuilt_etc {
2797 name: "myetc",
2798 src: "myprebuilt",
2799 sub_dir: "foo/bar",
2800 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002801
2802 cc_library {
2803 name: "mylib",
2804 srcs: ["mylib.cpp"],
2805 relative_install_path: "foo/bar",
2806 system_shared_libs: [],
2807 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002808 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002809 }
2810
2811 cc_binary {
2812 name: "mybin",
2813 srcs: ["mylib.cpp"],
2814 relative_install_path: "foo/bar",
2815 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002817 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002818 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002819
2820 rust_binary {
2821 name: "mybin.rust",
2822 srcs: ["foo.rs"],
2823 relative_install_path: "rust_subdir",
2824 apex_available: [ "myapex" ],
2825 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002826 `)
2827
Jooyung Hana0503a52023-08-23 13:12:50 +09002828 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002829 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002830
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002831 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002832 ensureContains(t, cmd, "/etc ")
2833 ensureContains(t, cmd, "/etc/foo ")
2834 ensureContains(t, cmd, "/etc/foo/bar ")
2835 ensureContains(t, cmd, "/lib64 ")
2836 ensureContains(t, cmd, "/lib64/foo ")
2837 ensureContains(t, cmd, "/lib64/foo/bar ")
2838 ensureContains(t, cmd, "/lib ")
2839 ensureContains(t, cmd, "/lib/foo ")
2840 ensureContains(t, cmd, "/lib/foo/bar ")
2841 ensureContains(t, cmd, "/bin ")
2842 ensureContains(t, cmd, "/bin/foo ")
2843 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002844 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002845}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002846
Jooyung Han35155c42020-02-06 17:33:20 +09002847func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002848 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002849 apex {
2850 name: "myapex",
2851 key: "myapex.key",
2852 multilib: {
2853 both: {
2854 native_shared_libs: ["mylib"],
2855 binaries: ["mybin"],
2856 },
2857 },
2858 compile_multilib: "both",
2859 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002860 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 cc_library {
2870 name: "mylib",
2871 relative_install_path: "foo/bar",
2872 system_shared_libs: [],
2873 stl: "none",
2874 apex_available: [ "myapex" ],
2875 native_bridge_supported: true,
2876 }
2877
2878 cc_binary {
2879 name: "mybin",
2880 relative_install_path: "foo/bar",
2881 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002882 stl: "none",
2883 apex_available: [ "myapex" ],
2884 native_bridge_supported: true,
2885 compile_multilib: "both", // default is "first" for binary
2886 multilib: {
2887 lib64: {
2888 suffix: "64",
2889 },
2890 },
2891 }
2892 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002893 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002894 "bin/foo/bar/mybin",
2895 "bin/foo/bar/mybin64",
2896 "bin/arm/foo/bar/mybin",
2897 "bin/arm64/foo/bar/mybin64",
2898 "lib/foo/bar/mylib.so",
2899 "lib/arm/foo/bar/mylib.so",
2900 "lib64/foo/bar/mylib.so",
2901 "lib64/arm64/foo/bar/mylib.so",
2902 })
2903}
2904
Jooyung Han85d61762020-06-24 23:50:26 +09002905func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002906 result := android.GroupFixturePreparers(
2907 prepareForApexTest,
2908 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2909 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 binaries: ["mybin"],
2914 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002915 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002916 }
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922 cc_binary {
2923 name: "mybin",
2924 vendor: true,
2925 shared_libs: ["libfoo"],
2926 }
2927 cc_library {
2928 name: "libfoo",
2929 proprietary: true,
2930 }
2931 `)
2932
Jooyung Hana0503a52023-08-23 13:12:50 +09002933 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002934 "bin/mybin",
2935 "lib64/libfoo.so",
2936 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2937 "lib64/libc++.so",
2938 })
2939
Jooyung Hana0503a52023-08-23 13:12:50 +09002940 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002941 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002942 name := apexBundle.BaseModuleName()
2943 prefix := "TARGET_"
2944 var builder strings.Builder
2945 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002946 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002947 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002948 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002949
Jooyung Hana0503a52023-08-23 13:12:50 +09002950 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002951 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2952 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002953}
2954
Jooyung Hanc5a96762022-02-04 11:54:50 +09002955func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2956 testApexError(t, `Trying to include a VNDK library`, `
2957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2961 vendor: true,
2962 use_vndk_as_stable: true,
2963 updatable: false,
2964 }
2965 apex_key {
2966 name: "myapex.key",
2967 public_key: "testkey.avbpubkey",
2968 private_key: "testkey.pem",
2969 }`)
2970}
2971
Jooyung Handf78e212020-07-22 15:54:47 +09002972func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002973 // myapex myapex2
2974 // | |
2975 // mybin ------. mybin2
2976 // \ \ / |
2977 // (stable) .---\--------` |
2978 // \ / \ |
2979 // \ / \ /
2980 // libvndk libvendor
2981 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002982 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002983 apex {
2984 name: "myapex",
2985 key: "myapex.key",
2986 binaries: ["mybin"],
2987 vendor: true,
2988 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002989 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002990 }
2991 apex_key {
2992 name: "myapex.key",
2993 public_key: "testkey.avbpubkey",
2994 private_key: "testkey.pem",
2995 }
2996 cc_binary {
2997 name: "mybin",
2998 vendor: true,
2999 shared_libs: ["libvndk", "libvendor"],
3000 }
3001 cc_library {
3002 name: "libvndk",
3003 vndk: {
3004 enabled: true,
3005 },
3006 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003007 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003008 }
3009 cc_library {
3010 name: "libvendor",
3011 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003012 stl: "none",
3013 }
3014 apex {
3015 name: "myapex2",
3016 key: "myapex.key",
3017 binaries: ["mybin2"],
3018 vendor: true,
3019 use_vndk_as_stable: false,
3020 updatable: false,
3021 }
3022 cc_binary {
3023 name: "mybin2",
3024 vendor: true,
3025 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003026 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003027 `,
3028 android.FixtureModifyConfig(func(config android.Config) {
3029 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3030 }),
3031 )
Jooyung Handf78e212020-07-22 15:54:47 +09003032
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003033 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003034
Jooyung Han91f92032022-02-04 12:36:33 +09003035 for _, tc := range []struct {
3036 name string
3037 apexName string
3038 moduleName string
3039 moduleVariant string
3040 libs []string
3041 contents []string
3042 requireVndkNamespace bool
3043 }{
3044 {
3045 name: "use_vndk_as_stable",
3046 apexName: "myapex",
3047 moduleName: "mybin",
3048 moduleVariant: vendorVariant + "_apex10000",
3049 libs: []string{
3050 // should link with vendor variants of VNDK libs(libvndk/libc++)
3051 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3052 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3053 // unstable Vendor libs as APEX variant
3054 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3055 },
3056 contents: []string{
3057 "bin/mybin",
3058 "lib64/libvendor.so",
3059 // VNDK libs (libvndk/libc++) are not included
3060 },
3061 requireVndkNamespace: true,
3062 },
3063 {
3064 name: "!use_vndk_as_stable",
3065 apexName: "myapex2",
3066 moduleName: "mybin2",
3067 moduleVariant: vendorVariant + "_myapex2",
3068 libs: []string{
3069 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3070 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3071 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3072 // unstable vendor libs have "merged" APEX variants
3073 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3074 },
3075 contents: []string{
3076 "bin/mybin2",
3077 "lib64/libvendor.so",
3078 // VNDK libs are included as well
3079 "lib64/libvndk.so",
3080 "lib64/libc++.so",
3081 },
3082 requireVndkNamespace: false,
3083 },
3084 } {
3085 t.Run(tc.name, func(t *testing.T) {
3086 // Check linked libs
3087 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3088 libs := names(ldRule.Args["libFlags"])
3089 for _, lib := range tc.libs {
3090 ensureListContains(t, libs, lib)
3091 }
3092 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003093 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003094
Jooyung Han91f92032022-02-04 12:36:33 +09003095 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003096 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003097 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3098 if tc.requireVndkNamespace {
3099 ensureListContains(t, requireNativeLibs, ":vndk")
3100 } else {
3101 ensureListNotContains(t, requireNativeLibs, ":vndk")
3102 }
3103 })
3104 }
Jooyung Handf78e212020-07-22 15:54:47 +09003105}
3106
Justin Yun13decfb2021-03-08 19:25:55 +09003107func TestProductVariant(t *testing.T) {
3108 ctx := testApex(t, `
3109 apex {
3110 name: "myapex",
3111 key: "myapex.key",
3112 updatable: false,
3113 product_specific: true,
3114 binaries: ["foo"],
3115 }
3116
3117 apex_key {
3118 name: "myapex.key",
3119 public_key: "testkey.avbpubkey",
3120 private_key: "testkey.pem",
3121 }
3122
3123 cc_binary {
3124 name: "foo",
3125 product_available: true,
3126 apex_available: ["myapex"],
3127 srcs: ["foo.cpp"],
3128 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003129 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003130
3131 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003132 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003133 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3134 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3135 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3136 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3137}
3138
Jooyung Han8e5685d2020-09-21 11:02:57 +09003139func TestApex_withPrebuiltFirmware(t *testing.T) {
3140 testCases := []struct {
3141 name string
3142 additionalProp string
3143 }{
3144 {"system apex with prebuilt_firmware", ""},
3145 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3146 }
3147 for _, tc := range testCases {
3148 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003149 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003150 apex {
3151 name: "myapex",
3152 key: "myapex.key",
3153 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003154 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003155 `+tc.additionalProp+`
3156 }
3157 apex_key {
3158 name: "myapex.key",
3159 public_key: "testkey.avbpubkey",
3160 private_key: "testkey.pem",
3161 }
3162 prebuilt_firmware {
3163 name: "myfirmware",
3164 src: "myfirmware.bin",
3165 filename_from_src: true,
3166 `+tc.additionalProp+`
3167 }
3168 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003169 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003170 "etc/firmware/myfirmware.bin",
3171 })
3172 })
3173 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003174}
3175
Jooyung Hanefb184e2020-06-25 17:14:25 +09003176func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 vendor: true,
3182 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003183 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003184 }
3185
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191
3192 cc_library {
3193 name: "mylib",
3194 vendor_available: true,
3195 }
3196 `)
3197
Jooyung Hana0503a52023-08-23 13:12:50 +09003198 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003199 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003200 name := apexBundle.BaseModuleName()
3201 prefix := "TARGET_"
3202 var builder strings.Builder
3203 data.Custom(&builder, name, prefix, "", data)
3204 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003205 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 +09003206}
3207
Jooyung Han2ed99d02020-06-24 23:26:26 +09003208func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003209 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003210 apex {
3211 name: "myapex",
3212 key: "myapex.key",
3213 vintf_fragments: ["fragment.xml"],
3214 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003215 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003216 }
3217 apex_key {
3218 name: "myapex.key",
3219 public_key: "testkey.avbpubkey",
3220 private_key: "testkey.pem",
3221 }
3222 cc_binary {
3223 name: "mybin",
3224 }
3225 `)
3226
Jooyung Hana0503a52023-08-23 13:12:50 +09003227 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003228 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003229 name := apexBundle.BaseModuleName()
3230 prefix := "TARGET_"
3231 var builder strings.Builder
3232 data.Custom(&builder, name, prefix, "", data)
3233 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003234 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003235 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003236}
3237
Jiyong Park16e91a02018-12-20 18:18:08 +09003238func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003239 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003240 apex {
3241 name: "myapex",
3242 key: "myapex.key",
3243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003244 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003245 }
3246
3247 apex_key {
3248 name: "myapex.key",
3249 public_key: "testkey.avbpubkey",
3250 private_key: "testkey.pem",
3251 }
3252
3253 cc_library {
3254 name: "mylib",
3255 srcs: ["mylib.cpp"],
3256 system_shared_libs: [],
3257 stl: "none",
3258 stubs: {
3259 versions: ["1", "2", "3"],
3260 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003261 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003262 }
3263
3264 cc_binary {
3265 name: "not_in_apex",
3266 srcs: ["mylib.cpp"],
3267 static_libs: ["mylib"],
3268 static_executable: true,
3269 system_shared_libs: [],
3270 stl: "none",
3271 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003272 `)
3273
Colin Cross7113d202019-11-20 16:39:12 -08003274 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003275
3276 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003277 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003278}
Jiyong Park9335a262018-12-24 11:31:58 +09003279
3280func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003281 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003282 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003283 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003284 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003285 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003286 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003287 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003288 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003289 }
3290
3291 cc_library {
3292 name: "mylib",
3293 srcs: ["mylib.cpp"],
3294 system_shared_libs: [],
3295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003297 }
3298
3299 apex_key {
3300 name: "myapex.key",
3301 public_key: "testkey.avbpubkey",
3302 private_key: "testkey.pem",
3303 }
3304
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003305 android_app_certificate {
3306 name: "myapex.certificate",
3307 certificate: "testkey",
3308 }
3309
3310 android_app_certificate {
3311 name: "myapex.certificate.override",
3312 certificate: "testkey.override",
3313 }
3314
Jiyong Park9335a262018-12-24 11:31:58 +09003315 `)
3316
3317 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003318 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003319
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003320 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3321 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003322 "vendor/foo/devkeys/testkey.avbpubkey")
3323 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003324 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3325 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003326 "vendor/foo/devkeys/testkey.pem")
3327 }
3328
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003329 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003330 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003331 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003332 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003333 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003334 }
3335}
Jiyong Park58e364a2019-01-19 19:24:06 +09003336
Jooyung Hanf121a652019-12-17 14:30:11 +09003337func TestCertificate(t *testing.T) {
3338 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003339 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 apex {
3341 name: "myapex",
3342 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003343 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 }
3345 apex_key {
3346 name: "myapex.key",
3347 public_key: "testkey.avbpubkey",
3348 private_key: "testkey.pem",
3349 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003350 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3352 if actual := rule.Args["certificates"]; actual != expected {
3353 t.Errorf("certificates should be %q, not %q", expected, actual)
3354 }
3355 })
3356 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003357 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003358 apex {
3359 name: "myapex_keytest",
3360 key: "myapex.key",
3361 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003362 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003363 }
3364 apex_key {
3365 name: "myapex.key",
3366 public_key: "testkey.avbpubkey",
3367 private_key: "testkey.pem",
3368 }
3369 android_app_certificate {
3370 name: "myapex.certificate.override",
3371 certificate: "testkey.override",
3372 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003373 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 expected := "testkey.override.x509.pem testkey.override.pk8"
3375 if actual := rule.Args["certificates"]; actual != expected {
3376 t.Errorf("certificates should be %q, not %q", expected, actual)
3377 }
3378 })
3379 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003380 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003381 apex {
3382 name: "myapex",
3383 key: "myapex.key",
3384 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003385 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003386 }
3387 apex_key {
3388 name: "myapex.key",
3389 public_key: "testkey.avbpubkey",
3390 private_key: "testkey.pem",
3391 }
3392 android_app_certificate {
3393 name: "myapex.certificate",
3394 certificate: "testkey",
3395 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003396 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 expected := "testkey.x509.pem testkey.pk8"
3398 if actual := rule.Args["certificates"]; actual != expected {
3399 t.Errorf("certificates should be %q, not %q", expected, actual)
3400 }
3401 })
3402 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003403 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003404 apex {
3405 name: "myapex_keytest",
3406 key: "myapex.key",
3407 file_contexts: ":myapex-file_contexts",
3408 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003409 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003410 }
3411 apex_key {
3412 name: "myapex.key",
3413 public_key: "testkey.avbpubkey",
3414 private_key: "testkey.pem",
3415 }
3416 android_app_certificate {
3417 name: "myapex.certificate.override",
3418 certificate: "testkey.override",
3419 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003420 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003421 expected := "testkey.override.x509.pem testkey.override.pk8"
3422 if actual := rule.Args["certificates"]; actual != expected {
3423 t.Errorf("certificates should be %q, not %q", expected, actual)
3424 }
3425 })
3426 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003427 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003428 apex {
3429 name: "myapex",
3430 key: "myapex.key",
3431 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003433 }
3434 apex_key {
3435 name: "myapex.key",
3436 public_key: "testkey.avbpubkey",
3437 private_key: "testkey.pem",
3438 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003439 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003440 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3441 if actual := rule.Args["certificates"]; actual != expected {
3442 t.Errorf("certificates should be %q, not %q", expected, actual)
3443 }
3444 })
3445 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003446 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 apex {
3448 name: "myapex_keytest",
3449 key: "myapex.key",
3450 file_contexts: ":myapex-file_contexts",
3451 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003452 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003453 }
3454 apex_key {
3455 name: "myapex.key",
3456 public_key: "testkey.avbpubkey",
3457 private_key: "testkey.pem",
3458 }
3459 android_app_certificate {
3460 name: "myapex.certificate.override",
3461 certificate: "testkey.override",
3462 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003463 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003464 expected := "testkey.override.x509.pem testkey.override.pk8"
3465 if actual := rule.Args["certificates"]; actual != expected {
3466 t.Errorf("certificates should be %q, not %q", expected, actual)
3467 }
3468 })
3469}
3470
Jiyong Park58e364a2019-01-19 19:24:06 +09003471func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003472 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003473 apex {
3474 name: "myapex",
3475 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003476 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003477 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003478 }
3479
3480 apex {
3481 name: "otherapex",
3482 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003483 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003484 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003485 }
3486
3487 apex_key {
3488 name: "myapex.key",
3489 public_key: "testkey.avbpubkey",
3490 private_key: "testkey.pem",
3491 }
3492
3493 cc_library {
3494 name: "mylib",
3495 srcs: ["mylib.cpp"],
3496 system_shared_libs: [],
3497 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003499 "myapex",
3500 "otherapex",
3501 ],
Jooyung Han24282772020-03-21 23:20:55 +09003502 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003503 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003504 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003505 cc_library {
3506 name: "mylib2",
3507 srcs: ["mylib.cpp"],
3508 system_shared_libs: [],
3509 stl: "none",
3510 apex_available: [
3511 "myapex",
3512 "otherapex",
3513 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003514 static_libs: ["mylib3"],
3515 recovery_available: true,
3516 min_sdk_version: "29",
3517 }
3518 cc_library {
3519 name: "mylib3",
3520 srcs: ["mylib.cpp"],
3521 system_shared_libs: [],
3522 stl: "none",
3523 apex_available: [
3524 "myapex",
3525 "otherapex",
3526 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003527 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003528 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003529 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003530 `)
3531
Jooyung Hanc87a0592020-03-02 17:44:33 +09003532 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003533 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003534 ensureNotContains(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_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539
Vinh Tranf9754732023-01-19 22:41:46 -05003540 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003541 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003543
Colin Crossaede88c2020-08-11 12:17:01 -07003544 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3545 // each variant defines additional macros to distinguish which apex variant it is built for
3546
3547 // non-APEX variant does not have __ANDROID_APEX__ defined
3548 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3549 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3550
Vinh Tranf9754732023-01-19 22:41:46 -05003551 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003552 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3553 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003554
Jooyung Hanc87a0592020-03-02 17:44:33 +09003555 // non-APEX variant does not have __ANDROID_APEX__ defined
3556 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3558
Vinh Tranf9754732023-01-19 22:41:46 -05003559 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003560 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003561 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003562}
Jiyong Park7e636d02019-01-28 16:16:54 +09003563
3564func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003565 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003566 apex {
3567 name: "myapex",
3568 key: "myapex.key",
3569 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003570 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003571 }
3572
3573 apex_key {
3574 name: "myapex.key",
3575 public_key: "testkey.avbpubkey",
3576 private_key: "testkey.pem",
3577 }
3578
3579 cc_library_headers {
3580 name: "mylib_headers",
3581 export_include_dirs: ["my_include"],
3582 system_shared_libs: [],
3583 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003584 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003585 }
3586
3587 cc_library {
3588 name: "mylib",
3589 srcs: ["mylib.cpp"],
3590 system_shared_libs: [],
3591 stl: "none",
3592 header_libs: ["mylib_headers"],
3593 export_header_lib_headers: ["mylib_headers"],
3594 stubs: {
3595 versions: ["1", "2", "3"],
3596 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003597 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003598 }
3599
3600 cc_library {
3601 name: "otherlib",
3602 srcs: ["mylib.cpp"],
3603 system_shared_libs: [],
3604 stl: "none",
3605 shared_libs: ["mylib"],
3606 }
3607 `)
3608
Colin Cross7113d202019-11-20 16:39:12 -08003609 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003610
3611 // Ensure that the include path of the header lib is exported to 'otherlib'
3612 ensureContains(t, cFlags, "-Imy_include")
3613}
Alex Light9670d332019-01-29 18:07:33 -08003614
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615type fileInApex struct {
3616 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 isLink bool
3619}
3620
Jooyung Han1724d582022-12-21 10:17:44 +09003621func (f fileInApex) String() string {
3622 return f.src + ":" + f.path
3623}
3624
3625func (f fileInApex) match(expectation string) bool {
3626 parts := strings.Split(expectation, ":")
3627 if len(parts) == 1 {
3628 match, _ := path.Match(parts[0], f.path)
3629 return match
3630 }
3631 if len(parts) == 2 {
3632 matchSrc, _ := path.Match(parts[0], f.src)
3633 matchDst, _ := path.Match(parts[1], f.path)
3634 return matchSrc && matchDst
3635 }
3636 panic("invalid expected file specification: " + expectation)
3637}
3638
Jooyung Hana57af4a2020-01-23 05:36:59 +00003639func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003641 module := ctx.ModuleForTests(moduleName, variant)
3642 apexRule := module.MaybeRule("apexRule")
3643 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003644 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003646 for _, cmd := range strings.Split(copyCmds, "&&") {
3647 cmd = strings.TrimSpace(cmd)
3648 if cmd == "" {
3649 continue
3650 }
3651 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 switch terms[0] {
3655 case "mkdir":
3656 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003657 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003658 t.Fatal("copyCmds contains invalid cp command", cmd)
3659 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003661 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003662 isLink = false
3663 case "ln":
3664 if len(terms) != 3 && len(terms) != 4 {
3665 // ln LINK TARGET or ln -s LINK TARGET
3666 t.Fatal("copyCmds contains invalid ln command", cmd)
3667 }
3668 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003669 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 isLink = true
3671 default:
3672 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3673 }
3674 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003675 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003676 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003677 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 }
Jooyung Han1724d582022-12-21 10:17:44 +09003679 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003680 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003681 }
3682 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003683 return ret
3684}
3685
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003686func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003687 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003688 var failed bool
3689 var surplus []string
3690 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003691 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003692 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003693 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003694 if file.match(expected) {
3695 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003696 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003697 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003698 }
3699 }
Jooyung Han1724d582022-12-21 10:17:44 +09003700 if !matchFound {
3701 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003702 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003703 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003704
Jooyung Han31c470b2019-10-18 16:26:59 +09003705 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003707 t.Log("surplus files", surplus)
3708 failed = true
3709 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003710
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003711 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003712 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003713 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003714 if !filesMatched[expected] {
3715 missing = append(missing, expected)
3716 }
3717 }
3718 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 t.Log("missing files", missing)
3720 failed = true
3721 }
3722 if failed {
3723 t.Fail()
3724 }
3725}
3726
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003727func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3728 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3729}
3730
3731func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003732 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003733 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3734 if deapexer.Output != nil {
3735 outputs = append(outputs, deapexer.Output.String())
3736 }
3737 for _, output := range deapexer.ImplicitOutputs {
3738 outputs = append(outputs, output.String())
3739 }
3740 actualFiles := make([]fileInApex, 0, len(outputs))
3741 for _, output := range outputs {
3742 dir := "/deapexer/"
3743 pos := strings.LastIndex(output, dir)
3744 if pos == -1 {
3745 t.Fatal("Unknown deapexer output ", output)
3746 }
3747 path := output[pos+len(dir):]
3748 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3749 }
3750 assertFileListEquals(t, files, actualFiles)
3751}
3752
Jooyung Han344d5432019-08-23 11:17:39 +09003753func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003754 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003755 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003756 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003757 "etc/llndk.libraries.29.txt",
3758 "etc/vndkcore.libraries.29.txt",
3759 "etc/vndksp.libraries.29.txt",
3760 "etc/vndkprivate.libraries.29.txt",
3761 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003762 }
3763 testCases := []struct {
3764 vndkVersion string
3765 expectedFiles []string
3766 }{
3767 {
3768 vndkVersion: "current",
3769 expectedFiles: append(commonFiles,
3770 "lib/libvndk.so",
3771 "lib/libvndksp.so",
3772 "lib64/libvndk.so",
3773 "lib64/libvndksp.so"),
3774 },
3775 {
3776 vndkVersion: "",
3777 expectedFiles: append(commonFiles,
3778 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3779 "lib/libvndksp.so",
3780 "lib64/libvndksp.so"),
3781 },
3782 }
3783 for _, tc := range testCases {
3784 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3785 ctx := testApex(t, `
3786 apex_vndk {
3787 name: "com.android.vndk.current",
3788 key: "com.android.vndk.current.key",
3789 updatable: false,
3790 }
3791
3792 apex_key {
3793 name: "com.android.vndk.current.key",
3794 public_key: "testkey.avbpubkey",
3795 private_key: "testkey.pem",
3796 }
3797
3798 cc_library {
3799 name: "libvndk",
3800 srcs: ["mylib.cpp"],
3801 vendor_available: true,
3802 product_available: true,
3803 vndk: {
3804 enabled: true,
3805 },
3806 system_shared_libs: [],
3807 stl: "none",
3808 apex_available: [ "com.android.vndk.current" ],
3809 }
3810
3811 cc_library {
3812 name: "libvndksp",
3813 srcs: ["mylib.cpp"],
3814 vendor_available: true,
3815 product_available: true,
3816 vndk: {
3817 enabled: true,
3818 support_system_process: true,
3819 },
3820 system_shared_libs: [],
3821 stl: "none",
3822 apex_available: [ "com.android.vndk.current" ],
3823 }
3824
3825 // VNDK-Ext should not cause any problems
3826
3827 cc_library {
3828 name: "libvndk.ext",
3829 srcs: ["mylib2.cpp"],
3830 vendor: true,
3831 vndk: {
3832 enabled: true,
3833 extends: "libvndk",
3834 },
3835 system_shared_libs: [],
3836 stl: "none",
3837 }
3838
3839 cc_library {
3840 name: "libvndksp.ext",
3841 srcs: ["mylib2.cpp"],
3842 vendor: true,
3843 vndk: {
3844 enabled: true,
3845 support_system_process: true,
3846 extends: "libvndksp",
3847 },
3848 system_shared_libs: [],
3849 stl: "none",
3850 }
3851 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3852 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003853 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003854 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003855 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003856 })
3857 }
Jooyung Han344d5432019-08-23 11:17:39 +09003858}
3859
3860func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003861 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003862 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003863 name: "com.android.vndk.current",
3864 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003865 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003866 }
3867
3868 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003869 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003870 public_key: "testkey.avbpubkey",
3871 private_key: "testkey.pem",
3872 }
3873
3874 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 name: "libvndk",
3876 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003877 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003878 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003879 vndk: {
3880 enabled: true,
3881 },
3882 system_shared_libs: [],
3883 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003884 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003885 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003886
3887 cc_prebuilt_library_shared {
3888 name: "libvndk.arm",
3889 srcs: ["libvndk.arm.so"],
3890 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003891 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003892 vndk: {
3893 enabled: true,
3894 },
3895 enabled: false,
3896 arch: {
3897 arm: {
3898 enabled: true,
3899 },
3900 },
3901 system_shared_libs: [],
3902 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003903 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 `+vndkLibrariesTxtFiles("current"),
3906 withFiles(map[string][]byte{
3907 "libvndk.so": nil,
3908 "libvndk.arm.so": nil,
3909 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003910 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 "lib/libvndk.so",
3912 "lib/libvndk.arm.so",
3913 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003914 "lib/libc++.so",
3915 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003916 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003917 })
Jooyung Han344d5432019-08-23 11:17:39 +09003918}
3919
Jooyung Han39edb6c2019-11-06 16:53:07 +09003920func vndkLibrariesTxtFiles(vers ...string) (result string) {
3921 for _, v := range vers {
3922 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003923 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003925 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003926 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003927 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003928 }
3929 `
3930 }
Justin Yund5784122023-10-25 13:25:32 +09003931 result += `
3932 llndk_libraries_txt {
3933 name: "llndk.libraries.txt",
3934 }
3935 llndk_libraries_txt_for_apex {
3936 name: "llndk.libraries.txt.apex",
3937 stem: "llndk.libraries.txt",
3938 insert_vndk_version: true,
3939 }
3940 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003941 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003942 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003943 result += `
3944 prebuilt_etc {
3945 name: "` + txt + `.libraries.` + v + `.txt",
3946 src: "dummy.txt",
3947 }
3948 `
3949 }
3950 }
3951 }
3952 return
3953}
3954
Jooyung Han344d5432019-08-23 11:17:39 +09003955func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003956 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003957 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003958 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003959 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003960 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003961 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003962 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003963 }
3964
3965 apex_key {
3966 name: "myapex.key",
3967 public_key: "testkey.avbpubkey",
3968 private_key: "testkey.pem",
3969 }
3970
Jooyung Han31c470b2019-10-18 16:26:59 +09003971 vndk_prebuilt_shared {
3972 name: "libvndk27",
3973 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003974 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003975 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003976 vndk: {
3977 enabled: true,
3978 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003979 target_arch: "arm64",
3980 arch: {
3981 arm: {
3982 srcs: ["libvndk27_arm.so"],
3983 },
3984 arm64: {
3985 srcs: ["libvndk27_arm64.so"],
3986 },
3987 },
Colin Cross2807f002021-03-02 10:15:29 -08003988 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003989 }
3990
3991 vndk_prebuilt_shared {
3992 name: "libvndk27",
3993 version: "27",
3994 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003995 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003996 vndk: {
3997 enabled: true,
3998 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003999 target_arch: "x86_64",
4000 arch: {
4001 x86: {
4002 srcs: ["libvndk27_x86.so"],
4003 },
4004 x86_64: {
4005 srcs: ["libvndk27_x86_64.so"],
4006 },
4007 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004008 }
4009 `+vndkLibrariesTxtFiles("27"),
4010 withFiles(map[string][]byte{
4011 "libvndk27_arm.so": nil,
4012 "libvndk27_arm64.so": nil,
4013 "libvndk27_x86.so": nil,
4014 "libvndk27_x86_64.so": nil,
4015 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004016
Jooyung Hana0503a52023-08-23 13:12:50 +09004017 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004018 "lib/libvndk27_arm.so",
4019 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004020 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004021 })
Jooyung Han344d5432019-08-23 11:17:39 +09004022}
4023
Jooyung Han90eee022019-10-01 20:02:42 +09004024func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004025 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004026 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004028 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004030 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004031 }
4032 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004033 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004034 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004035 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004036 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004037 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004038 }
4039 apex_key {
4040 name: "myapex.key",
4041 public_key: "testkey.avbpubkey",
4042 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004043 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004044
4045 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004046 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004047 apexManifestRule := module.Rule("apexManifestRule")
4048 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004049 }
4050
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004051 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004052 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004053}
4054
Jooyung Han344d5432019-08-23 11:17:39 +09004055func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004057 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.current",
4059 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004061 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004062 }
4063
4064 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004065 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004066 public_key: "testkey.avbpubkey",
4067 private_key: "testkey.pem",
4068 }
4069
4070 cc_library {
4071 name: "libvndk",
4072 srcs: ["mylib.cpp"],
4073 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004074 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004075 native_bridge_supported: true,
4076 host_supported: true,
4077 vndk: {
4078 enabled: true,
4079 },
4080 system_shared_libs: [],
4081 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004082 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004083 }
Colin Cross2807f002021-03-02 10:15:29 -08004084 `+vndkLibrariesTxtFiles("current"),
4085 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004086
Jooyung Hana0503a52023-08-23 13:12:50 +09004087 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004088 "lib/libvndk.so",
4089 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004090 "lib/libc++.so",
4091 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004092 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 })
Jooyung Han344d5432019-08-23 11:17:39 +09004094}
4095
4096func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004097 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.current",
4100 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004102 native_bridge_supported: true,
4103 }
4104
4105 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004106 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
4109 }
4110
4111 cc_library {
4112 name: "libvndk",
4113 srcs: ["mylib.cpp"],
4114 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004115 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004116 native_bridge_supported: true,
4117 host_supported: true,
4118 vndk: {
4119 enabled: true,
4120 },
4121 system_shared_libs: [],
4122 stl: "none",
4123 }
4124 `)
4125}
4126
Jooyung Han31c470b2019-10-18 16:26:59 +09004127func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004128 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004130 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004132 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004133 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004134 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004135 }
4136
4137 apex_key {
4138 name: "myapex.key",
4139 public_key: "testkey.avbpubkey",
4140 private_key: "testkey.pem",
4141 }
4142
4143 vndk_prebuilt_shared {
4144 name: "libvndk27",
4145 version: "27",
4146 target_arch: "arm",
4147 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004148 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004149 vndk: {
4150 enabled: true,
4151 },
4152 arch: {
4153 arm: {
4154 srcs: ["libvndk27.so"],
4155 }
4156 },
4157 }
4158
4159 vndk_prebuilt_shared {
4160 name: "libvndk27",
4161 version: "27",
4162 target_arch: "arm",
4163 binder32bit: true,
4164 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004165 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004166 vndk: {
4167 enabled: true,
4168 },
4169 arch: {
4170 arm: {
4171 srcs: ["libvndk27binder32.so"],
4172 }
4173 },
Colin Cross2807f002021-03-02 10:15:29 -08004174 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004175 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004176 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004177 withFiles(map[string][]byte{
4178 "libvndk27.so": nil,
4179 "libvndk27binder32.so": nil,
4180 }),
4181 withBinder32bit,
4182 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004183 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004184 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4185 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004186 },
4187 }),
4188 )
4189
Jooyung Hana0503a52023-08-23 13:12:50 +09004190 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004191 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004192 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004193 })
4194}
4195
Jooyung Han45a96772020-06-15 14:59:42 +09004196func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004197 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004198 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004199 name: "com.android.vndk.current",
4200 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004201 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004202 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004203 }
4204
4205 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004206 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004207 public_key: "testkey.avbpubkey",
4208 private_key: "testkey.pem",
4209 }
4210
4211 cc_library {
4212 name: "libz",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004215 vndk: {
4216 enabled: true,
4217 },
4218 stubs: {
4219 symbol_file: "libz.map.txt",
4220 versions: ["30"],
4221 }
4222 }
4223 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4224 "libz.map.txt": nil,
4225 }))
4226
Jooyung Hana0503a52023-08-23 13:12:50 +09004227 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004228 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4229 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004230 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004231 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4232 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4233 "*/*",
4234 })
Jooyung Han45a96772020-06-15 14:59:42 +09004235}
4236
Jooyung Hane3f02812023-05-08 13:54:50 +09004237func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4238 ctx := testApex(t, "",
4239 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4240 variables.DeviceVndkVersion = proptools.StringPtr("27")
4241 }),
4242 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4243 cc.RegisterVendorSnapshotModules(ctx)
4244 }),
4245 withFiles(map[string][]byte{
4246 "vendor/foo/Android.bp": []byte(`
4247 apex {
4248 name: "myapex",
4249 binaries: ["foo"],
4250 key: "myapex.key",
4251 min_sdk_version: "27",
4252 vendor: true,
4253 }
4254
4255 cc_binary {
4256 name: "foo",
4257 vendor: true,
4258 srcs: ["abc.cpp"],
4259 shared_libs: [
4260 "libllndk",
4261 "libvndk",
4262 ],
4263 nocrt: true,
4264 system_shared_libs: [],
4265 min_sdk_version: "27",
4266 }
4267
4268 apex_key {
4269 name: "myapex.key",
4270 public_key: "testkey.avbpubkey",
4271 private_key: "testkey.pem",
4272 }
4273 `),
4274 // Simulate VNDK prebuilts with vendor_snapshot
4275 "prebuilts/vndk/Android.bp": []byte(`
4276 vndk_prebuilt_shared {
4277 name: "libllndk",
4278 version: "27",
4279 vendor_available: true,
4280 product_available: true,
4281 target_arch: "arm64",
4282 arch: {
4283 arm64: {
4284 srcs: ["libllndk.so"],
4285 },
4286 },
4287 }
4288
4289 vndk_prebuilt_shared {
4290 name: "libvndk",
4291 version: "27",
4292 vendor_available: true,
4293 product_available: true,
4294 target_arch: "arm64",
4295 arch: {
4296 arm64: {
4297 srcs: ["libvndk.so"],
4298 },
4299 },
4300 vndk: {
4301 enabled: true,
4302 },
4303 min_sdk_version: "27",
4304 }
4305
4306 vndk_prebuilt_shared {
4307 name: "libc++",
4308 version: "27",
4309 target_arch: "arm64",
4310 vendor_available: true,
4311 product_available: true,
4312 vndk: {
4313 enabled: true,
4314 support_system_process: true,
4315 },
4316 arch: {
4317 arm64: {
4318 srcs: ["libc++.so"],
4319 },
4320 },
4321 min_sdk_version: "apex_inherit",
4322 }
4323
4324 vendor_snapshot {
4325 name: "vendor_snapshot",
4326 version: "27",
4327 arch: {
4328 arm64: {
4329 vndk_libs: [
4330 "libc++",
4331 "libllndk",
4332 "libvndk",
4333 ],
4334 static_libs: [
4335 "libc++demangle",
4336 "libclang_rt.builtins",
4337 "libunwind",
4338 ],
4339 },
4340 }
4341 }
4342
4343 vendor_snapshot_static {
4344 name: "libclang_rt.builtins",
4345 version: "27",
4346 target_arch: "arm64",
4347 vendor: true,
4348 arch: {
4349 arm64: {
4350 src: "libclang_rt.builtins-aarch64-android.a",
4351 },
4352 },
4353 }
4354
4355 vendor_snapshot_static {
4356 name: "libc++demangle",
4357 version: "27",
4358 target_arch: "arm64",
4359 compile_multilib: "64",
4360 vendor: true,
4361 arch: {
4362 arm64: {
4363 src: "libc++demangle.a",
4364 },
4365 },
4366 min_sdk_version: "apex_inherit",
4367 }
4368
4369 vendor_snapshot_static {
4370 name: "libunwind",
4371 version: "27",
4372 target_arch: "arm64",
4373 compile_multilib: "64",
4374 vendor: true,
4375 arch: {
4376 arm64: {
4377 src: "libunwind.a",
4378 },
4379 },
4380 min_sdk_version: "apex_inherit",
4381 }
4382 `),
4383 }))
4384
4385 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004386 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004387 "bin/foo",
4388 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4389 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4390 })
4391
4392 // Should link foo with prebuilt libraries (shared/static)
4393 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4394 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4395 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4396 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4397 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4398
4399 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004400 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004401 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4402 ensureListContains(t, requireNativeLibs, "libllndk.so")
4403}
4404
Jooyung Hane1633032019-08-01 17:41:43 +09004405func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004406 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004407 apex {
4408 name: "myapex_nodep",
4409 key: "myapex.key",
4410 native_shared_libs: ["lib_nodep"],
4411 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004412 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004413 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004414 }
4415
4416 apex {
4417 name: "myapex_dep",
4418 key: "myapex.key",
4419 native_shared_libs: ["lib_dep"],
4420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex {
4426 name: "myapex_provider",
4427 key: "myapex.key",
4428 native_shared_libs: ["libfoo"],
4429 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004430 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004431 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 apex {
4435 name: "myapex_selfcontained",
4436 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004437 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004438 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004439 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004440 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004441 }
4442
4443 apex_key {
4444 name: "myapex.key",
4445 public_key: "testkey.avbpubkey",
4446 private_key: "testkey.pem",
4447 }
4448
4449 cc_library {
4450 name: "lib_nodep",
4451 srcs: ["mylib.cpp"],
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004455 }
4456
4457 cc_library {
4458 name: "lib_dep",
4459 srcs: ["mylib.cpp"],
4460 shared_libs: ["libfoo"],
4461 system_shared_libs: [],
4462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004463 apex_available: [
4464 "myapex_dep",
4465 "myapex_provider",
4466 "myapex_selfcontained",
4467 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004468 }
4469
4470 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004471 name: "lib_dep_on_bar",
4472 srcs: ["mylib.cpp"],
4473 shared_libs: ["libbar"],
4474 system_shared_libs: [],
4475 stl: "none",
4476 apex_available: [
4477 "myapex_selfcontained",
4478 ],
4479 }
4480
4481
4482 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004483 name: "libfoo",
4484 srcs: ["mytest.cpp"],
4485 stubs: {
4486 versions: ["1"],
4487 },
4488 system_shared_libs: [],
4489 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004490 apex_available: [
4491 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004492 ],
4493 }
4494
4495 cc_library {
4496 name: "libbar",
4497 srcs: ["mytest.cpp"],
4498 stubs: {
4499 versions: ["1"],
4500 },
4501 system_shared_libs: [],
4502 stl: "none",
4503 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004504 "myapex_selfcontained",
4505 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004506 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004507
Jooyung Hane1633032019-08-01 17:41:43 +09004508 `)
4509
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004510 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004511 var provideNativeLibs, requireNativeLibs []string
4512
Jooyung Hana0503a52023-08-23 13:12:50 +09004513 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004514 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4515 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004516 ensureListEmpty(t, provideNativeLibs)
4517 ensureListEmpty(t, requireNativeLibs)
4518
Jooyung Hana0503a52023-08-23 13:12:50 +09004519 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004520 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4521 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004522 ensureListEmpty(t, provideNativeLibs)
4523 ensureListContains(t, requireNativeLibs, "libfoo.so")
4524
Jooyung Hana0503a52023-08-23 13:12:50 +09004525 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004526 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4527 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004528 ensureListContains(t, provideNativeLibs, "libfoo.so")
4529 ensureListEmpty(t, requireNativeLibs)
4530
Jooyung Hana0503a52023-08-23 13:12:50 +09004531 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004532 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4533 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004534 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004535 ensureListEmpty(t, requireNativeLibs)
4536}
4537
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004538func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4539 ctx := testApex(t, `
4540 apex {
4541 name: "myapex",
4542 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004543 native_shared_libs: ["mylib"],
4544 updatable: false,
4545 }
4546
4547 apex_key {
4548 name: "myapex.key",
4549 public_key: "testkey.avbpubkey",
4550 private_key: "testkey.pem",
4551 }
4552
4553 cc_library {
4554 name: "mylib",
4555 srcs: ["mylib.cpp"],
4556 system_shared_libs: [],
4557 stl: "none",
4558 apex_available: [
4559 "//apex_available:platform",
4560 "myapex",
4561 ],
4562 }
4563 `, android.FixtureMergeEnv(map[string]string{
4564 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4565 }))
4566
Jooyung Hana0503a52023-08-23 13:12:50 +09004567 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004568 apexManifestRule := module.Rule("apexManifestRule")
4569 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4570}
4571
Vinh Tran8f5310f2022-10-07 18:16:47 -04004572func TestCompileMultilibProp(t *testing.T) {
4573 testCases := []struct {
4574 compileMultiLibProp string
4575 containedLibs []string
4576 notContainedLibs []string
4577 }{
4578 {
4579 containedLibs: []string{
4580 "image.apex/lib64/mylib.so",
4581 "image.apex/lib/mylib.so",
4582 },
4583 compileMultiLibProp: `compile_multilib: "both",`,
4584 },
4585 {
4586 containedLibs: []string{"image.apex/lib64/mylib.so"},
4587 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4588 compileMultiLibProp: `compile_multilib: "first",`,
4589 },
4590 {
4591 containedLibs: []string{"image.apex/lib64/mylib.so"},
4592 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4593 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4594 },
4595 {
4596 containedLibs: []string{"image.apex/lib64/mylib.so"},
4597 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4598 compileMultiLibProp: `compile_multilib: "64",`,
4599 },
4600 {
4601 containedLibs: []string{"image.apex/lib/mylib.so"},
4602 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4603 compileMultiLibProp: `compile_multilib: "32",`,
4604 },
4605 }
4606 for _, testCase := range testCases {
4607 ctx := testApex(t, fmt.Sprintf(`
4608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 %s
4612 native_shared_libs: ["mylib"],
4613 updatable: false,
4614 }
4615 apex_key {
4616 name: "myapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
4620 cc_library {
4621 name: "mylib",
4622 srcs: ["mylib.cpp"],
4623 apex_available: [
4624 "//apex_available:platform",
4625 "myapex",
4626 ],
4627 }
4628 `, testCase.compileMultiLibProp),
4629 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004630 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004631 apexRule := module.Rule("apexRule")
4632 copyCmds := apexRule.Args["copy_commands"]
4633 for _, containedLib := range testCase.containedLibs {
4634 ensureContains(t, copyCmds, containedLib)
4635 }
4636 for _, notContainedLib := range testCase.notContainedLibs {
4637 ensureNotContains(t, copyCmds, notContainedLib)
4638 }
4639 }
4640}
4641
Alex Light0851b882019-02-07 13:20:53 -08004642func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004643 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004644 apex {
4645 name: "myapex",
4646 key: "myapex.key",
4647 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004648 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004649 }
4650
4651 apex_key {
4652 name: "myapex.key",
4653 public_key: "testkey.avbpubkey",
4654 private_key: "testkey.pem",
4655 }
4656
4657 cc_library {
4658 name: "mylib_common",
4659 srcs: ["mylib.cpp"],
4660 system_shared_libs: [],
4661 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004662 apex_available: [
4663 "//apex_available:platform",
4664 "myapex",
4665 ],
Alex Light0851b882019-02-07 13:20:53 -08004666 }
4667 `)
4668
Jooyung Hana0503a52023-08-23 13:12:50 +09004669 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004670 apexRule := module.Rule("apexRule")
4671 copyCmds := apexRule.Args["copy_commands"]
4672
4673 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4674 t.Log("Apex was a test apex!")
4675 t.Fail()
4676 }
4677 // Ensure that main rule creates an output
4678 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4679
4680 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004681 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004682
4683 // Ensure that both direct and indirect deps are copied into apex
4684 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4685
Colin Cross7113d202019-11-20 16:39:12 -08004686 // Ensure that the platform variant ends with _shared
4687 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004688
Colin Cross56a83212020-09-15 18:30:11 -07004689 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004690 t.Log("Found mylib_common not in any apex!")
4691 t.Fail()
4692 }
4693}
4694
4695func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004696 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004697 apex_test {
4698 name: "myapex",
4699 key: "myapex.key",
4700 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004701 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004702 }
4703
4704 apex_key {
4705 name: "myapex.key",
4706 public_key: "testkey.avbpubkey",
4707 private_key: "testkey.pem",
4708 }
4709
4710 cc_library {
4711 name: "mylib_common_test",
4712 srcs: ["mylib.cpp"],
4713 system_shared_libs: [],
4714 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004715 // TODO: remove //apex_available:platform
4716 apex_available: [
4717 "//apex_available:platform",
4718 "myapex",
4719 ],
Alex Light0851b882019-02-07 13:20:53 -08004720 }
4721 `)
4722
Jooyung Hana0503a52023-08-23 13:12:50 +09004723 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004724 apexRule := module.Rule("apexRule")
4725 copyCmds := apexRule.Args["copy_commands"]
4726
4727 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4728 t.Log("Apex was not a test apex!")
4729 t.Fail()
4730 }
4731 // Ensure that main rule creates an output
4732 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4733
4734 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004735 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004736
4737 // Ensure that both direct and indirect deps are copied into apex
4738 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4739
Colin Cross7113d202019-11-20 16:39:12 -08004740 // Ensure that the platform variant ends with _shared
4741 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004742}
4743
Jooyung Han85707de2023-12-01 14:21:13 +09004744func TestLibzVendorIsntStable(t *testing.T) {
4745 ctx := testApex(t, `
4746 apex {
4747 name: "myapex",
4748 key: "myapex.key",
4749 updatable: false,
4750 binaries: ["mybin"],
4751 }
4752 apex {
4753 name: "myvendorapex",
4754 key: "myapex.key",
4755 file_contexts: "myvendorapex_file_contexts",
4756 vendor: true,
4757 updatable: false,
4758 binaries: ["mybin"],
4759 }
4760 apex_key {
4761 name: "myapex.key",
4762 public_key: "testkey.avbpubkey",
4763 private_key: "testkey.pem",
4764 }
4765 cc_binary {
4766 name: "mybin",
4767 vendor_available: true,
4768 system_shared_libs: [],
4769 stl: "none",
4770 shared_libs: ["libz"],
4771 apex_available: ["//apex_available:anyapex"],
4772 }
4773 cc_library {
4774 name: "libz",
4775 vendor_available: true,
4776 system_shared_libs: [],
4777 stl: "none",
4778 stubs: {
4779 versions: ["28", "30"],
4780 },
4781 target: {
4782 vendor: {
4783 no_stubs: true,
4784 },
4785 },
4786 }
4787 `, withFiles(map[string][]byte{
4788 "myvendorapex_file_contexts": nil,
4789 }))
4790
4791 // libz provides stubs for core variant.
4792 {
4793 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4794 "bin/mybin",
4795 })
4796 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4797 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4798 }
4799 // libz doesn't provide stubs for vendor variant.
4800 {
4801 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4802 "bin/mybin",
4803 "lib64/libz.so",
4804 })
4805 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4806 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4807 }
4808}
4809
Alex Light9670d332019-01-29 18:07:33 -08004810func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004811 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004812 apex {
4813 name: "myapex",
4814 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004815 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004816 multilib: {
4817 first: {
4818 native_shared_libs: ["mylib_common"],
4819 }
4820 },
4821 target: {
4822 android: {
4823 multilib: {
4824 first: {
4825 native_shared_libs: ["mylib"],
4826 }
4827 }
4828 },
4829 host: {
4830 multilib: {
4831 first: {
4832 native_shared_libs: ["mylib2"],
4833 }
4834 }
4835 }
4836 }
4837 }
4838
4839 apex_key {
4840 name: "myapex.key",
4841 public_key: "testkey.avbpubkey",
4842 private_key: "testkey.pem",
4843 }
4844
4845 cc_library {
4846 name: "mylib",
4847 srcs: ["mylib.cpp"],
4848 system_shared_libs: [],
4849 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004850 // TODO: remove //apex_available:platform
4851 apex_available: [
4852 "//apex_available:platform",
4853 "myapex",
4854 ],
Alex Light9670d332019-01-29 18:07:33 -08004855 }
4856
4857 cc_library {
4858 name: "mylib_common",
4859 srcs: ["mylib.cpp"],
4860 system_shared_libs: [],
4861 stl: "none",
4862 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004863 // TODO: remove //apex_available:platform
4864 apex_available: [
4865 "//apex_available:platform",
4866 "myapex",
4867 ],
Alex Light9670d332019-01-29 18:07:33 -08004868 }
4869
4870 cc_library {
4871 name: "mylib2",
4872 srcs: ["mylib.cpp"],
4873 system_shared_libs: [],
4874 stl: "none",
4875 compile_multilib: "first",
4876 }
4877 `)
4878
Jooyung Hana0503a52023-08-23 13:12:50 +09004879 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004880 copyCmds := apexRule.Args["copy_commands"]
4881
4882 // Ensure that main rule creates an output
4883 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4884
4885 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004886 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4887 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4888 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004889
4890 // Ensure that both direct and indirect deps are copied into apex
4891 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4892 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4893 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4894
Colin Cross7113d202019-11-20 16:39:12 -08004895 // Ensure that the platform variant ends with _shared
4896 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4897 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4898 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004899}
Jiyong Park04480cf2019-02-06 00:16:29 +09004900
Jiyong Park59140302020-12-14 18:44:04 +09004901func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004902 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004903 apex {
4904 name: "myapex",
4905 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004906 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004907 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004908 arch: {
4909 arm64: {
4910 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004911 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004912 },
4913 x86_64: {
4914 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004915 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004916 },
4917 }
4918 }
4919
4920 apex_key {
4921 name: "myapex.key",
4922 public_key: "testkey.avbpubkey",
4923 private_key: "testkey.pem",
4924 }
4925
4926 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004927 name: "mylib.generic",
4928 srcs: ["mylib.cpp"],
4929 system_shared_libs: [],
4930 stl: "none",
4931 // TODO: remove //apex_available:platform
4932 apex_available: [
4933 "//apex_available:platform",
4934 "myapex",
4935 ],
4936 }
4937
4938 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004939 name: "mylib.arm64",
4940 srcs: ["mylib.cpp"],
4941 system_shared_libs: [],
4942 stl: "none",
4943 // TODO: remove //apex_available:platform
4944 apex_available: [
4945 "//apex_available:platform",
4946 "myapex",
4947 ],
4948 }
4949
4950 cc_library {
4951 name: "mylib.x64",
4952 srcs: ["mylib.cpp"],
4953 system_shared_libs: [],
4954 stl: "none",
4955 // TODO: remove //apex_available:platform
4956 apex_available: [
4957 "//apex_available:platform",
4958 "myapex",
4959 ],
4960 }
4961 `)
4962
Jooyung Hana0503a52023-08-23 13:12:50 +09004963 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004964 copyCmds := apexRule.Args["copy_commands"]
4965
4966 // Ensure that apex variant is created for the direct dep
4967 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004968 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004969 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4970
4971 // Ensure that both direct and indirect deps are copied into apex
4972 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4973 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4974}
4975
Jiyong Park04480cf2019-02-06 00:16:29 +09004976func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004977 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004978 apex {
4979 name: "myapex",
4980 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004981 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004982 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004983 }
4984
4985 apex_key {
4986 name: "myapex.key",
4987 public_key: "testkey.avbpubkey",
4988 private_key: "testkey.pem",
4989 }
4990
4991 sh_binary {
4992 name: "myscript",
4993 src: "mylib.cpp",
4994 filename: "myscript.sh",
4995 sub_dir: "script",
4996 }
4997 `)
4998
Jooyung Hana0503a52023-08-23 13:12:50 +09004999 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09005000 copyCmds := apexRule.Args["copy_commands"]
5001
5002 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
5003}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005004
Jooyung Han91df2082019-11-20 01:49:42 +09005005func TestApexInVariousPartition(t *testing.T) {
5006 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005007 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005008 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005009 {"", "system"},
5010 {"product_specific: true", "product"},
5011 {"soc_specific: true", "vendor"},
5012 {"proprietary: true", "vendor"},
5013 {"vendor: true", "vendor"},
5014 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005015 }
5016 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005017 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005018 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005019 apex {
5020 name: "myapex",
5021 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005022 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005023 `+tc.propName+`
5024 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005025
Jooyung Han91df2082019-11-20 01:49:42 +09005026 apex_key {
5027 name: "myapex.key",
5028 public_key: "testkey.avbpubkey",
5029 private_key: "testkey.pem",
5030 }
5031 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005032
Jooyung Hana0503a52023-08-23 13:12:50 +09005033 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005034 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005035 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005036 if actual != expected {
5037 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5038 }
Jooyung Han91df2082019-11-20 01:49:42 +09005039 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005040 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005041}
Jiyong Park67882562019-03-21 01:11:21 +09005042
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005044 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 apex {
5046 name: "myapex",
5047 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005048 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005049 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005050
Jooyung Han580eb4f2020-06-24 19:33:06 +09005051 apex_key {
5052 name: "myapex.key",
5053 public_key: "testkey.avbpubkey",
5054 private_key: "testkey.pem",
5055 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005056 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005057 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005058 rule := module.Output("file_contexts")
5059 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5060}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005061
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005063 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex {
5065 name: "myapex",
5066 key: "myapex.key",
5067 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005068 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005069 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005070
Jooyung Han580eb4f2020-06-24 19:33:06 +09005071 apex_key {
5072 name: "myapex.key",
5073 public_key: "testkey.avbpubkey",
5074 private_key: "testkey.pem",
5075 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076 `, withFiles(map[string][]byte{
5077 "my_own_file_contexts": nil,
5078 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005080
Jooyung Han580eb4f2020-06-24 19:33:06 +09005081func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005082 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 apex {
5084 name: "myapex",
5085 key: "myapex.key",
5086 product_specific: true,
5087 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005088 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005089 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005090
Jooyung Han580eb4f2020-06-24 19:33:06 +09005091 apex_key {
5092 name: "myapex.key",
5093 public_key: "testkey.avbpubkey",
5094 private_key: "testkey.pem",
5095 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005096 `)
5097
Colin Cross1c460562021-02-16 17:55:47 -08005098 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005099 apex {
5100 name: "myapex",
5101 key: "myapex.key",
5102 product_specific: true,
5103 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005104 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005105 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005106
Jooyung Han580eb4f2020-06-24 19:33:06 +09005107 apex_key {
5108 name: "myapex.key",
5109 public_key: "testkey.avbpubkey",
5110 private_key: "testkey.pem",
5111 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005112 `, withFiles(map[string][]byte{
5113 "product_specific_file_contexts": nil,
5114 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005115 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116 rule := module.Output("file_contexts")
5117 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5118}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005119
Jooyung Han580eb4f2020-06-24 19:33:06 +09005120func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005121 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005122 apex {
5123 name: "myapex",
5124 key: "myapex.key",
5125 product_specific: true,
5126 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005127 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005128 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005129
Jooyung Han580eb4f2020-06-24 19:33:06 +09005130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005135
Jooyung Han580eb4f2020-06-24 19:33:06 +09005136 filegroup {
5137 name: "my-file-contexts",
5138 srcs: ["product_specific_file_contexts"],
5139 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005140 `, withFiles(map[string][]byte{
5141 "product_specific_file_contexts": nil,
5142 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005143 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005144 rule := module.Output("file_contexts")
5145 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005146}
5147
Jiyong Park67882562019-03-21 01:11:21 +09005148func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005149 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005150 apex_key {
5151 name: "myapex.key",
5152 public_key: ":my.avbpubkey",
5153 private_key: ":my.pem",
5154 product_specific: true,
5155 }
5156
5157 filegroup {
5158 name: "my.avbpubkey",
5159 srcs: ["testkey2.avbpubkey"],
5160 }
5161
5162 filegroup {
5163 name: "my.pem",
5164 srcs: ["testkey2.pem"],
5165 }
5166 `)
5167
5168 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5169 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005170 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005171 if actual_pubkey != expected_pubkey {
5172 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5173 }
5174 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005175 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005176 if actual_privkey != expected_privkey {
5177 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5178 }
5179}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005180
5181func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005182 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005183 prebuilt_apex {
5184 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005185 arch: {
5186 arm64: {
5187 src: "myapex-arm64.apex",
5188 },
5189 arm: {
5190 src: "myapex-arm.apex",
5191 },
5192 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005193 }
5194 `)
5195
Wei Li340ee8e2022-03-18 17:33:24 -07005196 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5197 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005198
Jiyong Parkc95714e2019-03-29 14:23:10 +09005199 expectedInput := "myapex-arm64.apex"
5200 if prebuilt.inputApex.String() != expectedInput {
5201 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5202 }
Wei Li340ee8e2022-03-18 17:33:24 -07005203 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5204 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5205 rule := testingModule.Rule("genProvenanceMetaData")
5206 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5207 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5208 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5209 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005210
5211 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5212 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005213}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005214
Paul Duffinc0609c62021-03-01 17:27:16 +00005215func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005216 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005217 prebuilt_apex {
5218 name: "myapex",
5219 }
5220 `)
5221}
5222
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005223func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005224 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005225 prebuilt_apex {
5226 name: "myapex",
5227 src: "myapex-arm.apex",
5228 filename: "notmyapex.apex",
5229 }
5230 `)
5231
Wei Li340ee8e2022-03-18 17:33:24 -07005232 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5233 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005234
5235 expected := "notmyapex.apex"
5236 if p.installFilename != expected {
5237 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5238 }
Wei Li340ee8e2022-03-18 17:33:24 -07005239 rule := testingModule.Rule("genProvenanceMetaData")
5240 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5241 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5242 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5243 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005244}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005245
Samiul Islam7c02e262021-09-08 17:48:28 +01005246func TestApexSetFilenameOverride(t *testing.T) {
5247 testApex(t, `
5248 apex_set {
5249 name: "com.company.android.myapex",
5250 apex_name: "com.android.myapex",
5251 set: "company-myapex.apks",
5252 filename: "com.company.android.myapex.apex"
5253 }
5254 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5255
5256 testApex(t, `
5257 apex_set {
5258 name: "com.company.android.myapex",
5259 apex_name: "com.android.myapex",
5260 set: "company-myapex.apks",
5261 filename: "com.company.android.myapex.capex"
5262 }
5263 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5264
5265 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5266 apex_set {
5267 name: "com.company.android.myapex",
5268 apex_name: "com.android.myapex",
5269 set: "company-myapex.apks",
5270 filename: "some-random-suffix"
5271 }
5272 `)
5273}
5274
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005275func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005276 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005277 prebuilt_apex {
5278 name: "myapex.prebuilt",
5279 src: "myapex-arm.apex",
5280 overrides: [
5281 "myapex",
5282 ],
5283 }
5284 `)
5285
Wei Li340ee8e2022-03-18 17:33:24 -07005286 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5287 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005288
5289 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005290 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005291 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005292 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005293 }
Wei Li340ee8e2022-03-18 17:33:24 -07005294 rule := testingModule.Rule("genProvenanceMetaData")
5295 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5296 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5297 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5298 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005299}
5300
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005301func TestPrebuiltApexName(t *testing.T) {
5302 testApex(t, `
5303 prebuilt_apex {
5304 name: "com.company.android.myapex",
5305 apex_name: "com.android.myapex",
5306 src: "company-myapex-arm.apex",
5307 }
5308 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5309
5310 testApex(t, `
5311 apex_set {
5312 name: "com.company.android.myapex",
5313 apex_name: "com.android.myapex",
5314 set: "company-myapex.apks",
5315 }
5316 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5317}
5318
5319func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5320 _ = android.GroupFixturePreparers(
5321 java.PrepareForTestWithJavaDefaultModules,
5322 PrepareForTestWithApexBuildComponents,
5323 android.FixtureWithRootAndroidBp(`
5324 platform_bootclasspath {
5325 name: "platform-bootclasspath",
5326 fragments: [
5327 {
5328 apex: "com.android.art",
5329 module: "art-bootclasspath-fragment",
5330 },
5331 ],
5332 }
5333
5334 prebuilt_apex {
5335 name: "com.company.android.art",
5336 apex_name: "com.android.art",
5337 src: "com.company.android.art-arm.apex",
5338 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5339 }
5340
5341 prebuilt_bootclasspath_fragment {
5342 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005343 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005344 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005345 hidden_api: {
5346 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5347 metadata: "my-bootclasspath-fragment/metadata.csv",
5348 index: "my-bootclasspath-fragment/index.csv",
5349 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5350 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5351 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005352 }
5353
5354 java_import {
5355 name: "core-oj",
5356 jars: ["prebuilt.jar"],
5357 }
5358 `),
5359 ).RunTest(t)
5360}
5361
Spandan Das59a4a2b2024-01-09 21:35:56 +00005362// A minimal context object for use with DexJarBuildPath
5363type moduleErrorfTestCtx struct {
5364}
5365
5366func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5367}
5368
Paul Duffin092153d2021-01-26 11:42:39 +00005369// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5370// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005371func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005372 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005373
Paul Duffin89886cb2021-02-05 16:44:03 +00005374 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005375 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005376 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005377 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005378 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005379 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005380 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005381 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005382 android.NormalizePathForTesting(dexJarBuildPath))
5383 }
5384
5385 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005386 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005387 // Make sure the import has been given the correct path to the dex jar.
5388 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5389 dexJarBuildPath := p.DexJarInstallPath()
5390 stem := android.RemoveOptionalPrebuiltPrefix(name)
5391 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5392 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5393 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005394 }
5395
Paul Duffin39853512021-02-26 11:09:39 +00005396 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005397 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005398 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005399 android.AssertArrayString(t, "Check if there is no source variant",
5400 []string{"android_common"},
5401 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005402 }
5403
5404 t.Run("prebuilt only", func(t *testing.T) {
5405 bp := `
5406 prebuilt_apex {
5407 name: "myapex",
5408 arch: {
5409 arm64: {
5410 src: "myapex-arm64.apex",
5411 },
5412 arm: {
5413 src: "myapex-arm.apex",
5414 },
5415 },
Paul Duffin39853512021-02-26 11:09:39 +00005416 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005417 }
5418
5419 java_import {
5420 name: "libfoo",
5421 jars: ["libfoo.jar"],
5422 }
Paul Duffin39853512021-02-26 11:09:39 +00005423
5424 java_sdk_library_import {
5425 name: "libbar",
5426 public: {
5427 jars: ["libbar.jar"],
5428 },
5429 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005430 `
5431
5432 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5433 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5434
Spandan Das3576e762024-01-03 18:57:03 +00005435 deapexerName := deapexerModuleName("prebuilt_myapex")
5436 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005437
Paul Duffinf6932af2021-02-26 18:21:56 +00005438 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005439 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005440 rule := deapexer.Rule("deapexer")
5441 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5442 t.Errorf("expected: %q, found: %q", expected, actual)
5443 }
5444
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005445 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005446 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005447 rule = prebuiltApex.Rule("android/soong/android.Cp")
5448 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5449 t.Errorf("expected: %q, found: %q", expected, actual)
5450 }
5451
Paul Duffin89886cb2021-02-05 16:44:03 +00005452 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005453 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005454
5455 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005456 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005457 })
5458
5459 t.Run("prebuilt with source preferred", func(t *testing.T) {
5460
5461 bp := `
5462 prebuilt_apex {
5463 name: "myapex",
5464 arch: {
5465 arm64: {
5466 src: "myapex-arm64.apex",
5467 },
5468 arm: {
5469 src: "myapex-arm.apex",
5470 },
5471 },
Paul Duffin39853512021-02-26 11:09:39 +00005472 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005473 }
5474
5475 java_import {
5476 name: "libfoo",
5477 jars: ["libfoo.jar"],
5478 }
5479
5480 java_library {
5481 name: "libfoo",
5482 }
Paul Duffin39853512021-02-26 11:09:39 +00005483
5484 java_sdk_library_import {
5485 name: "libbar",
5486 public: {
5487 jars: ["libbar.jar"],
5488 },
5489 }
5490
5491 java_sdk_library {
5492 name: "libbar",
5493 srcs: ["foo/bar/MyClass.java"],
5494 unsafe_ignore_missing_latest_api: true,
5495 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005496 `
5497
5498 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5499 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5500
Paul Duffin89886cb2021-02-05 16:44:03 +00005501 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005502 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005503 ensureNoSourceVariant(t, ctx, "libfoo")
5504
5505 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005506 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005507 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005508 })
5509
5510 t.Run("prebuilt preferred with source", func(t *testing.T) {
5511 bp := `
5512 prebuilt_apex {
5513 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005514 arch: {
5515 arm64: {
5516 src: "myapex-arm64.apex",
5517 },
5518 arm: {
5519 src: "myapex-arm.apex",
5520 },
5521 },
Paul Duffin39853512021-02-26 11:09:39 +00005522 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005523 }
5524
5525 java_import {
5526 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005527 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005528 jars: ["libfoo.jar"],
5529 }
5530
5531 java_library {
5532 name: "libfoo",
5533 }
Paul Duffin39853512021-02-26 11:09:39 +00005534
5535 java_sdk_library_import {
5536 name: "libbar",
5537 prefer: true,
5538 public: {
5539 jars: ["libbar.jar"],
5540 },
5541 }
5542
5543 java_sdk_library {
5544 name: "libbar",
5545 srcs: ["foo/bar/MyClass.java"],
5546 unsafe_ignore_missing_latest_api: true,
5547 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005548 `
5549
5550 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5551 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5552
Paul Duffin89886cb2021-02-05 16:44:03 +00005553 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005554 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005555 ensureNoSourceVariant(t, ctx, "libfoo")
5556
5557 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005558 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005559 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005560 })
5561}
5562
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005564 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005565 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005566 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5567 // is disabled.
5568 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5569 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005570
Paul Duffin37856732021-02-26 14:24:15 +00005571 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5572 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005573 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005575 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005576 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005577 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005578 foundLibfooJar = true
5579 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005580 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
5582 }
5583 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005584 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 +00005585 }
5586 }
5587
Paul Duffin40a3f652021-07-19 13:11:24 +01005588 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005589 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005590 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005591 var rule android.TestingBuildParams
5592
5593 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5594 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005595 }
5596
Paul Duffin40a3f652021-07-19 13:11:24 +01005597 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5598 t.Helper()
5599 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5600 var rule android.TestingBuildParams
5601
5602 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5603 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5604 }
5605
Paul Duffin89f570a2021-06-16 01:42:33 +01005606 fragment := java.ApexVariantReference{
5607 Apex: proptools.StringPtr("myapex"),
5608 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5609 }
5610
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005611 t.Run("prebuilt only", func(t *testing.T) {
5612 bp := `
5613 prebuilt_apex {
5614 name: "myapex",
5615 arch: {
5616 arm64: {
5617 src: "myapex-arm64.apex",
5618 },
5619 arm: {
5620 src: "myapex-arm.apex",
5621 },
5622 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005623 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5624 }
5625
5626 prebuilt_bootclasspath_fragment {
5627 name: "my-bootclasspath-fragment",
5628 contents: ["libfoo", "libbar"],
5629 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005630 hidden_api: {
5631 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5632 metadata: "my-bootclasspath-fragment/metadata.csv",
5633 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005634 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5635 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5636 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005637 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005638 }
5639
5640 java_import {
5641 name: "libfoo",
5642 jars: ["libfoo.jar"],
5643 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005644 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 }
Paul Duffin37856732021-02-26 14:24:15 +00005646
5647 java_sdk_library_import {
5648 name: "libbar",
5649 public: {
5650 jars: ["libbar.jar"],
5651 },
5652 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005653 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005654 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005655 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005656 `
5657
Paul Duffin89f570a2021-06-16 01:42:33 +01005658 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005659 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5660 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005661
Paul Duffin537ea3d2021-05-14 10:38:00 +01005662 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005663 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005664 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005665 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005666 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005667 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 +01005668 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005669 })
5670
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005671 t.Run("apex_set only", func(t *testing.T) {
5672 bp := `
5673 apex_set {
5674 name: "myapex",
5675 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005676 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005677 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005678 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5679 }
5680
5681 java_import {
5682 name: "myjavalib",
5683 jars: ["myjavalib.jar"],
5684 apex_available: ["myapex"],
5685 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005686 }
5687
5688 prebuilt_bootclasspath_fragment {
5689 name: "my-bootclasspath-fragment",
5690 contents: ["libfoo", "libbar"],
5691 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005692 hidden_api: {
5693 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5694 metadata: "my-bootclasspath-fragment/metadata.csv",
5695 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005696 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5697 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5698 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005699 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005700 }
5701
Liz Kammer2dc72442023-04-20 10:10:48 -04005702 prebuilt_systemserverclasspath_fragment {
5703 name: "my-systemserverclasspath-fragment",
5704 contents: ["libbaz"],
5705 apex_available: ["myapex"],
5706 }
5707
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005708 java_import {
5709 name: "libfoo",
5710 jars: ["libfoo.jar"],
5711 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005712 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005713 }
5714
5715 java_sdk_library_import {
5716 name: "libbar",
5717 public: {
5718 jars: ["libbar.jar"],
5719 },
5720 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005721 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005722 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005723 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005724
5725 java_sdk_library_import {
5726 name: "libbaz",
5727 public: {
5728 jars: ["libbaz.jar"],
5729 },
5730 apex_available: ["myapex"],
5731 shared_library: false,
5732 permitted_packages: ["baz"],
5733 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005734 `
5735
Paul Duffin89f570a2021-06-16 01:42:33 +01005736 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005737 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5738 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005739
Paul Duffin537ea3d2021-05-14 10:38:00 +01005740 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005741 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005742 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005743 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005744 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005745 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 +01005746 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005747
5748 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5749
5750 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005751 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005752 "myjavalib.myapex",
5753 "libfoo.myapex",
5754 "libbar.myapex",
5755 "libbaz.myapex",
5756 }
5757 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5758 for i, e := range mkEntries {
5759 g := e.OverrideName
5760 if w := overrideNames[i]; w != g {
5761 t.Errorf("Expected override name %q, got %q", w, g)
5762 }
5763 }
5764
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005765 })
5766
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005767 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5768 bp := `
5769 prebuilt_apex {
5770 name: "myapex",
5771 arch: {
5772 arm64: {
5773 src: "myapex-arm64.apex",
5774 },
5775 arm: {
5776 src: "myapex-arm.apex",
5777 },
5778 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005779 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5780 }
5781
5782 prebuilt_bootclasspath_fragment {
5783 name: "my-bootclasspath-fragment",
5784 contents: ["libfoo", "libbar"],
5785 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005786 hidden_api: {
5787 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5788 metadata: "my-bootclasspath-fragment/metadata.csv",
5789 index: "my-bootclasspath-fragment/index.csv",
5790 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5791 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5792 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005793 }
5794
5795 java_import {
5796 name: "libfoo",
5797 jars: ["libfoo.jar"],
5798 apex_available: ["myapex"],
5799 }
5800
5801 java_library {
5802 name: "libfoo",
5803 srcs: ["foo/bar/MyClass.java"],
5804 apex_available: ["myapex"],
5805 }
Paul Duffin37856732021-02-26 14:24:15 +00005806
5807 java_sdk_library_import {
5808 name: "libbar",
5809 public: {
5810 jars: ["libbar.jar"],
5811 },
5812 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005813 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005814 }
5815
5816 java_sdk_library {
5817 name: "libbar",
5818 srcs: ["foo/bar/MyClass.java"],
5819 unsafe_ignore_missing_latest_api: true,
5820 apex_available: ["myapex"],
5821 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005822 `
5823
5824 // In this test the source (java_library) libfoo is active since the
5825 // prebuilt (java_import) defaults to prefer:false. However the
5826 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5827 // find the dex boot jar in it. We either need to disable the source libfoo
5828 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005829 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005830 // dexbootjar check is skipped if AllowMissingDependencies is true
5831 preparerAllowMissingDeps := android.GroupFixturePreparers(
5832 preparer,
5833 android.PrepareForTestWithAllowMissingDependencies,
5834 )
5835 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005836 })
5837
5838 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5839 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005840 apex {
5841 name: "myapex",
5842 key: "myapex.key",
5843 updatable: false,
5844 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5845 }
5846
5847 apex_key {
5848 name: "myapex.key",
5849 public_key: "testkey.avbpubkey",
5850 private_key: "testkey.pem",
5851 }
5852
5853 bootclasspath_fragment {
5854 name: "my-bootclasspath-fragment",
5855 contents: ["libfoo", "libbar"],
5856 apex_available: ["myapex"],
5857 hidden_api: {
5858 split_packages: ["*"],
5859 },
5860 }
5861
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005862 prebuilt_apex {
5863 name: "myapex",
5864 arch: {
5865 arm64: {
5866 src: "myapex-arm64.apex",
5867 },
5868 arm: {
5869 src: "myapex-arm.apex",
5870 },
5871 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005872 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5873 }
5874
5875 prebuilt_bootclasspath_fragment {
5876 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005877 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005878 contents: ["libfoo", "libbar"],
5879 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005880 hidden_api: {
5881 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5882 metadata: "my-bootclasspath-fragment/metadata.csv",
5883 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005884 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5885 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5886 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005887 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005888 }
5889
5890 java_import {
5891 name: "libfoo",
5892 prefer: true,
5893 jars: ["libfoo.jar"],
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005896 }
5897
5898 java_library {
5899 name: "libfoo",
5900 srcs: ["foo/bar/MyClass.java"],
5901 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005902 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005903 }
Paul Duffin37856732021-02-26 14:24:15 +00005904
5905 java_sdk_library_import {
5906 name: "libbar",
5907 prefer: true,
5908 public: {
5909 jars: ["libbar.jar"],
5910 },
5911 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005912 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005913 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005914 }
5915
5916 java_sdk_library {
5917 name: "libbar",
5918 srcs: ["foo/bar/MyClass.java"],
5919 unsafe_ignore_missing_latest_api: true,
5920 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005921 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005922 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005923 `
5924
Paul Duffin89f570a2021-06-16 01:42:33 +01005925 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005926 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5927 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005928
Paul Duffin537ea3d2021-05-14 10:38:00 +01005929 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005930 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005931 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005932 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005933 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005934 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 +01005935 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005936 })
5937
5938 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5939 bp := `
5940 apex {
5941 name: "myapex",
5942 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005943 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005944 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005945 }
5946
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }
5952
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005953 bootclasspath_fragment {
5954 name: "my-bootclasspath-fragment",
5955 contents: ["libfoo", "libbar"],
5956 apex_available: ["myapex"],
5957 hidden_api: {
5958 split_packages: ["*"],
5959 },
5960 }
5961
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005962 prebuilt_apex {
5963 name: "myapex",
5964 arch: {
5965 arm64: {
5966 src: "myapex-arm64.apex",
5967 },
5968 arm: {
5969 src: "myapex-arm.apex",
5970 },
5971 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005972 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5973 }
5974
5975 prebuilt_bootclasspath_fragment {
5976 name: "my-bootclasspath-fragment",
5977 contents: ["libfoo", "libbar"],
5978 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005979 hidden_api: {
5980 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5981 metadata: "my-bootclasspath-fragment/metadata.csv",
5982 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005983 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5984 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5985 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005986 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005987 }
5988
5989 java_import {
5990 name: "libfoo",
5991 jars: ["libfoo.jar"],
5992 apex_available: ["myapex"],
5993 }
5994
5995 java_library {
5996 name: "libfoo",
5997 srcs: ["foo/bar/MyClass.java"],
5998 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005999 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006000 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 }
Paul Duffin37856732021-02-26 14:24:15 +00006002
6003 java_sdk_library_import {
6004 name: "libbar",
6005 public: {
6006 jars: ["libbar.jar"],
6007 },
6008 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006009 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006010 }
6011
6012 java_sdk_library {
6013 name: "libbar",
6014 srcs: ["foo/bar/MyClass.java"],
6015 unsafe_ignore_missing_latest_api: true,
6016 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006017 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006018 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006019 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006020 `
6021
Paul Duffin89f570a2021-06-16 01:42:33 +01006022 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006023 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6024 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 +00006025
Paul Duffin537ea3d2021-05-14 10:38:00 +01006026 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006027 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006028 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6029 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006030 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6031 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 +01006032 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006033 })
6034
6035 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6036 bp := `
6037 apex {
6038 name: "myapex",
6039 enabled: false,
6040 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006041 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006042 }
6043
6044 apex_key {
6045 name: "myapex.key",
6046 public_key: "testkey.avbpubkey",
6047 private_key: "testkey.pem",
6048 }
6049
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006050 bootclasspath_fragment {
6051 name: "my-bootclasspath-fragment",
6052 enabled: false,
6053 contents: ["libfoo", "libbar"],
6054 apex_available: ["myapex"],
6055 hidden_api: {
6056 split_packages: ["*"],
6057 },
6058 }
6059
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006060 prebuilt_apex {
6061 name: "myapex",
6062 arch: {
6063 arm64: {
6064 src: "myapex-arm64.apex",
6065 },
6066 arm: {
6067 src: "myapex-arm.apex",
6068 },
6069 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006070 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6071 }
6072
6073 prebuilt_bootclasspath_fragment {
6074 name: "my-bootclasspath-fragment",
6075 contents: ["libfoo", "libbar"],
6076 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006077 hidden_api: {
6078 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6079 metadata: "my-bootclasspath-fragment/metadata.csv",
6080 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006081 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6082 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6083 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006084 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006085 }
6086
6087 java_import {
6088 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006089 jars: ["libfoo.jar"],
6090 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006091 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006092 }
6093
6094 java_library {
6095 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006096 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006097 srcs: ["foo/bar/MyClass.java"],
6098 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006099 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006100 }
Paul Duffin37856732021-02-26 14:24:15 +00006101
6102 java_sdk_library_import {
6103 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006104 public: {
6105 jars: ["libbar.jar"],
6106 },
6107 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006108 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006109 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006110 }
6111
6112 java_sdk_library {
6113 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006114 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006115 srcs: ["foo/bar/MyClass.java"],
6116 unsafe_ignore_missing_latest_api: true,
6117 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006118 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006119 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006120 `
6121
Paul Duffin89f570a2021-06-16 01:42:33 +01006122 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006123 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6124 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006125
Paul Duffin537ea3d2021-05-14 10:38:00 +01006126 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006127 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006128 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006129 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006130 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006131 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 +01006132 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006133 })
Spandan Das3a392012024-01-17 18:26:27 +00006134
6135 t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
6136 bp := `
6137 // Source
6138 apex {
6139 name: "myapex",
6140 enabled: false,
6141 key: "myapex.key",
6142 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6143 }
6144
6145 apex_key {
6146 name: "myapex.key",
6147 public_key: "testkey.avbpubkey",
6148 private_key: "testkey.pem",
6149 }
6150
6151 // Prebuilt
6152 prebuilt_apex {
6153 name: "myapex.v1",
6154 source_apex_name: "myapex",
6155 arch: {
6156 arm64: {
6157 src: "myapex-arm64.apex",
6158 },
6159 arm: {
6160 src: "myapex-arm.apex",
6161 },
6162 },
6163 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6164 prefer: true,
6165 }
6166 prebuilt_apex {
6167 name: "myapex.v2",
6168 source_apex_name: "myapex",
6169 arch: {
6170 arm64: {
6171 src: "myapex-arm64.apex",
6172 },
6173 arm: {
6174 src: "myapex-arm.apex",
6175 },
6176 },
6177 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6178 prefer: true,
6179 }
6180
6181 prebuilt_bootclasspath_fragment {
6182 name: "my-bootclasspath-fragment",
6183 contents: ["libfoo", "libbar"],
6184 apex_available: ["myapex"],
6185 hidden_api: {
6186 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6187 metadata: "my-bootclasspath-fragment/metadata.csv",
6188 index: "my-bootclasspath-fragment/index.csv",
6189 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6190 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6191 },
6192 prefer: true,
6193 }
6194
6195 java_import {
6196 name: "libfoo",
6197 jars: ["libfoo.jar"],
6198 apex_available: ["myapex"],
6199 prefer: true,
6200 }
6201 java_import {
6202 name: "libbar",
6203 jars: ["libbar.jar"],
6204 apex_available: ["myapex"],
6205 prefer: true,
6206 }
6207 `
6208
6209 testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
6210 })
6211
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006212}
6213
Roland Levillain630846d2019-06-26 12:48:34 +01006214func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006215 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006216 apex_test {
6217 name: "myapex",
6218 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006219 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006220 tests: [
6221 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006222 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006223 ],
6224 }
6225
6226 apex_key {
6227 name: "myapex.key",
6228 public_key: "testkey.avbpubkey",
6229 private_key: "testkey.pem",
6230 }
6231
Liz Kammer1c14a212020-05-12 15:26:55 -07006232 filegroup {
6233 name: "fg",
6234 srcs: [
6235 "baz",
6236 "bar/baz"
6237 ],
6238 }
6239
Roland Levillain630846d2019-06-26 12:48:34 +01006240 cc_test {
6241 name: "mytest",
6242 gtest: false,
6243 srcs: ["mytest.cpp"],
6244 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006245 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006246 system_shared_libs: [],
6247 static_executable: true,
6248 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006249 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006250 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006251
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006252 cc_library {
6253 name: "mylib",
6254 srcs: ["mylib.cpp"],
6255 system_shared_libs: [],
6256 stl: "none",
6257 }
6258
Liz Kammer5bd365f2020-05-27 15:15:11 -07006259 filegroup {
6260 name: "fg2",
6261 srcs: [
6262 "testdata/baz"
6263 ],
6264 }
6265
Roland Levillain9b5fde92019-06-28 15:41:19 +01006266 cc_test {
6267 name: "mytests",
6268 gtest: false,
6269 srcs: [
6270 "mytest1.cpp",
6271 "mytest2.cpp",
6272 "mytest3.cpp",
6273 ],
6274 test_per_src: true,
6275 relative_install_path: "test",
6276 system_shared_libs: [],
6277 static_executable: true,
6278 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006279 data: [
6280 ":fg",
6281 ":fg2",
6282 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006283 }
Roland Levillain630846d2019-06-26 12:48:34 +01006284 `)
6285
Jooyung Hana0503a52023-08-23 13:12:50 +09006286 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006287 copyCmds := apexRule.Args["copy_commands"]
6288
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006289 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006290 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006291 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006292
Liz Kammer1c14a212020-05-12 15:26:55 -07006293 //Ensure that test data are copied into apex.
6294 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6295 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6296
Roland Levillain9b5fde92019-06-28 15:41:19 +01006297 // Ensure that test deps built with `test_per_src` are copied into apex.
6298 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6299 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6300 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006301
6302 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006303 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006304 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006305 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006306 prefix := "TARGET_"
6307 var builder strings.Builder
6308 data.Custom(&builder, name, prefix, "", data)
6309 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006310 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6311 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6312 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6313 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006314 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006315}
6316
Jooyung Hand48f3c32019-08-23 11:18:57 +09006317func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6318 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6319 apex {
6320 name: "myapex",
6321 key: "myapex.key",
6322 native_shared_libs: ["libfoo"],
6323 }
6324
6325 apex_key {
6326 name: "myapex.key",
6327 public_key: "testkey.avbpubkey",
6328 private_key: "testkey.pem",
6329 }
6330
6331 cc_library {
6332 name: "libfoo",
6333 stl: "none",
6334 system_shared_libs: [],
6335 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006336 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006337 }
6338 `)
6339 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6340 apex {
6341 name: "myapex",
6342 key: "myapex.key",
6343 java_libs: ["myjar"],
6344 }
6345
6346 apex_key {
6347 name: "myapex.key",
6348 public_key: "testkey.avbpubkey",
6349 private_key: "testkey.pem",
6350 }
6351
6352 java_library {
6353 name: "myjar",
6354 srcs: ["foo/bar/MyClass.java"],
6355 sdk_version: "none",
6356 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006357 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006358 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006359 }
6360 `)
6361}
6362
Bill Peckhama41a6962021-01-11 10:58:54 -08006363func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006364 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006365 apex {
6366 name: "myapex",
6367 key: "myapex.key",
6368 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006369 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006370 }
6371
6372 apex_key {
6373 name: "myapex.key",
6374 public_key: "testkey.avbpubkey",
6375 private_key: "testkey.pem",
6376 }
6377
6378 java_import {
6379 name: "myjavaimport",
6380 apex_available: ["myapex"],
6381 jars: ["my.jar"],
6382 compile_dex: true,
6383 }
6384 `)
6385
Jooyung Hana0503a52023-08-23 13:12:50 +09006386 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006387 apexRule := module.Rule("apexRule")
6388 copyCmds := apexRule.Args["copy_commands"]
6389 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6390}
6391
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006392func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006393 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006394 apex {
6395 name: "myapex",
6396 key: "myapex.key",
6397 apps: [
6398 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006399 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006400 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006401 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006402 }
6403
6404 apex_key {
6405 name: "myapex.key",
6406 public_key: "testkey.avbpubkey",
6407 private_key: "testkey.pem",
6408 }
6409
6410 android_app {
6411 name: "AppFoo",
6412 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006413 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006414 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006415 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006417 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006418 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006419
6420 android_app {
6421 name: "AppFooPriv",
6422 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006423 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006424 system_modules: "none",
6425 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006426 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006427 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006428 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006429 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006430
6431 cc_library_shared {
6432 name: "libjni",
6433 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006434 shared_libs: ["libfoo"],
6435 stl: "none",
6436 system_shared_libs: [],
6437 apex_available: [ "myapex" ],
6438 sdk_version: "current",
6439 }
6440
6441 cc_library_shared {
6442 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006443 stl: "none",
6444 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006445 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006446 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006447 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006448 `)
6449
Jooyung Hana0503a52023-08-23 13:12:50 +09006450 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006451 apexRule := module.Rule("apexRule")
6452 copyCmds := apexRule.Args["copy_commands"]
6453
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006454 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6455 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006456 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006457
Colin Crossaede88c2020-08-11 12:17:01 -07006458 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006459 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006460 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006461 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006462 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006463 // JNI libraries including transitive deps are
6464 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006465 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006466 // ... embedded inside APK (jnilibs.zip)
6467 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6468 // ... and not directly inside the APEX
6469 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6470 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006471
6472 apexBundle := module.Module().(*apexBundle)
6473 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6474 var builder strings.Builder
6475 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6476 androidMk := builder.String()
6477 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6478 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6479 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6480 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6481 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6482 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 +01006483}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006484
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006485func TestApexWithAppImportBuildId(t *testing.T) {
6486 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6487 for _, id := range invalidBuildIds {
6488 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6489 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6490 variables.BuildId = proptools.StringPtr(id)
6491 })
6492 testApexError(t, message, `apex {
6493 name: "myapex",
6494 key: "myapex.key",
6495 apps: ["AppFooPrebuilt"],
6496 updatable: false,
6497 }
6498
6499 apex_key {
6500 name: "myapex.key",
6501 public_key: "testkey.avbpubkey",
6502 private_key: "testkey.pem",
6503 }
6504
6505 android_app_import {
6506 name: "AppFooPrebuilt",
6507 apk: "PrebuiltAppFoo.apk",
6508 presigned: true,
6509 apex_available: ["myapex"],
6510 }
6511 `, fixture)
6512 }
6513}
6514
Dario Frenicde2a032019-10-27 00:29:22 +01006515func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006516 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 apps: [
6521 "AppFooPrebuilt",
6522 "AppFooPrivPrebuilt",
6523 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006524 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006525 }
6526
6527 apex_key {
6528 name: "myapex.key",
6529 public_key: "testkey.avbpubkey",
6530 private_key: "testkey.pem",
6531 }
6532
6533 android_app_import {
6534 name: "AppFooPrebuilt",
6535 apk: "PrebuiltAppFoo.apk",
6536 presigned: true,
6537 dex_preopt: {
6538 enabled: false,
6539 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006540 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006541 }
6542
6543 android_app_import {
6544 name: "AppFooPrivPrebuilt",
6545 apk: "PrebuiltAppFooPriv.apk",
6546 privileged: true,
6547 presigned: true,
6548 dex_preopt: {
6549 enabled: false,
6550 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006551 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006552 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006553 }
6554 `)
6555
Jooyung Hana0503a52023-08-23 13:12:50 +09006556 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006557 apexRule := module.Rule("apexRule")
6558 copyCmds := apexRule.Args["copy_commands"]
6559
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006560 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6561 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006562}
6563
6564func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006565 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006566 apex {
6567 name: "myapex",
6568 key: "myapex.key",
6569 apps: [
6570 "AppFoo",
6571 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006572 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006573 }
6574
6575 apex_key {
6576 name: "myapex.key",
6577 public_key: "testkey.avbpubkey",
6578 private_key: "testkey.pem",
6579 }
6580
6581 android_app {
6582 name: "AppFoo",
6583 srcs: ["foo/bar/MyClass.java"],
6584 sdk_version: "none",
6585 system_modules: "none",
6586 apex_available: [ "myapex" ],
6587 }
6588
6589 android_app_import {
6590 name: "AppFoo",
6591 apk: "AppFooPrebuilt.apk",
6592 filename: "AppFooPrebuilt.apk",
6593 presigned: true,
6594 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006595 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006596 }
6597 `, withFiles(map[string][]byte{
6598 "AppFooPrebuilt.apk": nil,
6599 }))
6600
Jooyung Hana0503a52023-08-23 13:12:50 +09006601 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006602 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006603 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006604}
6605
Dario Freni6f3937c2019-12-20 22:58:03 +00006606func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006607 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006608 apex {
6609 name: "myapex",
6610 key: "myapex.key",
6611 apps: [
6612 "TesterHelpAppFoo",
6613 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006614 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006615 }
6616
6617 apex_key {
6618 name: "myapex.key",
6619 public_key: "testkey.avbpubkey",
6620 private_key: "testkey.pem",
6621 }
6622
6623 android_test_helper_app {
6624 name: "TesterHelpAppFoo",
6625 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006626 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006627 }
6628
6629 `)
6630
Jooyung Hana0503a52023-08-23 13:12:50 +09006631 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006632 apexRule := module.Rule("apexRule")
6633 copyCmds := apexRule.Args["copy_commands"]
6634
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006635 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006636}
6637
Jooyung Han18020ea2019-11-13 10:50:48 +09006638func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6639 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006640 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006641 apex {
6642 name: "myapex",
6643 key: "myapex.key",
6644 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006645 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006646 }
6647
6648 apex_key {
6649 name: "myapex.key",
6650 public_key: "testkey.avbpubkey",
6651 private_key: "testkey.pem",
6652 }
6653
6654 apex {
6655 name: "otherapex",
6656 key: "myapex.key",
6657 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006658 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006659 }
6660
6661 cc_defaults {
6662 name: "libfoo-defaults",
6663 apex_available: ["otherapex"],
6664 }
6665
6666 cc_library {
6667 name: "libfoo",
6668 defaults: ["libfoo-defaults"],
6669 stl: "none",
6670 system_shared_libs: [],
6671 }`)
6672}
6673
Paul Duffine52e66f2020-03-30 17:54:29 +01006674func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006675 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006676 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006677 apex {
6678 name: "myapex",
6679 key: "myapex.key",
6680 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006681 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006682 }
6683
6684 apex_key {
6685 name: "myapex.key",
6686 public_key: "testkey.avbpubkey",
6687 private_key: "testkey.pem",
6688 }
6689
6690 apex {
6691 name: "otherapex",
6692 key: "otherapex.key",
6693 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006694 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006695 }
6696
6697 apex_key {
6698 name: "otherapex.key",
6699 public_key: "testkey.avbpubkey",
6700 private_key: "testkey.pem",
6701 }
6702
6703 cc_library {
6704 name: "libfoo",
6705 stl: "none",
6706 system_shared_libs: [],
6707 apex_available: ["otherapex"],
6708 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006709}
Jiyong Park127b40b2019-09-30 16:04:35 +09006710
Paul Duffine52e66f2020-03-30 17:54:29 +01006711func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006712 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006713 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006714.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006715.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006716.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006717.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006718.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006719.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006720 apex {
6721 name: "myapex",
6722 key: "myapex.key",
6723 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006724 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006725 }
6726
6727 apex_key {
6728 name: "myapex.key",
6729 public_key: "testkey.avbpubkey",
6730 private_key: "testkey.pem",
6731 }
6732
Jiyong Park127b40b2019-09-30 16:04:35 +09006733 cc_library {
6734 name: "libfoo",
6735 stl: "none",
6736 shared_libs: ["libbar"],
6737 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006738 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006739 }
6740
6741 cc_library {
6742 name: "libbar",
6743 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006744 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006745 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006746 apex_available: ["myapex"],
6747 }
6748
6749 cc_library {
6750 name: "libbaz",
6751 stl: "none",
6752 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006753 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006754}
Jiyong Park127b40b2019-09-30 16:04:35 +09006755
Liz Kammer5f108fa2023-05-11 14:33:17 -04006756func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6757 testApex(t, `
6758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 native_shared_libs: ["libfoo"],
6762 updatable: false,
6763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 cc_library {
6772 name: "libfoo",
6773 stl: "none",
6774 static_libs: ["libbar"],
6775 system_shared_libs: [],
6776 apex_available: ["myapex"],
6777 }
6778
6779 cc_library {
6780 name: "libbar",
6781 stl: "none",
6782 shared_libs: ["libbaz"],
6783 system_shared_libs: [],
6784 apex_available: ["myapex"],
6785 }
6786
6787 cc_library {
6788 name: "libbaz",
6789 stl: "none",
6790 system_shared_libs: [],
6791 }`)
6792
6793 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6794 apex {
6795 name: "myapex",
6796 key: "myapex.key",
6797 native_shared_libs: ["libfoo"],
6798 updatable: false,
6799 }
6800
6801 apex_key {
6802 name: "myapex.key",
6803 public_key: "testkey.avbpubkey",
6804 private_key: "testkey.pem",
6805 }
6806
6807 cc_library {
6808 name: "libfoo",
6809 stl: "none",
6810 static_libs: ["libbar"],
6811 system_shared_libs: [],
6812 apex_available: ["myapex"],
6813 }
6814
6815 cc_library {
6816 name: "libbar",
6817 stl: "none",
6818 system_shared_libs: [],
6819 }`)
6820}
6821
Paul Duffine52e66f2020-03-30 17:54:29 +01006822func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006823 testApexError(t, "\"otherapex\" is not a valid module name", `
6824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006828 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006829 }
6830
6831 apex_key {
6832 name: "myapex.key",
6833 public_key: "testkey.avbpubkey",
6834 private_key: "testkey.pem",
6835 }
6836
6837 cc_library {
6838 name: "libfoo",
6839 stl: "none",
6840 system_shared_libs: [],
6841 apex_available: ["otherapex"],
6842 }`)
6843
Paul Duffine52e66f2020-03-30 17:54:29 +01006844 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006845 apex {
6846 name: "myapex",
6847 key: "myapex.key",
6848 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006849 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006850 }
6851
6852 apex_key {
6853 name: "myapex.key",
6854 public_key: "testkey.avbpubkey",
6855 private_key: "testkey.pem",
6856 }
6857
6858 cc_library {
6859 name: "libfoo",
6860 stl: "none",
6861 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006862 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006863 apex_available: ["myapex"],
6864 }
6865
6866 cc_library {
6867 name: "libbar",
6868 stl: "none",
6869 system_shared_libs: [],
6870 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006871 }
6872
6873 cc_library {
6874 name: "libbaz",
6875 stl: "none",
6876 system_shared_libs: [],
6877 stubs: {
6878 versions: ["10", "20", "30"],
6879 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006880 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006881}
Jiyong Park127b40b2019-09-30 16:04:35 +09006882
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006883func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6884 t.Run("negative variant_version produces error", func(t *testing.T) {
6885 testApexError(t, "expected an integer between 0-9; got -1", `
6886 apex {
6887 name: "myapex",
6888 key: "myapex.key",
6889 apex_available_name: "com.android.foo",
6890 variant_version: "-1",
6891 updatable: false,
6892 }
6893 apex_key {
6894 name: "myapex.key",
6895 public_key: "testkey.avbpubkey",
6896 private_key: "testkey.pem",
6897 }
6898 `)
6899 })
6900
6901 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6902 testApexError(t, "expected an integer between 0-9; got 10", `
6903 apex {
6904 name: "myapex",
6905 key: "myapex.key",
6906 apex_available_name: "com.android.foo",
6907 variant_version: "10",
6908 updatable: false,
6909 }
6910 apex_key {
6911 name: "myapex.key",
6912 public_key: "testkey.avbpubkey",
6913 private_key: "testkey.pem",
6914 }
6915 `)
6916 })
6917}
6918
6919func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6920 context := android.GroupFixturePreparers(
6921 android.PrepareForIntegrationTestWithAndroid,
6922 PrepareForTestWithApexBuildComponents,
6923 android.FixtureMergeMockFs(android.MockFS{
6924 "system/sepolicy/apex/foo-file_contexts": nil,
6925 "system/sepolicy/apex/bar-file_contexts": nil,
6926 }),
6927 )
6928 result := context.RunTestWithBp(t, `
6929 apex {
6930 name: "foo",
6931 key: "myapex.key",
6932 apex_available_name: "com.android.foo",
6933 variant_version: "0",
6934 updatable: false,
6935 }
6936 apex {
6937 name: "bar",
6938 key: "myapex.key",
6939 apex_available_name: "com.android.foo",
6940 variant_version: "3",
6941 updatable: false,
6942 }
6943 apex_key {
6944 name: "myapex.key",
6945 public_key: "testkey.avbpubkey",
6946 private_key: "testkey.pem",
6947 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006948 override_apex {
6949 name: "myoverrideapex",
6950 base: "bar",
6951 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006952 `)
6953
Jooyung Hana0503a52023-08-23 13:12:50 +09006954 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006955 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6956 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6957 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6958 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6959 }
6960
Jooyung Hana0503a52023-08-23 13:12:50 +09006961 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006962 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6963 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6964 barActualDefaultVersion := barManifestRule.Args["default_version"]
6965 if barActualDefaultVersion != barExpectedDefaultVersion {
6966 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6967 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006968
Jooyung Hana0503a52023-08-23 13:12:50 +09006969 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006970 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6971 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6972 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6973 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006974}
6975
Sam Delmericoca816532023-06-02 14:09:50 -04006976func TestApexAvailable_ApexAvailableName(t *testing.T) {
6977 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6978 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6979 apex {
6980 name: "myapex_sminus",
6981 key: "myapex.key",
6982 apps: ["AppFoo"],
6983 apex_available_name: "myapex",
6984 updatable: false,
6985 }
6986 apex {
6987 name: "myapex",
6988 key: "myapex.key",
6989 apps: ["AppFoo"],
6990 updatable: false,
6991 }
6992 apex_key {
6993 name: "myapex.key",
6994 public_key: "testkey.avbpubkey",
6995 private_key: "testkey.pem",
6996 }
6997 android_app {
6998 name: "AppFoo",
6999 srcs: ["foo/bar/MyClass.java"],
7000 sdk_version: "none",
7001 system_modules: "none",
7002 apex_available: [ "myapex_sminus" ],
7003 }`,
7004 android.FixtureMergeMockFs(android.MockFS{
7005 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7006 }),
7007 )
7008 })
7009
7010 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7011 testApex(t, `
7012 apex {
7013 name: "myapex_sminus",
7014 key: "myapex.key",
7015 apps: ["AppFoo"],
7016 apex_available_name: "myapex",
7017 updatable: false,
7018 }
7019 apex {
7020 name: "myapex",
7021 key: "myapex.key",
7022 apps: ["AppFoo"],
7023 updatable: false,
7024 }
7025 apex_key {
7026 name: "myapex.key",
7027 public_key: "testkey.avbpubkey",
7028 private_key: "testkey.pem",
7029 }
7030 android_app {
7031 name: "AppFoo",
7032 srcs: ["foo/bar/MyClass.java"],
7033 sdk_version: "none",
7034 system_modules: "none",
7035 apex_available: [ "myapex" ],
7036 }`,
7037 android.FixtureMergeMockFs(android.MockFS{
7038 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7039 }),
7040 )
7041 })
7042
7043 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7044 testApex(t, `
7045 override_apex {
7046 name: "myoverrideapex_sminus",
7047 base: "myapex_sminus",
7048 key: "myapex.key",
7049 apps: ["AppFooOverride"],
7050 }
7051 override_apex {
7052 name: "myoverrideapex",
7053 base: "myapex",
7054 key: "myapex.key",
7055 apps: ["AppFooOverride"],
7056 }
7057 apex {
7058 name: "myapex_sminus",
7059 key: "myapex.key",
7060 apps: ["AppFoo"],
7061 apex_available_name: "myapex",
7062 updatable: false,
7063 }
7064 apex {
7065 name: "myapex",
7066 key: "myapex.key",
7067 apps: ["AppFoo"],
7068 updatable: false,
7069 }
7070 apex_key {
7071 name: "myapex.key",
7072 public_key: "testkey.avbpubkey",
7073 private_key: "testkey.pem",
7074 }
7075 android_app {
7076 name: "AppFooOverride",
7077 srcs: ["foo/bar/MyClass.java"],
7078 sdk_version: "none",
7079 system_modules: "none",
7080 apex_available: [ "myapex" ],
7081 }
7082 android_app {
7083 name: "AppFoo",
7084 srcs: ["foo/bar/MyClass.java"],
7085 sdk_version: "none",
7086 system_modules: "none",
7087 apex_available: [ "myapex" ],
7088 }`,
7089 android.FixtureMergeMockFs(android.MockFS{
7090 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7091 }),
7092 )
7093 })
7094}
7095
7096func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7097 context := android.GroupFixturePreparers(
7098 android.PrepareForIntegrationTestWithAndroid,
7099 PrepareForTestWithApexBuildComponents,
7100 java.PrepareForTestWithDexpreopt,
7101 android.FixtureMergeMockFs(android.MockFS{
7102 "system/sepolicy/apex/myapex-file_contexts": nil,
7103 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7104 }),
7105 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7106 variables.BuildId = proptools.StringPtr("buildid")
7107 }),
7108 )
7109 context.RunTestWithBp(t, `
7110 override_apex {
7111 name: "myoverrideapex_sminus",
7112 base: "myapex_sminus",
7113 }
7114 override_apex {
7115 name: "myoverrideapex",
7116 base: "myapex",
7117 }
7118 apex {
7119 name: "myapex",
7120 key: "myapex.key",
7121 apps: ["AppFoo"],
7122 updatable: false,
7123 }
7124 apex {
7125 name: "myapex_sminus",
7126 apex_available_name: "myapex",
7127 key: "myapex.key",
7128 apps: ["AppFoo_sminus"],
7129 updatable: false,
7130 }
7131 apex_key {
7132 name: "myapex.key",
7133 public_key: "testkey.avbpubkey",
7134 private_key: "testkey.pem",
7135 }
7136 android_app {
7137 name: "AppFoo",
7138 srcs: ["foo/bar/MyClass.java"],
7139 sdk_version: "none",
7140 system_modules: "none",
7141 apex_available: [ "myapex" ],
7142 }
7143 android_app {
7144 name: "AppFoo_sminus",
7145 srcs: ["foo/bar/MyClass.java"],
7146 sdk_version: "none",
7147 min_sdk_version: "29",
7148 system_modules: "none",
7149 apex_available: [ "myapex" ],
7150 }`)
7151}
7152
Jiyong Park89e850a2020-04-07 16:37:39 +09007153func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007154 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007155 apex {
7156 name: "myapex",
7157 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007158 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007159 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007160 }
7161
7162 apex_key {
7163 name: "myapex.key",
7164 public_key: "testkey.avbpubkey",
7165 private_key: "testkey.pem",
7166 }
7167
7168 cc_library {
7169 name: "libfoo",
7170 stl: "none",
7171 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007172 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007173 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007174 }
7175
7176 cc_library {
7177 name: "libfoo2",
7178 stl: "none",
7179 system_shared_libs: [],
7180 shared_libs: ["libbaz"],
7181 apex_available: ["//apex_available:platform"],
7182 }
7183
7184 cc_library {
7185 name: "libbar",
7186 stl: "none",
7187 system_shared_libs: [],
7188 apex_available: ["myapex"],
7189 }
7190
7191 cc_library {
7192 name: "libbaz",
7193 stl: "none",
7194 system_shared_libs: [],
7195 apex_available: ["myapex"],
7196 stubs: {
7197 versions: ["1"],
7198 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007199 }`)
7200
Jiyong Park89e850a2020-04-07 16:37:39 +09007201 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7202 // because it depends on libbar which isn't available to platform
7203 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7204 if libfoo.NotAvailableForPlatform() != true {
7205 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7206 }
7207
7208 // libfoo2 however can be available to platform because it depends on libbaz which provides
7209 // stubs
7210 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7211 if libfoo2.NotAvailableForPlatform() == true {
7212 t.Errorf("%q should be available to platform", libfoo2.String())
7213 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007214}
Jiyong Parka90ca002019-10-07 15:47:24 +09007215
Paul Duffine52e66f2020-03-30 17:54:29 +01007216func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007217 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007218 apex {
7219 name: "myapex",
7220 key: "myapex.key",
7221 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007222 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007223 }
7224
7225 apex_key {
7226 name: "myapex.key",
7227 public_key: "testkey.avbpubkey",
7228 private_key: "testkey.pem",
7229 }
7230
7231 cc_library {
7232 name: "libfoo",
7233 stl: "none",
7234 system_shared_libs: [],
7235 apex_available: ["myapex"],
7236 static: {
7237 apex_available: ["//apex_available:platform"],
7238 },
7239 }`)
7240
Jiyong Park89e850a2020-04-07 16:37:39 +09007241 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7242 if libfooShared.NotAvailableForPlatform() != true {
7243 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7244 }
7245 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7246 if libfooStatic.NotAvailableForPlatform() != false {
7247 t.Errorf("%q should be available to platform", libfooStatic.String())
7248 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007249}
7250
Jiyong Park5d790c32019-11-15 18:40:32 +09007251func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007252 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007253 apex {
7254 name: "myapex",
7255 key: "myapex.key",
7256 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007257 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007258 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007259 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007260 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007261 }
7262
7263 override_apex {
7264 name: "override_myapex",
7265 base: "myapex",
7266 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007267 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007268 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007269 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007270 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007271 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007272 key: "mynewapex.key",
7273 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007274 }
7275
7276 apex_key {
7277 name: "myapex.key",
7278 public_key: "testkey.avbpubkey",
7279 private_key: "testkey.pem",
7280 }
7281
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007282 apex_key {
7283 name: "mynewapex.key",
7284 public_key: "testkey2.avbpubkey",
7285 private_key: "testkey2.pem",
7286 }
7287
7288 android_app_certificate {
7289 name: "myapex.certificate",
7290 certificate: "testkey",
7291 }
7292
Jiyong Park5d790c32019-11-15 18:40:32 +09007293 android_app {
7294 name: "app",
7295 srcs: ["foo/bar/MyClass.java"],
7296 package_name: "foo",
7297 sdk_version: "none",
7298 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007299 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007300 }
7301
7302 override_android_app {
7303 name: "override_app",
7304 base: "app",
7305 package_name: "bar",
7306 }
markchien7c803b82021-08-26 22:10:06 +08007307
7308 bpf {
7309 name: "bpf",
7310 srcs: ["bpf.c"],
7311 }
7312
7313 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007314 name: "overrideBpf",
7315 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007316 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007317
7318 prebuilt_etc {
7319 name: "myetc",
7320 src: "myprebuilt",
7321 }
7322
7323 prebuilt_etc {
7324 name: "override_myetc",
7325 src: "override_myprebuilt",
7326 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007327 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007328
Jooyung Hana0503a52023-08-23 13:12:50 +09007329 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7330 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007331 if originalVariant.GetOverriddenBy() != "" {
7332 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7333 }
7334 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7335 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7336 }
7337
Jooyung Hana0503a52023-08-23 13:12:50 +09007338 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007339 apexRule := module.Rule("apexRule")
7340 copyCmds := apexRule.Args["copy_commands"]
7341
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007342 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7343 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007344
markchien7c803b82021-08-26 22:10:06 +08007345 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007346 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007347
Daniel Norman5a3ce132021-08-26 15:44:43 -07007348 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7349 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7350
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007351 apexBundle := module.Module().(*apexBundle)
7352 name := apexBundle.Name()
7353 if name != "override_myapex" {
7354 t.Errorf("name should be \"override_myapex\", but was %q", name)
7355 }
7356
Baligh Uddin004d7172020-02-19 21:29:28 -08007357 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7358 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7359 }
7360
Jiyong Park20bacab2020-03-03 11:45:41 +09007361 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007362 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007363 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7364
7365 signApkRule := module.Rule("signapk")
7366 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007367
Colin Crossaa255532020-07-03 13:18:24 -07007368 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007369 var builder strings.Builder
7370 data.Custom(&builder, name, "TARGET_", "", data)
7371 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007372 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7373 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007374 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007375 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007376 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007377 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007378 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007379 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007380}
7381
Albert Martineefabcf2022-03-21 20:11:16 +00007382func TestMinSdkVersionOverride(t *testing.T) {
7383 // Override from 29 to 31
7384 minSdkOverride31 := "31"
7385 ctx := testApex(t, `
7386 apex {
7387 name: "myapex",
7388 key: "myapex.key",
7389 native_shared_libs: ["mylib"],
7390 updatable: true,
7391 min_sdk_version: "29"
7392 }
7393
7394 override_apex {
7395 name: "override_myapex",
7396 base: "myapex",
7397 logging_parent: "com.foo.bar",
7398 package_name: "test.overridden.package"
7399 }
7400
7401 apex_key {
7402 name: "myapex.key",
7403 public_key: "testkey.avbpubkey",
7404 private_key: "testkey.pem",
7405 }
7406
7407 cc_library {
7408 name: "mylib",
7409 srcs: ["mylib.cpp"],
7410 runtime_libs: ["libbar"],
7411 system_shared_libs: [],
7412 stl: "none",
7413 apex_available: [ "myapex" ],
7414 min_sdk_version: "apex_inherit"
7415 }
7416
7417 cc_library {
7418 name: "libbar",
7419 srcs: ["mylib.cpp"],
7420 system_shared_libs: [],
7421 stl: "none",
7422 apex_available: [ "myapex" ],
7423 min_sdk_version: "apex_inherit"
7424 }
7425
7426 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7427
Jooyung Hana0503a52023-08-23 13:12:50 +09007428 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007429 copyCmds := apexRule.Args["copy_commands"]
7430
7431 // Ensure that direct non-stubs dep is always included
7432 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7433
7434 // Ensure that runtime_libs dep in included
7435 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7436
7437 // Ensure libraries target overridden min_sdk_version value
7438 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7439}
7440
7441func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7442 // Attempt to override from 31 to 29, should be a NOOP
7443 minSdkOverride29 := "29"
7444 ctx := testApex(t, `
7445 apex {
7446 name: "myapex",
7447 key: "myapex.key",
7448 native_shared_libs: ["mylib"],
7449 updatable: true,
7450 min_sdk_version: "31"
7451 }
7452
7453 override_apex {
7454 name: "override_myapex",
7455 base: "myapex",
7456 logging_parent: "com.foo.bar",
7457 package_name: "test.overridden.package"
7458 }
7459
7460 apex_key {
7461 name: "myapex.key",
7462 public_key: "testkey.avbpubkey",
7463 private_key: "testkey.pem",
7464 }
7465
7466 cc_library {
7467 name: "mylib",
7468 srcs: ["mylib.cpp"],
7469 runtime_libs: ["libbar"],
7470 system_shared_libs: [],
7471 stl: "none",
7472 apex_available: [ "myapex" ],
7473 min_sdk_version: "apex_inherit"
7474 }
7475
7476 cc_library {
7477 name: "libbar",
7478 srcs: ["mylib.cpp"],
7479 system_shared_libs: [],
7480 stl: "none",
7481 apex_available: [ "myapex" ],
7482 min_sdk_version: "apex_inherit"
7483 }
7484
7485 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7486
Jooyung Hana0503a52023-08-23 13:12:50 +09007487 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007488 copyCmds := apexRule.Args["copy_commands"]
7489
7490 // Ensure that direct non-stubs dep is always included
7491 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7492
7493 // Ensure that runtime_libs dep in included
7494 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7495
7496 // Ensure libraries target the original min_sdk_version value rather than the overridden
7497 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7498}
7499
Jooyung Han214bf372019-11-12 13:03:50 +09007500func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007501 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007502 apex {
7503 name: "myapex",
7504 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007505 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007506 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007507 }
7508
7509 apex_key {
7510 name: "myapex.key",
7511 public_key: "testkey.avbpubkey",
7512 private_key: "testkey.pem",
7513 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007514
7515 cc_library {
7516 name: "mylib",
7517 srcs: ["mylib.cpp"],
7518 stl: "libc++",
7519 system_shared_libs: [],
7520 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007521 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007522 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007523 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007524
Jooyung Hana0503a52023-08-23 13:12:50 +09007525 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007526 args := module.Rule("apexRule").Args
7527 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007528 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007529
7530 // The copies of the libraries in the apex should have one more dependency than
7531 // the ones outside the apex, namely the unwinder. Ideally we should check
7532 // the dependency names directly here but for some reason the names are blank in
7533 // this test.
7534 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007535 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007536 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7537 if len(apexImplicits) != len(nonApexImplicits)+1 {
7538 t.Errorf("%q missing unwinder dep", lib)
7539 }
7540 }
Jooyung Han214bf372019-11-12 13:03:50 +09007541}
7542
Paul Duffine05480a2021-03-08 15:07:14 +00007543var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007544 "api/current.txt": nil,
7545 "api/removed.txt": nil,
7546 "api/system-current.txt": nil,
7547 "api/system-removed.txt": nil,
7548 "api/test-current.txt": nil,
7549 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007550
Anton Hanssondff2c782020-12-21 17:10:01 +00007551 "100/public/api/foo.txt": nil,
7552 "100/public/api/foo-removed.txt": nil,
7553 "100/system/api/foo.txt": nil,
7554 "100/system/api/foo-removed.txt": nil,
7555
Paul Duffineedc5d52020-06-12 17:46:39 +01007556 // For java_sdk_library_import
7557 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007558}
7559
Jooyung Han58f26ab2019-12-18 15:34:32 +09007560func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007561 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007562 apex {
7563 name: "myapex",
7564 key: "myapex.key",
7565 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007566 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007567 }
7568
7569 apex_key {
7570 name: "myapex.key",
7571 public_key: "testkey.avbpubkey",
7572 private_key: "testkey.pem",
7573 }
7574
7575 java_sdk_library {
7576 name: "foo",
7577 srcs: ["a.java"],
7578 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007579 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007580 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007581
7582 prebuilt_apis {
7583 name: "sdk",
7584 api_dirs: ["100"],
7585 }
Paul Duffin9b879592020-05-26 13:21:35 +01007586 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007587
7588 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007589 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007590 "javalib/foo.jar",
7591 "etc/permissions/foo.xml",
7592 })
7593 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007594 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007595 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 +09007596}
7597
Paul Duffin9b879592020-05-26 13:21:35 +01007598func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007599 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007600 apex {
7601 name: "myapex",
7602 key: "myapex.key",
7603 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007604 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007605 }
7606
7607 apex_key {
7608 name: "myapex.key",
7609 public_key: "testkey.avbpubkey",
7610 private_key: "testkey.pem",
7611 }
7612
7613 java_sdk_library {
7614 name: "foo",
7615 srcs: ["a.java"],
7616 api_packages: ["foo"],
7617 apex_available: ["myapex"],
7618 sdk_version: "none",
7619 system_modules: "none",
7620 }
7621
7622 java_library {
7623 name: "bar",
7624 srcs: ["a.java"],
7625 libs: ["foo"],
7626 apex_available: ["myapex"],
7627 sdk_version: "none",
7628 system_modules: "none",
7629 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007630
7631 prebuilt_apis {
7632 name: "sdk",
7633 api_dirs: ["100"],
7634 }
Paul Duffin9b879592020-05-26 13:21:35 +01007635 `, withFiles(filesForSdkLibrary))
7636
7637 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007638 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007639 "javalib/bar.jar",
7640 "javalib/foo.jar",
7641 "etc/permissions/foo.xml",
7642 })
7643
7644 // The bar library should depend on the implementation jar.
7645 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007646 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007647 t.Errorf("expected %q, found %#q", expected, actual)
7648 }
7649}
7650
7651func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007652 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007653 apex {
7654 name: "myapex",
7655 key: "myapex.key",
7656 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007657 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007658 }
7659
7660 apex_key {
7661 name: "myapex.key",
7662 public_key: "testkey.avbpubkey",
7663 private_key: "testkey.pem",
7664 }
7665
7666 java_sdk_library {
7667 name: "foo",
7668 srcs: ["a.java"],
7669 api_packages: ["foo"],
7670 apex_available: ["myapex"],
7671 sdk_version: "none",
7672 system_modules: "none",
7673 }
7674
7675 java_library {
7676 name: "bar",
7677 srcs: ["a.java"],
7678 libs: ["foo"],
7679 sdk_version: "none",
7680 system_modules: "none",
7681 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007682
7683 prebuilt_apis {
7684 name: "sdk",
7685 api_dirs: ["100"],
7686 }
Paul Duffin9b879592020-05-26 13:21:35 +01007687 `, withFiles(filesForSdkLibrary))
7688
7689 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007690 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007691 "javalib/foo.jar",
7692 "etc/permissions/foo.xml",
7693 })
7694
7695 // The bar library should depend on the stubs jar.
7696 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007697 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007698 t.Errorf("expected %q, found %#q", expected, actual)
7699 }
7700}
7701
Paul Duffineedc5d52020-06-12 17:46:39 +01007702func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007703 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007704 prebuilt_apis {
7705 name: "sdk",
7706 api_dirs: ["100"],
7707 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007708 withFiles(map[string][]byte{
7709 "apex/a.java": nil,
7710 "apex/apex_manifest.json": nil,
7711 "apex/Android.bp": []byte(`
7712 package {
7713 default_visibility: ["//visibility:private"],
7714 }
7715
7716 apex {
7717 name: "myapex",
7718 key: "myapex.key",
7719 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007720 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007721 }
7722
7723 apex_key {
7724 name: "myapex.key",
7725 public_key: "testkey.avbpubkey",
7726 private_key: "testkey.pem",
7727 }
7728
7729 java_library {
7730 name: "bar",
7731 srcs: ["a.java"],
7732 libs: ["foo"],
7733 apex_available: ["myapex"],
7734 sdk_version: "none",
7735 system_modules: "none",
7736 }
7737`),
7738 "source/a.java": nil,
7739 "source/api/current.txt": nil,
7740 "source/api/removed.txt": nil,
7741 "source/Android.bp": []byte(`
7742 package {
7743 default_visibility: ["//visibility:private"],
7744 }
7745
7746 java_sdk_library {
7747 name: "foo",
7748 visibility: ["//apex"],
7749 srcs: ["a.java"],
7750 api_packages: ["foo"],
7751 apex_available: ["myapex"],
7752 sdk_version: "none",
7753 system_modules: "none",
7754 public: {
7755 enabled: true,
7756 },
7757 }
7758`),
7759 "prebuilt/a.jar": nil,
7760 "prebuilt/Android.bp": []byte(`
7761 package {
7762 default_visibility: ["//visibility:private"],
7763 }
7764
7765 java_sdk_library_import {
7766 name: "foo",
7767 visibility: ["//apex", "//source"],
7768 apex_available: ["myapex"],
7769 prefer: true,
7770 public: {
7771 jars: ["a.jar"],
7772 },
7773 }
7774`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007775 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007776 )
7777
7778 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007779 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007780 "javalib/bar.jar",
7781 "javalib/foo.jar",
7782 "etc/permissions/foo.xml",
7783 })
7784
7785 // The bar library should depend on the implementation jar.
7786 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007787 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007788 t.Errorf("expected %q, found %#q", expected, actual)
7789 }
7790}
7791
7792func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7793 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7794 apex {
7795 name: "myapex",
7796 key: "myapex.key",
7797 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007798 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007799 }
7800
7801 apex_key {
7802 name: "myapex.key",
7803 public_key: "testkey.avbpubkey",
7804 private_key: "testkey.pem",
7805 }
7806
7807 java_sdk_library_import {
7808 name: "foo",
7809 apex_available: ["myapex"],
7810 prefer: true,
7811 public: {
7812 jars: ["a.jar"],
7813 },
7814 }
7815
7816 `, withFiles(filesForSdkLibrary))
7817}
7818
atrost6e126252020-01-27 17:01:16 +00007819func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007820 result := android.GroupFixturePreparers(
7821 prepareForApexTest,
7822 java.PrepareForTestWithPlatformCompatConfig,
7823 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007824 apex {
7825 name: "myapex",
7826 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007827 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007828 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007829 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007830 }
7831
7832 apex_key {
7833 name: "myapex.key",
7834 public_key: "testkey.avbpubkey",
7835 private_key: "testkey.pem",
7836 }
7837
7838 platform_compat_config {
7839 name: "myjar-platform-compat-config",
7840 src: ":myjar",
7841 }
7842
7843 java_library {
7844 name: "myjar",
7845 srcs: ["foo/bar/MyClass.java"],
7846 sdk_version: "none",
7847 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007848 apex_available: [ "myapex" ],
7849 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007850
7851 // Make sure that a preferred prebuilt does not affect the apex contents.
7852 prebuilt_platform_compat_config {
7853 name: "myjar-platform-compat-config",
7854 metadata: "compat-config/metadata.xml",
7855 prefer: true,
7856 }
atrost6e126252020-01-27 17:01:16 +00007857 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007858 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007859 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007860 "etc/compatconfig/myjar-platform-compat-config.xml",
7861 "javalib/myjar.jar",
7862 })
7863}
7864
Jooyung Han862c0d62022-12-21 10:15:37 +09007865func TestNoDupeApexFiles(t *testing.T) {
7866 android.GroupFixturePreparers(
7867 android.PrepareForTestWithAndroidBuildComponents,
7868 PrepareForTestWithApexBuildComponents,
7869 prepareForTestWithMyapex,
7870 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7871 ).
7872 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7873 RunTestWithBp(t, `
7874 apex {
7875 name: "myapex",
7876 key: "myapex.key",
7877 prebuilts: ["foo", "bar"],
7878 updatable: false,
7879 }
7880
7881 apex_key {
7882 name: "myapex.key",
7883 public_key: "testkey.avbpubkey",
7884 private_key: "testkey.pem",
7885 }
7886
7887 prebuilt_etc {
7888 name: "foo",
7889 src: "myprebuilt",
7890 filename_from_src: true,
7891 }
7892
7893 prebuilt_etc {
7894 name: "bar",
7895 src: "myprebuilt",
7896 filename_from_src: true,
7897 }
7898 `)
7899}
7900
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007901func TestApexUnwantedTransitiveDeps(t *testing.T) {
7902 bp := `
7903 apex {
7904 name: "myapex",
7905 key: "myapex.key",
7906 native_shared_libs: ["libfoo"],
7907 updatable: false,
7908 unwanted_transitive_deps: ["libbar"],
7909 }
7910
7911 apex_key {
7912 name: "myapex.key",
7913 public_key: "testkey.avbpubkey",
7914 private_key: "testkey.pem",
7915 }
7916
7917 cc_library {
7918 name: "libfoo",
7919 srcs: ["foo.cpp"],
7920 shared_libs: ["libbar"],
7921 apex_available: ["myapex"],
7922 }
7923
7924 cc_library {
7925 name: "libbar",
7926 srcs: ["bar.cpp"],
7927 apex_available: ["myapex"],
7928 }`
7929 ctx := testApex(t, bp)
7930 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7931 "*/libc++.so",
7932 "*/libfoo.so",
7933 // not libbar.so
7934 })
7935}
7936
Jiyong Park479321d2019-12-16 11:47:12 +09007937func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7938 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7939 apex {
7940 name: "myapex",
7941 key: "myapex.key",
7942 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007943 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007944 }
7945
7946 apex_key {
7947 name: "myapex.key",
7948 public_key: "testkey.avbpubkey",
7949 private_key: "testkey.pem",
7950 }
7951
7952 java_library {
7953 name: "myjar",
7954 srcs: ["foo/bar/MyClass.java"],
7955 sdk_version: "none",
7956 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007957 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007958 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007959 }
7960 `)
7961}
7962
Jiyong Park7afd1072019-12-30 16:56:33 +09007963func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007964 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007965 apex {
7966 name: "myapex",
7967 key: "myapex.key",
7968 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007969 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007970 }
7971
7972 apex_key {
7973 name: "myapex.key",
7974 public_key: "testkey.avbpubkey",
7975 private_key: "testkey.pem",
7976 }
7977
7978 cc_library {
7979 name: "mylib",
7980 srcs: ["mylib.cpp"],
7981 system_shared_libs: [],
7982 stl: "none",
7983 required: ["a", "b"],
7984 host_required: ["c", "d"],
7985 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007986 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007987 }
7988 `)
7989
Jooyung Hana0503a52023-08-23 13:12:50 +09007990 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007992 name := apexBundle.BaseModuleName()
7993 prefix := "TARGET_"
7994 var builder strings.Builder
7995 data.Custom(&builder, name, prefix, "", data)
7996 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007997 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007998 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7999 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09008000}
8001
Jiyong Park7cd10e32020-01-14 09:22:18 +09008002func TestSymlinksFromApexToSystem(t *testing.T) {
8003 bp := `
8004 apex {
8005 name: "myapex",
8006 key: "myapex.key",
8007 native_shared_libs: ["mylib"],
8008 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008009 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008010 }
8011
Jiyong Park9d677202020-02-19 16:29:35 +09008012 apex {
8013 name: "myapex.updatable",
8014 key: "myapex.key",
8015 native_shared_libs: ["mylib"],
8016 java_libs: ["myjar"],
8017 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008018 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008019 }
8020
Jiyong Park7cd10e32020-01-14 09:22:18 +09008021 apex_key {
8022 name: "myapex.key",
8023 public_key: "testkey.avbpubkey",
8024 private_key: "testkey.pem",
8025 }
8026
8027 cc_library {
8028 name: "mylib",
8029 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008030 shared_libs: [
8031 "myotherlib",
8032 "myotherlib_ext",
8033 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008034 system_shared_libs: [],
8035 stl: "none",
8036 apex_available: [
8037 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008038 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008039 "//apex_available:platform",
8040 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008041 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008042 }
8043
8044 cc_library {
8045 name: "myotherlib",
8046 srcs: ["mylib.cpp"],
8047 system_shared_libs: [],
8048 stl: "none",
8049 apex_available: [
8050 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008051 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008052 "//apex_available:platform",
8053 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008054 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008055 }
8056
Jiyong Parkce243632023-02-17 18:22:25 +09008057 cc_library {
8058 name: "myotherlib_ext",
8059 srcs: ["mylib.cpp"],
8060 system_shared_libs: [],
8061 system_ext_specific: true,
8062 stl: "none",
8063 apex_available: [
8064 "myapex",
8065 "myapex.updatable",
8066 "//apex_available:platform",
8067 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008068 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008069 }
8070
Jiyong Park7cd10e32020-01-14 09:22:18 +09008071 java_library {
8072 name: "myjar",
8073 srcs: ["foo/bar/MyClass.java"],
8074 sdk_version: "none",
8075 system_modules: "none",
8076 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008077 apex_available: [
8078 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008079 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008080 "//apex_available:platform",
8081 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008082 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008083 }
8084
8085 java_library {
8086 name: "myotherjar",
8087 srcs: ["foo/bar/MyClass.java"],
8088 sdk_version: "none",
8089 system_modules: "none",
8090 apex_available: [
8091 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008092 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008093 "//apex_available:platform",
8094 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008095 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008096 }
8097 `
8098
8099 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8100 for _, f := range files {
8101 if f.path == file {
8102 if f.isLink {
8103 t.Errorf("%q is not a real file", file)
8104 }
8105 return
8106 }
8107 }
8108 t.Errorf("%q is not found", file)
8109 }
8110
Jiyong Parkce243632023-02-17 18:22:25 +09008111 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008112 for _, f := range files {
8113 if f.path == file {
8114 if !f.isLink {
8115 t.Errorf("%q is not a symlink", file)
8116 }
Jiyong Parkce243632023-02-17 18:22:25 +09008117 if f.src != target {
8118 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8119 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008120 return
8121 }
8122 }
8123 t.Errorf("%q is not found", file)
8124 }
8125
Jiyong Park9d677202020-02-19 16:29:35 +09008126 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8127 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008128 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008129 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008130 ensureRealfileExists(t, files, "javalib/myjar.jar")
8131 ensureRealfileExists(t, files, "lib64/mylib.so")
8132 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008133 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008134
Jooyung Hana0503a52023-08-23 13:12:50 +09008135 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008136 ensureRealfileExists(t, files, "javalib/myjar.jar")
8137 ensureRealfileExists(t, files, "lib64/mylib.so")
8138 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008139 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008140
8141 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008142 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008143 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008144 ensureRealfileExists(t, files, "javalib/myjar.jar")
8145 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008146 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8147 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008148
Jooyung Hana0503a52023-08-23 13:12:50 +09008149 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008150 ensureRealfileExists(t, files, "javalib/myjar.jar")
8151 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008152 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8153 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008154}
8155
Yo Chiange8128052020-07-23 20:09:18 +08008156func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008157 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008158 apex {
8159 name: "myapex",
8160 key: "myapex.key",
8161 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008162 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008163 }
8164
8165 apex_key {
8166 name: "myapex.key",
8167 public_key: "testkey.avbpubkey",
8168 private_key: "testkey.pem",
8169 }
8170
8171 cc_library_shared {
8172 name: "mylib",
8173 srcs: ["mylib.cpp"],
8174 shared_libs: ["myotherlib"],
8175 system_shared_libs: [],
8176 stl: "none",
8177 apex_available: [
8178 "myapex",
8179 "//apex_available:platform",
8180 ],
8181 }
8182
8183 cc_prebuilt_library_shared {
8184 name: "myotherlib",
8185 srcs: ["prebuilt.so"],
8186 system_shared_libs: [],
8187 stl: "none",
8188 apex_available: [
8189 "myapex",
8190 "//apex_available:platform",
8191 ],
8192 }
8193 `)
8194
Jooyung Hana0503a52023-08-23 13:12:50 +09008195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008196 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008197 var builder strings.Builder
8198 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8199 androidMk := builder.String()
8200 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008201 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008202 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8203 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8204 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008205 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008206}
8207
Jooyung Han643adc42020-02-27 13:50:06 +09008208func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008209 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008210 apex {
8211 name: "myapex",
8212 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008213 binaries: ["mybin"],
8214 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008215 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008216 }
8217
8218 apex_key {
8219 name: "myapex.key",
8220 public_key: "testkey.avbpubkey",
8221 private_key: "testkey.pem",
8222 }
8223
8224 cc_library {
8225 name: "mylib",
8226 srcs: ["mylib.cpp"],
8227 shared_libs: ["mylib2"],
8228 system_shared_libs: [],
8229 stl: "none",
8230 apex_available: [ "myapex" ],
8231 }
8232
8233 cc_library {
8234 name: "mylib2",
8235 srcs: ["mylib.cpp"],
8236 system_shared_libs: [],
8237 stl: "none",
8238 apex_available: [ "myapex" ],
8239 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008240
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008241 // Used as both a JNI library and a regular shared library.
8242 cc_library {
8243 name: "mylib3",
8244 srcs: ["mylib.cpp"],
8245 system_shared_libs: [],
8246 stl: "none",
8247 apex_available: [ "myapex" ],
8248 }
8249
8250 cc_binary {
8251 name: "mybin",
8252 srcs: ["mybin.cpp"],
8253 shared_libs: ["mylib3"],
8254 system_shared_libs: [],
8255 stl: "none",
8256 apex_available: [ "myapex" ],
8257 }
8258
Jiyong Park34d5c332022-02-24 18:02:44 +09008259 rust_ffi_shared {
8260 name: "libfoo.rust",
8261 crate_name: "foo",
8262 srcs: ["foo.rs"],
8263 shared_libs: ["libfoo.shared_from_rust"],
8264 prefer_rlib: true,
8265 apex_available: ["myapex"],
8266 }
8267
8268 cc_library_shared {
8269 name: "libfoo.shared_from_rust",
8270 srcs: ["mylib.cpp"],
8271 system_shared_libs: [],
8272 stl: "none",
8273 stubs: {
8274 versions: ["10", "11", "12"],
8275 },
8276 }
8277
Jooyung Han643adc42020-02-27 13:50:06 +09008278 `)
8279
Jooyung Hana0503a52023-08-23 13:12:50 +09008280 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008281 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008282 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008283 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008284 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008285 "lib64/mylib.so",
8286 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008287 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008288 "lib64/libfoo.rust.so",
8289 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8290 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008291 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008292
8293 // b/220397949
8294 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008295}
8296
Jooyung Han49f67012020-04-17 13:43:10 +09008297func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008298 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008299 apex {
8300 name: "myapex",
8301 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008302 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008303 }
8304 apex_key {
8305 name: "myapex.key",
8306 public_key: "testkey.avbpubkey",
8307 private_key: "testkey.pem",
8308 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008309 `,
8310 android.FixtureModifyConfig(func(config android.Config) {
8311 delete(config.Targets, android.Android)
8312 config.AndroidCommonTarget = android.Target{}
8313 }),
8314 )
Jooyung Han49f67012020-04-17 13:43:10 +09008315
8316 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8317 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8318 }
8319}
8320
Jiyong Parkbd159612020-02-28 15:22:21 +09008321func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008322 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008323 apex {
8324 name: "myapex",
8325 key: "myapex.key",
8326 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008327 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008328 }
8329
8330 apex_key {
8331 name: "myapex.key",
8332 public_key: "testkey.avbpubkey",
8333 private_key: "testkey.pem",
8334 }
8335
8336 android_app {
8337 name: "AppFoo",
8338 srcs: ["foo/bar/MyClass.java"],
8339 sdk_version: "none",
8340 system_modules: "none",
8341 apex_available: [ "myapex" ],
8342 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008343 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008344
Jooyung Hana0503a52023-08-23 13:12:50 +09008345 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008346 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008347
8348 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008349 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 +09008350}
8351
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008352func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008353 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008358 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008359 }
8360
8361 apex_key {
8362 name: "myapex.key",
8363 public_key: "testkey.avbpubkey",
8364 private_key: "testkey.pem",
8365 }
8366
8367 android_app_set {
8368 name: "AppSet",
8369 set: "AppSet.apks",
8370 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008371 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008372 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008373 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008374 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8375 s := mod.Rule("apexRule").Args["copy_commands"]
8376 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008377 if len(copyCmds) != 4 {
8378 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008379 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008380 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8381 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008382 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8383 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008384
8385 // Ensure that canned_fs_config has an entry for the app set zip file
8386 generateFsRule := mod.Rule("generateFsConfig")
8387 cmd := generateFsRule.RuleParams.Command
8388 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008389}
8390
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008391func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008392 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008393 apex_set {
8394 name: "myapex",
8395 filename: "foo_v2.apex",
8396 sanitized: {
8397 none: { set: "myapex.apks", },
8398 hwaddress: { set: "myapex.hwasan.apks", },
8399 },
Paul Duffin24704672021-04-06 16:09:30 +01008400 }
8401 `
8402 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008403
Paul Duffin24704672021-04-06 16:09:30 +01008404 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008405 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008406
Spandan Das3576e762024-01-03 18:57:03 +00008407 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008408 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008409
Paul Duffin24704672021-04-06 16:09:30 +01008410 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8411
8412 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008413 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8414 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008415
8416 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008417}
8418
Pranav Guptaeba03b02022-09-27 00:27:08 +00008419func TestApexSetApksModuleAssignment(t *testing.T) {
8420 ctx := testApex(t, `
8421 apex_set {
8422 name: "myapex",
8423 set: ":myapex_apks_file",
8424 }
8425
8426 filegroup {
8427 name: "myapex_apks_file",
8428 srcs: ["myapex.apks"],
8429 }
8430 `)
8431
Spandan Das3576e762024-01-03 18:57:03 +00008432 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008433
8434 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008435 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008436 extractedApex := m.Output(extractorOutput)
8437
8438 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8439}
8440
Paul Duffin89f570a2021-06-16 01:42:33 +01008441func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008442 t.Helper()
8443
Paul Duffin55607122021-03-30 23:32:51 +01008444 fs := android.MockFS{
8445 "a.java": nil,
8446 "a.jar": nil,
8447 "apex_manifest.json": nil,
8448 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008449 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008450 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8451 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8452 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008453 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008454 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008455
Paul Duffin55607122021-03-30 23:32:51 +01008456 errorHandler := android.FixtureExpectsNoErrors
8457 if errmsg != "" {
8458 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008459 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008460
Paul Duffin55607122021-03-30 23:32:51 +01008461 result := android.GroupFixturePreparers(
8462 cc.PrepareForTestWithCcDefaultModules,
8463 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008464 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008465 java.PrepareForTestWithJavaSdkLibraryFiles,
8466 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008467 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008468 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008469 android.FixtureModifyMockFS(func(fs android.MockFS) {
8470 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8471 insert := ""
8472 for _, fragment := range fragments {
8473 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8474 }
8475 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8476 platform_bootclasspath {
8477 name: "platform-bootclasspath",
8478 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008479 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008480 %s
8481 ],
8482 }
8483 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008484 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008485 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008486 // Dexpreopt for boot jars requires the ART boot image profile.
8487 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8488 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008489 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008490 ).
8491 ExtendWithErrorHandler(errorHandler).
8492 RunTestWithBp(t, bp)
8493
8494 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008495}
8496
Paul Duffin5556c5f2022-06-09 17:32:21 +00008497func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008498 preparers := android.GroupFixturePreparers(
8499 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008500 prepareForTestWithBootclasspathFragment,
8501 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008502 PrepareForTestWithApexBuildComponents,
8503 ).
8504 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008505 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008506
8507 bpBase := `
8508 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008509 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008510 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008511 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008512 set: "myapex.apks",
8513 }
8514
8515 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008516 name: "com.mycompany.android.art",
8517 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008518 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008519 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008520 set: "company-myapex.apks",
8521 }
8522
8523 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008524 name: "art-bootclasspath-fragment",
8525 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008526 hidden_api: {
8527 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8528 metadata: "my-bootclasspath-fragment/metadata.csv",
8529 index: "my-bootclasspath-fragment/index.csv",
8530 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8531 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8532 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008533 %s
8534 }
8535 `
8536
8537 t.Run("java_import", func(t *testing.T) {
8538 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8539 java_import {
8540 name: "libfoo",
8541 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008542 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008543 }
8544 `)
8545 })
8546
8547 t.Run("java_sdk_library_import", func(t *testing.T) {
8548 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8549 java_sdk_library_import {
8550 name: "libfoo",
8551 public: {
8552 jars: ["libbar.jar"],
8553 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008554 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008555 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008556 }
8557 `)
8558 })
8559
8560 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8561 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8562 image_name: "art",
8563 contents: ["libfoo"],
8564 `)+`
8565 java_sdk_library_import {
8566 name: "libfoo",
8567 public: {
8568 jars: ["libbar.jar"],
8569 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008570 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008571 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008572 }
8573 `)
8574 })
8575}
8576
Paul Duffin5556c5f2022-06-09 17:32:21 +00008577func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8578 preparers := android.GroupFixturePreparers(
8579 java.PrepareForTestWithJavaDefaultModules,
8580 PrepareForTestWithApexBuildComponents,
8581 )
8582
Spandan Das59a4a2b2024-01-09 21:35:56 +00008583 errCtx := moduleErrorfTestCtx{}
8584
Paul Duffin5556c5f2022-06-09 17:32:21 +00008585 bpBase := `
8586 apex_set {
8587 name: "com.android.myapex",
8588 installable: true,
8589 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8590 set: "myapex.apks",
8591 }
8592
8593 apex_set {
8594 name: "com.android.myapex_compressed",
8595 apex_name: "com.android.myapex",
8596 installable: true,
8597 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8598 set: "myapex_compressed.apks",
8599 }
8600
8601 prebuilt_bootclasspath_fragment {
8602 name: "my-bootclasspath-fragment",
8603 apex_available: [
8604 "com.android.myapex",
8605 "com.android.myapex_compressed",
8606 ],
8607 hidden_api: {
8608 annotation_flags: "annotation-flags.csv",
8609 metadata: "metadata.csv",
8610 index: "index.csv",
8611 signature_patterns: "signature_patterns.csv",
8612 },
8613 %s
8614 }
8615 `
8616
8617 t.Run("java_import", func(t *testing.T) {
8618 result := preparers.RunTestWithBp(t,
8619 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8620 java_import {
8621 name: "libfoo",
8622 jars: ["libfoo.jar"],
8623 apex_available: [
8624 "com.android.myapex",
8625 "com.android.myapex_compressed",
8626 ],
8627 }
8628 `)
8629
8630 module := result.Module("libfoo", "android_common_com.android.myapex")
8631 usesLibraryDep := module.(java.UsesLibraryDependency)
8632 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008633 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008634 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008635 })
8636
8637 t.Run("java_sdk_library_import", func(t *testing.T) {
8638 result := preparers.RunTestWithBp(t,
8639 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8640 java_sdk_library_import {
8641 name: "libfoo",
8642 public: {
8643 jars: ["libbar.jar"],
8644 },
8645 apex_available: [
8646 "com.android.myapex",
8647 "com.android.myapex_compressed",
8648 ],
8649 compile_dex: true,
8650 }
8651 `)
8652
8653 module := result.Module("libfoo", "android_common_com.android.myapex")
8654 usesLibraryDep := module.(java.UsesLibraryDependency)
8655 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008656 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008657 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008658 })
8659
8660 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8661 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8662 image_name: "art",
8663 contents: ["libfoo"],
8664 `)+`
8665 java_sdk_library_import {
8666 name: "libfoo",
8667 public: {
8668 jars: ["libbar.jar"],
8669 },
8670 apex_available: [
8671 "com.android.myapex",
8672 "com.android.myapex_compressed",
8673 ],
8674 compile_dex: true,
8675 }
8676 `)
8677 })
8678}
8679
Jooyung Han548640b2020-04-27 12:10:30 +09008680func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8681 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8682 apex {
8683 name: "myapex",
8684 key: "myapex.key",
8685 updatable: true,
8686 }
8687
8688 apex_key {
8689 name: "myapex.key",
8690 public_key: "testkey.avbpubkey",
8691 private_key: "testkey.pem",
8692 }
8693 `)
8694}
8695
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008696func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8697 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8698 apex {
8699 name: "myapex",
8700 key: "myapex.key",
8701 }
8702
8703 apex_key {
8704 name: "myapex.key",
8705 public_key: "testkey.avbpubkey",
8706 private_key: "testkey.pem",
8707 }
8708 `)
8709}
8710
Jooyung Handfc864c2023-03-20 18:19:07 +09008711func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8712 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008713 apex {
8714 name: "myapex",
8715 key: "myapex.key",
8716 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008717 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008718 soc_specific: true,
8719 }
8720
8721 apex_key {
8722 name: "myapex.key",
8723 public_key: "testkey.avbpubkey",
8724 private_key: "testkey.pem",
8725 }
8726 `)
8727}
8728
Jooyung Han02873da2023-03-22 17:41:03 +09008729func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8730 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8731 apex {
8732 name: "myapex",
8733 key: "myapex.key",
8734 updatable: false,
8735 min_sdk_version: "29",
8736 use_vndk_as_stable: true,
8737 vendor: true,
8738 }
8739
8740 apex_key {
8741 name: "myapex.key",
8742 public_key: "testkey.avbpubkey",
8743 private_key: "testkey.pem",
8744 }
8745 `)
8746}
8747
Jooyung Handfc864c2023-03-20 18:19:07 +09008748func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8749 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8750 apex {
8751 name: "myapex",
8752 key: "myapex.key",
8753 updatable: false,
8754 use_vndk_as_stable: true,
8755 }
8756
8757 apex_key {
8758 name: "myapex.key",
8759 public_key: "testkey.avbpubkey",
8760 private_key: "testkey.pem",
8761 }
8762 `)
8763}
8764
satayevb98371c2021-06-15 16:49:50 +01008765func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8766 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8767 apex {
8768 name: "myapex",
8769 key: "myapex.key",
8770 systemserverclasspath_fragments: [
8771 "mysystemserverclasspathfragment",
8772 ],
8773 min_sdk_version: "29",
8774 updatable: true,
8775 }
8776
8777 apex_key {
8778 name: "myapex.key",
8779 public_key: "testkey.avbpubkey",
8780 private_key: "testkey.pem",
8781 }
8782
8783 java_library {
8784 name: "foo",
8785 srcs: ["b.java"],
8786 min_sdk_version: "29",
8787 installable: true,
8788 apex_available: [
8789 "myapex",
8790 ],
8791 }
8792
8793 systemserverclasspath_fragment {
8794 name: "mysystemserverclasspathfragment",
8795 generate_classpaths_proto: false,
8796 contents: [
8797 "foo",
8798 ],
8799 apex_available: [
8800 "myapex",
8801 ],
8802 }
satayevabcd5972021-08-06 17:49:46 +01008803 `,
8804 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8805 )
satayevb98371c2021-06-15 16:49:50 +01008806}
8807
Paul Duffin064b70c2020-11-02 17:32:38 +00008808func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008809 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008810 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008811 fragment := java.ApexVariantReference{
8812 Apex: proptools.StringPtr("myapex"),
8813 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8814 }
8815
Paul Duffin064b70c2020-11-02 17:32:38 +00008816 testDexpreoptWithApexes(t, `
8817 prebuilt_apex {
8818 name: "myapex" ,
8819 arch: {
8820 arm64: {
8821 src: "myapex-arm64.apex",
8822 },
8823 arm: {
8824 src: "myapex-arm.apex",
8825 },
8826 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008827 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8828 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008829
Paul Duffin89f570a2021-06-16 01:42:33 +01008830 prebuilt_bootclasspath_fragment {
8831 name: "my-bootclasspath-fragment",
8832 contents: ["libfoo"],
8833 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008834 hidden_api: {
8835 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8836 metadata: "my-bootclasspath-fragment/metadata.csv",
8837 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008838 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8839 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8840 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008841 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008842 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008843
Paul Duffin89f570a2021-06-16 01:42:33 +01008844 java_import {
8845 name: "libfoo",
8846 jars: ["libfoo.jar"],
8847 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008848 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008849 }
8850 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008851 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008852}
8853
Spandan Dasf14e2542021-11-12 00:01:37 +00008854func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008855 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008856 bp += `
8857 apex_key {
8858 name: "myapex.key",
8859 public_key: "testkey.avbpubkey",
8860 private_key: "testkey.pem",
8861 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008862 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008863 "lib1/src/A.java": nil,
8864 "lib2/src/B.java": nil,
8865 "system/sepolicy/apex/myapex-file_contexts": nil,
8866 }
8867
Paul Duffin45338f02021-03-30 23:07:52 +01008868 errorHandler := android.FixtureExpectsNoErrors
8869 if errmsg != "" {
8870 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008871 }
Colin Crossae8600b2020-10-29 17:09:13 -07008872
Paul Duffin45338f02021-03-30 23:07:52 +01008873 android.GroupFixturePreparers(
8874 android.PrepareForTestWithAndroidBuildComponents,
8875 java.PrepareForTestWithJavaBuildComponents,
8876 PrepareForTestWithApexBuildComponents,
8877 android.PrepareForTestWithNeverallowRules(rules),
8878 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008879 apexBootJars := make([]string, 0, len(bootJars))
8880 for _, apexBootJar := range bootJars {
8881 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008882 }
satayevd604b212021-07-21 14:23:52 +01008883 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008884 }),
8885 fs.AddToFixture(),
8886 ).
8887 ExtendWithErrorHandler(errorHandler).
8888 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008889}
8890
8891func TestApexPermittedPackagesRules(t *testing.T) {
8892 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008893 name string
8894 expectedError string
8895 bp string
8896 bootJars []string
8897 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008898 }{
8899
8900 {
8901 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8902 expectedError: "",
8903 bp: `
8904 java_library {
8905 name: "bcp_lib1",
8906 srcs: ["lib1/src/*.java"],
8907 permitted_packages: ["foo.bar"],
8908 apex_available: ["myapex"],
8909 sdk_version: "none",
8910 system_modules: "none",
8911 }
8912 java_library {
8913 name: "nonbcp_lib2",
8914 srcs: ["lib2/src/*.java"],
8915 apex_available: ["myapex"],
8916 permitted_packages: ["a.b"],
8917 sdk_version: "none",
8918 system_modules: "none",
8919 }
8920 apex {
8921 name: "myapex",
8922 key: "myapex.key",
8923 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008924 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008925 }`,
8926 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008927 bcpPermittedPackages: map[string][]string{
8928 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008929 "foo.bar",
8930 },
8931 },
8932 },
8933 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008934 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008935 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 +01008936 bp: `
8937 java_library {
8938 name: "bcp_lib1",
8939 srcs: ["lib1/src/*.java"],
8940 apex_available: ["myapex"],
8941 permitted_packages: ["foo.bar"],
8942 sdk_version: "none",
8943 system_modules: "none",
8944 }
8945 java_library {
8946 name: "bcp_lib2",
8947 srcs: ["lib2/src/*.java"],
8948 apex_available: ["myapex"],
8949 permitted_packages: ["foo.bar", "bar.baz"],
8950 sdk_version: "none",
8951 system_modules: "none",
8952 }
8953 apex {
8954 name: "myapex",
8955 key: "myapex.key",
8956 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008957 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008958 }
8959 `,
8960 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008961 bcpPermittedPackages: map[string][]string{
8962 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008963 "foo.bar",
8964 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008965 "bcp_lib2": []string{
8966 "foo.bar",
8967 },
8968 },
8969 },
8970 {
8971 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8972 expectedError: "",
8973 bp: `
8974 java_library {
8975 name: "bcp_lib_restricted",
8976 srcs: ["lib1/src/*.java"],
8977 apex_available: ["myapex"],
8978 permitted_packages: ["foo.bar"],
8979 sdk_version: "none",
8980 min_sdk_version: "29",
8981 system_modules: "none",
8982 }
8983 java_library {
8984 name: "bcp_lib_unrestricted",
8985 srcs: ["lib2/src/*.java"],
8986 apex_available: ["myapex"],
8987 permitted_packages: ["foo.bar", "bar.baz"],
8988 sdk_version: "none",
8989 min_sdk_version: "29",
8990 system_modules: "none",
8991 }
8992 apex {
8993 name: "myapex",
8994 key: "myapex.key",
8995 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8996 updatable: true,
8997 min_sdk_version: "29",
8998 }
8999 `,
9000 bootJars: []string{"bcp_lib1", "bcp_lib2"},
9001 bcpPermittedPackages: map[string][]string{
9002 "bcp_lib1_non_updateable": []string{
9003 "foo.bar",
9004 },
9005 // 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 +01009006 },
9007 },
9008 }
9009 for _, tc := range testcases {
9010 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009011 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9012 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009013 })
9014 }
9015}
9016
Jiyong Park62304bb2020-04-13 16:19:48 +09009017func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009018 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009019 apex {
9020 name: "myapex",
9021 key: "myapex.key",
9022 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009023 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009024 }
9025
9026 apex_key {
9027 name: "myapex.key",
9028 public_key: "testkey.avbpubkey",
9029 private_key: "testkey.pem",
9030 }
9031
9032 cc_library {
9033 name: "mylib",
9034 srcs: ["mylib.cpp"],
9035 system_shared_libs: [],
9036 stl: "none",
9037 stubs: {
9038 versions: ["1"],
9039 },
9040 apex_available: ["myapex"],
9041 }
9042
9043 cc_library {
9044 name: "myprivlib",
9045 srcs: ["mylib.cpp"],
9046 system_shared_libs: [],
9047 stl: "none",
9048 apex_available: ["myapex"],
9049 }
9050
9051
9052 cc_test {
9053 name: "mytest",
9054 gtest: false,
9055 srcs: ["mylib.cpp"],
9056 system_shared_libs: [],
9057 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009058 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009059 test_for: ["myapex"]
9060 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009061
9062 cc_library {
9063 name: "mytestlib",
9064 srcs: ["mylib.cpp"],
9065 system_shared_libs: [],
9066 shared_libs: ["mylib", "myprivlib"],
9067 stl: "none",
9068 test_for: ["myapex"],
9069 }
9070
9071 cc_benchmark {
9072 name: "mybench",
9073 srcs: ["mylib.cpp"],
9074 system_shared_libs: [],
9075 shared_libs: ["mylib", "myprivlib"],
9076 stl: "none",
9077 test_for: ["myapex"],
9078 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009079 `)
9080
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009081 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009082 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009083 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9084 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9085 }
9086
9087 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009088 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009089 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9090 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9091 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9092}
Jiyong Park46a512f2020-12-04 18:02:13 +09009093
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009094func TestIndirectTestFor(t *testing.T) {
9095 ctx := testApex(t, `
9096 apex {
9097 name: "myapex",
9098 key: "myapex.key",
9099 native_shared_libs: ["mylib", "myprivlib"],
9100 updatable: false,
9101 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009102
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009103 apex_key {
9104 name: "myapex.key",
9105 public_key: "testkey.avbpubkey",
9106 private_key: "testkey.pem",
9107 }
9108
9109 cc_library {
9110 name: "mylib",
9111 srcs: ["mylib.cpp"],
9112 system_shared_libs: [],
9113 stl: "none",
9114 stubs: {
9115 versions: ["1"],
9116 },
9117 apex_available: ["myapex"],
9118 }
9119
9120 cc_library {
9121 name: "myprivlib",
9122 srcs: ["mylib.cpp"],
9123 system_shared_libs: [],
9124 stl: "none",
9125 shared_libs: ["mylib"],
9126 apex_available: ["myapex"],
9127 }
9128
9129 cc_library {
9130 name: "mytestlib",
9131 srcs: ["mylib.cpp"],
9132 system_shared_libs: [],
9133 shared_libs: ["myprivlib"],
9134 stl: "none",
9135 test_for: ["myapex"],
9136 }
9137 `)
9138
9139 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009140 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009141 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9142 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9143 }
9144
9145 // The platform variant of mytestlib links to the platform variant of the
9146 // internal myprivlib.
9147 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9148
9149 // The platform variant of myprivlib links to the platform variant of mylib
9150 // and bypasses its stubs.
9151 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 +09009152}
9153
Martin Stjernholmec009002021-03-27 15:18:31 +00009154func TestTestForForLibInOtherApex(t *testing.T) {
9155 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9156 _ = testApex(t, `
9157 apex {
9158 name: "com.android.art",
9159 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009160 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009161 updatable: false,
9162 }
9163
9164 apex {
9165 name: "com.android.art.debug",
9166 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009167 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009168 updatable: false,
9169 }
9170
9171 apex_key {
9172 name: "myapex.key",
9173 public_key: "testkey.avbpubkey",
9174 private_key: "testkey.pem",
9175 }
9176
9177 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009178 name: "libnativebridge",
9179 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009180 system_shared_libs: [],
9181 stl: "none",
9182 stubs: {
9183 versions: ["1"],
9184 },
9185 apex_available: ["com.android.art", "com.android.art.debug"],
9186 }
9187
9188 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009189 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009190 srcs: ["mylib.cpp"],
9191 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009192 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009193 stl: "none",
9194 apex_available: ["com.android.art.debug"],
9195 test_for: ["com.android.art"],
9196 }
9197 `,
9198 android.MockFS{
9199 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9200 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9201 }.AddToFixture())
9202}
9203
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009204// TODO(jungjw): Move this to proptools
9205func intPtr(i int) *int {
9206 return &i
9207}
9208
9209func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009210 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009211 apex_set {
9212 name: "myapex",
9213 set: "myapex.apks",
9214 filename: "foo_v2.apex",
9215 overrides: ["foo"],
9216 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009217 `,
9218 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9219 variables.Platform_sdk_version = intPtr(30)
9220 }),
9221 android.FixtureModifyConfig(func(config android.Config) {
9222 config.Targets[android.Android] = []android.Target{
9223 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9224 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9225 }
9226 }),
9227 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009228
Spandan Das3576e762024-01-03 18:57:03 +00009229 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009230
9231 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009232 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009233 actual := extractedApex.Args["abis"]
9234 expected := "ARMEABI_V7A,ARM64_V8A"
9235 if actual != expected {
9236 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9237 }
9238 actual = extractedApex.Args["sdk-version"]
9239 expected = "30"
9240 if actual != expected {
9241 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9242 }
9243
Paul Duffin6717d882021-06-15 19:09:41 +01009244 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009245 a := m.Module().(*ApexSet)
9246 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009247 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009248 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9249 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9250 }
9251}
9252
Anton Hansson805e0a52022-11-25 14:06:46 +00009253func TestApexSet_NativeBridge(t *testing.T) {
9254 ctx := testApex(t, `
9255 apex_set {
9256 name: "myapex",
9257 set: "myapex.apks",
9258 filename: "foo_v2.apex",
9259 overrides: ["foo"],
9260 }
9261 `,
9262 android.FixtureModifyConfig(func(config android.Config) {
9263 config.Targets[android.Android] = []android.Target{
9264 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9265 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9266 }
9267 }),
9268 )
9269
Spandan Das3576e762024-01-03 18:57:03 +00009270 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009271
9272 // Check extract_apks tool parameters. No native bridge arch expected
9273 extractedApex := m.Output("extracted/myapex.apks")
9274 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9275}
9276
Jiyong Park7d95a512020-05-10 15:16:24 +09009277func TestNoStaticLinkingToStubsLib(t *testing.T) {
9278 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9279 apex {
9280 name: "myapex",
9281 key: "myapex.key",
9282 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009283 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009284 }
9285
9286 apex_key {
9287 name: "myapex.key",
9288 public_key: "testkey.avbpubkey",
9289 private_key: "testkey.pem",
9290 }
9291
9292 cc_library {
9293 name: "mylib",
9294 srcs: ["mylib.cpp"],
9295 static_libs: ["otherlib"],
9296 system_shared_libs: [],
9297 stl: "none",
9298 apex_available: [ "myapex" ],
9299 }
9300
9301 cc_library {
9302 name: "otherlib",
9303 srcs: ["mylib.cpp"],
9304 system_shared_libs: [],
9305 stl: "none",
9306 stubs: {
9307 versions: ["1", "2", "3"],
9308 },
9309 apex_available: [ "myapex" ],
9310 }
9311 `)
9312}
9313
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009314func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009315 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009316 apex {
9317 name: "myapex",
9318 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009319 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009320 custom_sign_tool: "sign_myapex",
9321 }
9322
9323 apex_key {
9324 name: "myapex.key",
9325 public_key: "testkey.avbpubkey",
9326 private_key: "testkey.pem",
9327 }
9328 `)
9329
Jooyung Han286957d2023-10-30 16:17:56 +09009330 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009331 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009332 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 +09009333}
9334
9335func TestApexKeysTxtOverrides(t *testing.T) {
9336 ctx := testApex(t, `
9337 apex {
9338 name: "myapex",
9339 key: "myapex.key",
9340 updatable: false,
9341 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009342 }
9343
9344 apex_key {
9345 name: "myapex.key",
9346 public_key: "testkey.avbpubkey",
9347 private_key: "testkey.pem",
9348 }
9349
9350 prebuilt_apex {
9351 name: "myapex",
9352 prefer: true,
9353 arch: {
9354 arm64: {
9355 src: "myapex-arm64.apex",
9356 },
9357 arm: {
9358 src: "myapex-arm.apex",
9359 },
9360 },
9361 }
9362
9363 apex_set {
9364 name: "myapex_set",
9365 set: "myapex.apks",
9366 filename: "myapex_set.apex",
9367 overrides: ["myapex"],
9368 }
9369 `)
9370
Colin Crossf61d03d2023-11-02 16:56:39 -07009371 content := android.ContentFromFileRuleForTests(t, ctx,
9372 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009373 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 -07009374 content = android.ContentFromFileRuleForTests(t, ctx,
9375 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009376 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 +09009377}
9378
Jooyung Han938b5932020-06-20 12:47:47 +09009379func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009380 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009381 apex {
9382 name: "myapex",
9383 key: "myapex.key",
9384 apps: ["app"],
9385 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009386 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009387 }
9388
9389 apex_key {
9390 name: "myapex.key",
9391 public_key: "testkey.avbpubkey",
9392 private_key: "testkey.pem",
9393 }
9394
9395 android_app {
9396 name: "app",
9397 srcs: ["foo/bar/MyClass.java"],
9398 package_name: "foo",
9399 sdk_version: "none",
9400 system_modules: "none",
9401 apex_available: [ "myapex" ],
9402 }
9403 `, withFiles(map[string][]byte{
9404 "sub/Android.bp": []byte(`
9405 override_apex {
9406 name: "override_myapex",
9407 base: "myapex",
9408 apps: ["override_app"],
9409 allowed_files: ":allowed",
9410 }
9411 // Overridable "path" property should be referenced indirectly
9412 filegroup {
9413 name: "allowed",
9414 srcs: ["allowed.txt"],
9415 }
9416 override_android_app {
9417 name: "override_app",
9418 base: "app",
9419 package_name: "bar",
9420 }
9421 `),
9422 }))
9423
Jooyung Hana0503a52023-08-23 13:12:50 +09009424 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009425 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9426 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9427 }
9428
Jooyung Hana0503a52023-08-23 13:12:50 +09009429 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009430 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9431 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9432 }
9433}
9434
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009435func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009436 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009437 apex {
9438 name: "myapex",
9439 key: "myapex.key",
9440 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009441 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009442 }
9443
9444 apex_key {
9445 name: "myapex.key",
9446 public_key: "testkey.avbpubkey",
9447 private_key: "testkey.pem",
9448 }
9449
9450 cc_library {
9451 name: "mylib",
9452 srcs: ["mylib.cpp"],
9453 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009454 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009455 },
9456 apex_available: ["myapex"],
9457 }
9458
9459 cc_prebuilt_library_shared {
9460 name: "mylib",
9461 prefer: false,
9462 srcs: ["prebuilt.so"],
9463 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009464 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009465 },
9466 apex_available: ["myapex"],
9467 }
9468 `)
9469}
9470
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009471func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009472 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009473 apex {
9474 name: "myapex",
9475 key: "myapex.key",
9476 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009477 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009478 }
9479 apex_key {
9480 name: "myapex.key",
9481 public_key: "testkey.avbpubkey",
9482 private_key: "testkey.pem",
9483 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009484 `,
9485 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9486 variables.CompressedApex = proptools.BoolPtr(true)
9487 }),
9488 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009489
Jooyung Hana0503a52023-08-23 13:12:50 +09009490 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009491 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9492
Jooyung Hana0503a52023-08-23 13:12:50 +09009493 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009494 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9495
9496 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009497 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009498 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9499
9500 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009501 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009502 var builder strings.Builder
9503 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9504 androidMk := builder.String()
9505 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9506}
9507
Martin Stjernholm2856c662020-12-02 15:03:42 +00009508func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009509 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009510 apex {
9511 name: "myapex",
9512 key: "myapex.key",
9513 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009514 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009515 }
9516
9517 apex_key {
9518 name: "myapex.key",
9519 public_key: "testkey.avbpubkey",
9520 private_key: "testkey.pem",
9521 }
9522
9523 cc_library {
9524 name: "mylib",
9525 srcs: ["mylib.cpp"],
9526 apex_available: ["myapex"],
9527 shared_libs: ["otherlib"],
9528 system_shared_libs: [],
9529 }
9530
9531 cc_library {
9532 name: "otherlib",
9533 srcs: ["mylib.cpp"],
9534 stubs: {
9535 versions: ["current"],
9536 },
9537 }
9538
9539 cc_prebuilt_library_shared {
9540 name: "otherlib",
9541 prefer: true,
9542 srcs: ["prebuilt.so"],
9543 stubs: {
9544 versions: ["current"],
9545 },
9546 }
9547 `)
9548
Jooyung Hana0503a52023-08-23 13:12:50 +09009549 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009550 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009551 var builder strings.Builder
9552 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9553 androidMk := builder.String()
9554
9555 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9556 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009557 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009558}
9559
Jiyong Parke3867542020-12-03 17:28:25 +09009560func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009561 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009562 apex {
9563 name: "myapex",
9564 key: "myapex.key",
9565 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009566 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009567 }
9568
9569 apex_key {
9570 name: "myapex.key",
9571 public_key: "testkey.avbpubkey",
9572 private_key: "testkey.pem",
9573 }
9574
9575 cc_library {
9576 name: "mylib",
9577 srcs: ["mylib.cpp"],
9578 system_shared_libs: [],
9579 stl: "none",
9580 apex_available: ["myapex"],
9581 shared_libs: ["mylib2"],
9582 target: {
9583 apex: {
9584 exclude_shared_libs: ["mylib2"],
9585 },
9586 },
9587 }
9588
9589 cc_library {
9590 name: "mylib2",
9591 srcs: ["mylib.cpp"],
9592 system_shared_libs: [],
9593 stl: "none",
9594 }
9595 `)
9596
9597 // Check if mylib is linked to mylib2 for the non-apex target
9598 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9599 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9600
9601 // Make sure that the link doesn't occur for the apex target
9602 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9603 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9604
9605 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009606 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009607 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9608}
9609
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009610func TestPrebuiltStubLibDep(t *testing.T) {
9611 bpBase := `
9612 apex {
9613 name: "myapex",
9614 key: "myapex.key",
9615 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009616 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009617 }
9618 apex_key {
9619 name: "myapex.key",
9620 public_key: "testkey.avbpubkey",
9621 private_key: "testkey.pem",
9622 }
9623 cc_library {
9624 name: "mylib",
9625 srcs: ["mylib.cpp"],
9626 apex_available: ["myapex"],
9627 shared_libs: ["stublib"],
9628 system_shared_libs: [],
9629 }
9630 apex {
9631 name: "otherapex",
9632 enabled: %s,
9633 key: "myapex.key",
9634 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009635 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009636 }
9637 `
9638
9639 stublibSourceBp := `
9640 cc_library {
9641 name: "stublib",
9642 srcs: ["mylib.cpp"],
9643 apex_available: ["otherapex"],
9644 system_shared_libs: [],
9645 stl: "none",
9646 stubs: {
9647 versions: ["1"],
9648 },
9649 }
9650 `
9651
9652 stublibPrebuiltBp := `
9653 cc_prebuilt_library_shared {
9654 name: "stublib",
9655 srcs: ["prebuilt.so"],
9656 apex_available: ["otherapex"],
9657 stubs: {
9658 versions: ["1"],
9659 },
9660 %s
9661 }
9662 `
9663
9664 tests := []struct {
9665 name string
9666 stublibBp string
9667 usePrebuilt bool
9668 modNames []string // Modules to collect AndroidMkEntries for
9669 otherApexEnabled []string
9670 }{
9671 {
9672 name: "only_source",
9673 stublibBp: stublibSourceBp,
9674 usePrebuilt: false,
9675 modNames: []string{"stublib"},
9676 otherApexEnabled: []string{"true", "false"},
9677 },
9678 {
9679 name: "source_preferred",
9680 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9681 usePrebuilt: false,
9682 modNames: []string{"stublib", "prebuilt_stublib"},
9683 otherApexEnabled: []string{"true", "false"},
9684 },
9685 {
9686 name: "prebuilt_preferred",
9687 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9688 usePrebuilt: true,
9689 modNames: []string{"stublib", "prebuilt_stublib"},
9690 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9691 },
9692 {
9693 name: "only_prebuilt",
9694 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9695 usePrebuilt: true,
9696 modNames: []string{"stublib"},
9697 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9698 },
9699 }
9700
9701 for _, test := range tests {
9702 t.Run(test.name, func(t *testing.T) {
9703 for _, otherApexEnabled := range test.otherApexEnabled {
9704 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009705 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009706
9707 type modAndMkEntries struct {
9708 mod *cc.Module
9709 mkEntries android.AndroidMkEntries
9710 }
9711 entries := []*modAndMkEntries{}
9712
9713 // Gather shared lib modules that are installable
9714 for _, modName := range test.modNames {
9715 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9716 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9717 continue
9718 }
9719 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009720 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009721 continue
9722 }
Colin Crossaa255532020-07-03 13:18:24 -07009723 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009724 if ent.Disabled {
9725 continue
9726 }
9727 entries = append(entries, &modAndMkEntries{
9728 mod: mod,
9729 mkEntries: ent,
9730 })
9731 }
9732 }
9733 }
9734
9735 var entry *modAndMkEntries = nil
9736 for _, ent := range entries {
9737 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9738 if entry != nil {
9739 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9740 } else {
9741 entry = ent
9742 }
9743 }
9744 }
9745
9746 if entry == nil {
9747 t.Errorf("AndroidMk entry for \"stublib\" missing")
9748 } else {
9749 isPrebuilt := entry.mod.Prebuilt() != nil
9750 if isPrebuilt != test.usePrebuilt {
9751 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9752 }
9753 if !entry.mod.IsStubs() {
9754 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9755 }
9756 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9757 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9758 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009759 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009760 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009761 if !android.InList(expected, cflags) {
9762 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9763 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009764 }
9765 })
9766 }
9767 })
9768 }
9769}
9770
Colin Crossc33e5212021-05-25 18:16:02 -07009771func TestApexJavaCoverage(t *testing.T) {
9772 bp := `
9773 apex {
9774 name: "myapex",
9775 key: "myapex.key",
9776 java_libs: ["mylib"],
9777 bootclasspath_fragments: ["mybootclasspathfragment"],
9778 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9779 updatable: false,
9780 }
9781
9782 apex_key {
9783 name: "myapex.key",
9784 public_key: "testkey.avbpubkey",
9785 private_key: "testkey.pem",
9786 }
9787
9788 java_library {
9789 name: "mylib",
9790 srcs: ["mylib.java"],
9791 apex_available: ["myapex"],
9792 compile_dex: true,
9793 }
9794
9795 bootclasspath_fragment {
9796 name: "mybootclasspathfragment",
9797 contents: ["mybootclasspathlib"],
9798 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009799 hidden_api: {
9800 split_packages: ["*"],
9801 },
Colin Crossc33e5212021-05-25 18:16:02 -07009802 }
9803
9804 java_library {
9805 name: "mybootclasspathlib",
9806 srcs: ["mybootclasspathlib.java"],
9807 apex_available: ["myapex"],
9808 compile_dex: true,
9809 }
9810
9811 systemserverclasspath_fragment {
9812 name: "mysystemserverclasspathfragment",
9813 contents: ["mysystemserverclasspathlib"],
9814 apex_available: ["myapex"],
9815 }
9816
9817 java_library {
9818 name: "mysystemserverclasspathlib",
9819 srcs: ["mysystemserverclasspathlib.java"],
9820 apex_available: ["myapex"],
9821 compile_dex: true,
9822 }
9823 `
9824
9825 result := android.GroupFixturePreparers(
9826 PrepareForTestWithApexBuildComponents,
9827 prepareForTestWithMyapex,
9828 java.PrepareForTestWithJavaDefaultModules,
9829 android.PrepareForTestWithAndroidBuildComponents,
9830 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009831 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9832 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009833 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009834 ).RunTest(t)
9835
9836 // Make sure jacoco ran on both mylib and mybootclasspathlib
9837 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9838 t.Errorf("Failed to find jacoco rule for mylib")
9839 }
9840 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9841 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9842 }
9843 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9844 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9845 }
9846}
9847
Jiyong Park192600a2021-08-03 07:52:17 +00009848func TestProhibitStaticExecutable(t *testing.T) {
9849 testApexError(t, `executable mybin is static`, `
9850 apex {
9851 name: "myapex",
9852 key: "myapex.key",
9853 binaries: ["mybin"],
9854 min_sdk_version: "29",
9855 }
9856
9857 apex_key {
9858 name: "myapex.key",
9859 public_key: "testkey.avbpubkey",
9860 private_key: "testkey.pem",
9861 }
9862
9863 cc_binary {
9864 name: "mybin",
9865 srcs: ["mylib.cpp"],
9866 relative_install_path: "foo/bar",
9867 static_executable: true,
9868 system_shared_libs: [],
9869 stl: "none",
9870 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009871 min_sdk_version: "29",
9872 }
9873 `)
9874
9875 testApexError(t, `executable mybin.rust is static`, `
9876 apex {
9877 name: "myapex",
9878 key: "myapex.key",
9879 binaries: ["mybin.rust"],
9880 min_sdk_version: "29",
9881 }
9882
9883 apex_key {
9884 name: "myapex.key",
9885 public_key: "testkey.avbpubkey",
9886 private_key: "testkey.pem",
9887 }
9888
9889 rust_binary {
9890 name: "mybin.rust",
9891 srcs: ["foo.rs"],
9892 static_executable: true,
9893 apex_available: ["myapex"],
9894 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009895 }
9896 `)
9897}
9898
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009899func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9900 ctx := testApex(t, `
9901 apex {
9902 name: "myapex",
9903 key: "myapex.key",
9904 updatable: false,
9905 java_libs: ["foo"],
9906 }
9907
9908 apex_key {
9909 name: "myapex.key",
9910 public_key: "testkey.avbpubkey",
9911 private_key: "testkey.pem",
9912 }
9913
9914 java_library {
9915 name: "foo",
9916 srcs: ["foo.java"],
9917 apex_available: ["myapex"],
9918 installable: true,
9919 }
9920 `,
9921 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9922 )
9923
Jooyung Hana0503a52023-08-23 13:12:50 +09009924 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009925 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9926 var builder strings.Builder
9927 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9928 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009929 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 +00009930}
9931
9932func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9933 ctx := testApex(t, `
9934 prebuilt_apex {
9935 name: "myapex",
9936 arch: {
9937 arm64: {
9938 src: "myapex-arm64.apex",
9939 },
9940 arm: {
9941 src: "myapex-arm.apex",
9942 },
9943 },
9944 exported_java_libs: ["foo"],
9945 }
9946
9947 java_import {
9948 name: "foo",
9949 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009950 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009951 }
9952 `,
9953 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9954 )
9955
9956 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9957 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9958 mainModuleEntries := entriesList[0]
9959 android.AssertArrayString(t,
9960 "LOCAL_REQUIRED_MODULES",
9961 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9962 []string{
9963 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9964 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9965 })
9966}
9967
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009968func TestAndroidMk_RequiredModules(t *testing.T) {
9969 ctx := testApex(t, `
9970 apex {
9971 name: "myapex",
9972 key: "myapex.key",
9973 updatable: false,
9974 java_libs: ["foo"],
9975 required: ["otherapex"],
9976 }
9977
9978 apex {
9979 name: "otherapex",
9980 key: "myapex.key",
9981 updatable: false,
9982 java_libs: ["foo"],
9983 required: ["otherapex"],
9984 }
9985
9986 apex_key {
9987 name: "myapex.key",
9988 public_key: "testkey.avbpubkey",
9989 private_key: "testkey.pem",
9990 }
9991
9992 java_library {
9993 name: "foo",
9994 srcs: ["foo.java"],
9995 apex_available: ["myapex", "otherapex"],
9996 installable: true,
9997 }
9998 `)
9999
Jooyung Hana0503a52023-08-23 13:12:50 +090010000 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010001 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10002 var builder strings.Builder
10003 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10004 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010005 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010006}
10007
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010008func TestAndroidMk_RequiredDeps(t *testing.T) {
10009 ctx := testApex(t, `
10010 apex {
10011 name: "myapex",
10012 key: "myapex.key",
10013 updatable: false,
10014 }
10015
10016 apex_key {
10017 name: "myapex.key",
10018 public_key: "testkey.avbpubkey",
10019 private_key: "testkey.pem",
10020 }
10021 `)
10022
Jooyung Hana0503a52023-08-23 13:12:50 +090010023 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010024 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010025 data := android.AndroidMkDataForTest(t, ctx, bundle)
10026 var builder strings.Builder
10027 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10028 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010029 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010030}
10031
Jooyung Hana6d36672022-02-24 13:58:07 +090010032func TestApexOutputFileProducer(t *testing.T) {
10033 for _, tc := range []struct {
10034 name string
10035 ref string
10036 expected_data []string
10037 }{
10038 {
10039 name: "test_using_output",
10040 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010041 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010042 },
10043 {
10044 name: "test_using_apex",
10045 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010046 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010047 },
10048 } {
10049 t.Run(tc.name, func(t *testing.T) {
10050 ctx := testApex(t, `
10051 apex {
10052 name: "myapex",
10053 key: "myapex.key",
10054 compressible: true,
10055 updatable: false,
10056 }
10057
10058 apex_key {
10059 name: "myapex.key",
10060 public_key: "testkey.avbpubkey",
10061 private_key: "testkey.pem",
10062 }
10063
10064 java_test {
10065 name: "`+tc.name+`",
10066 srcs: ["a.java"],
10067 data: ["`+tc.ref+`"],
10068 }
10069 `,
10070 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10071 variables.CompressedApex = proptools.BoolPtr(true)
10072 }))
10073 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10074 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10075 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10076 })
10077 }
10078}
10079
satayev758968a2021-12-06 11:42:40 +000010080func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10081 preparer := android.GroupFixturePreparers(
10082 PrepareForTestWithApexBuildComponents,
10083 prepareForTestWithMyapex,
10084 java.PrepareForTestWithJavaSdkLibraryFiles,
10085 java.PrepareForTestWithJavaDefaultModules,
10086 android.PrepareForTestWithAndroidBuildComponents,
10087 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10088 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10089 )
10090
10091 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10092 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10093 preparer.RunTestWithBp(t, `
10094 apex {
10095 name: "myapex",
10096 key: "myapex.key",
10097 bootclasspath_fragments: ["mybootclasspathfragment"],
10098 min_sdk_version: "30",
10099 updatable: false,
10100 }
10101
10102 apex_key {
10103 name: "myapex.key",
10104 public_key: "testkey.avbpubkey",
10105 private_key: "testkey.pem",
10106 }
10107
10108 bootclasspath_fragment {
10109 name: "mybootclasspathfragment",
10110 contents: ["mybootclasspathlib"],
10111 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010112 hidden_api: {
10113 split_packages: ["*"],
10114 },
satayev758968a2021-12-06 11:42:40 +000010115 }
10116
10117 java_sdk_library {
10118 name: "mybootclasspathlib",
10119 srcs: ["mybootclasspathlib.java"],
10120 apex_available: ["myapex"],
10121 compile_dex: true,
10122 unsafe_ignore_missing_latest_api: true,
10123 min_sdk_version: "31",
10124 static_libs: ["util"],
10125 }
10126
10127 java_library {
10128 name: "util",
10129 srcs: ["a.java"],
10130 apex_available: ["myapex"],
10131 min_sdk_version: "31",
10132 static_libs: ["another_util"],
10133 }
10134
10135 java_library {
10136 name: "another_util",
10137 srcs: ["a.java"],
10138 min_sdk_version: "31",
10139 apex_available: ["myapex"],
10140 }
10141 `)
10142 })
10143
10144 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10145 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10146 preparer.RunTestWithBp(t, `
10147 apex {
10148 name: "myapex",
10149 key: "myapex.key",
10150 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10151 min_sdk_version: "30",
10152 updatable: false,
10153 }
10154
10155 apex_key {
10156 name: "myapex.key",
10157 public_key: "testkey.avbpubkey",
10158 private_key: "testkey.pem",
10159 }
10160
10161 systemserverclasspath_fragment {
10162 name: "mysystemserverclasspathfragment",
10163 contents: ["mysystemserverclasspathlib"],
10164 apex_available: ["myapex"],
10165 }
10166
10167 java_sdk_library {
10168 name: "mysystemserverclasspathlib",
10169 srcs: ["mysystemserverclasspathlib.java"],
10170 apex_available: ["myapex"],
10171 compile_dex: true,
10172 min_sdk_version: "32",
10173 unsafe_ignore_missing_latest_api: true,
10174 static_libs: ["util"],
10175 }
10176
10177 java_library {
10178 name: "util",
10179 srcs: ["a.java"],
10180 apex_available: ["myapex"],
10181 min_sdk_version: "31",
10182 static_libs: ["another_util"],
10183 }
10184
10185 java_library {
10186 name: "another_util",
10187 srcs: ["a.java"],
10188 min_sdk_version: "31",
10189 apex_available: ["myapex"],
10190 }
10191 `)
10192 })
10193
10194 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10195 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10196 RunTestWithBp(t, `
10197 apex {
10198 name: "myapex",
10199 key: "myapex.key",
10200 bootclasspath_fragments: ["mybootclasspathfragment"],
10201 min_sdk_version: "30",
10202 updatable: false,
10203 }
10204
10205 apex_key {
10206 name: "myapex.key",
10207 public_key: "testkey.avbpubkey",
10208 private_key: "testkey.pem",
10209 }
10210
10211 bootclasspath_fragment {
10212 name: "mybootclasspathfragment",
10213 contents: ["mybootclasspathlib"],
10214 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010215 hidden_api: {
10216 split_packages: ["*"],
10217 },
satayev758968a2021-12-06 11:42:40 +000010218 }
10219
10220 java_sdk_library {
10221 name: "mybootclasspathlib",
10222 srcs: ["mybootclasspathlib.java"],
10223 apex_available: ["myapex"],
10224 compile_dex: true,
10225 unsafe_ignore_missing_latest_api: true,
10226 }
10227 `)
10228 })
10229
10230 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10231 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10232 RunTestWithBp(t, `
10233 apex {
10234 name: "myapex",
10235 key: "myapex.key",
10236 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10237 min_sdk_version: "30",
10238 updatable: false,
10239 }
10240
10241 apex_key {
10242 name: "myapex.key",
10243 public_key: "testkey.avbpubkey",
10244 private_key: "testkey.pem",
10245 }
10246
10247 systemserverclasspath_fragment {
10248 name: "mysystemserverclasspathfragment",
10249 contents: ["mysystemserverclasspathlib"],
10250 apex_available: ["myapex"],
10251 }
10252
10253 java_sdk_library {
10254 name: "mysystemserverclasspathlib",
10255 srcs: ["mysystemserverclasspathlib.java"],
10256 apex_available: ["myapex"],
10257 compile_dex: true,
10258 unsafe_ignore_missing_latest_api: true,
10259 }
10260 `)
10261 })
10262}
10263
Jiakai Zhang6decef92022-01-12 17:56:19 +000010264// Verifies that the APEX depends on all the Make modules in the list.
10265func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10266 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10267 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010268 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010269 }
10270}
10271
10272// Verifies that the APEX does not depend on any of the Make modules in the list.
10273func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10274 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10275 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010276 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010277 }
10278}
10279
Cole Faust1021ccd2023-02-26 21:15:25 -080010280// TODO(b/193460475): Re-enable this test
10281//func TestApexStrictUpdtabilityLint(t *testing.T) {
10282// bpTemplate := `
10283// apex {
10284// name: "myapex",
10285// key: "myapex.key",
10286// java_libs: ["myjavalib"],
10287// updatable: %v,
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// lint: {
10298// strict_updatability_linting: %v,
10299// },
10300// sdk_version: "current",
10301// min_sdk_version: "29",
10302// }
10303// `
10304// fs := android.MockFS{
10305// "lint-baseline.xml": nil,
10306// }
10307//
10308// testCases := []struct {
10309// testCaseName string
10310// apexUpdatable bool
10311// javaStrictUpdtabilityLint bool
10312// lintFileExists bool
10313// disallowedFlagExpected bool
10314// }{
10315// {
10316// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10317// apexUpdatable: true,
10318// javaStrictUpdtabilityLint: true,
10319// lintFileExists: false,
10320// disallowedFlagExpected: false,
10321// },
10322// {
10323// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10324// apexUpdatable: false,
10325// javaStrictUpdtabilityLint: false,
10326// lintFileExists: true,
10327// disallowedFlagExpected: false,
10328// },
10329// {
10330// testCaseName: "non-updatable apex respects strict updatability of javalib",
10331// apexUpdatable: false,
10332// javaStrictUpdtabilityLint: true,
10333// lintFileExists: true,
10334// disallowedFlagExpected: true,
10335// },
10336// {
10337// testCaseName: "updatable apex sets strict updatability of javalib to true",
10338// apexUpdatable: true,
10339// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10340// lintFileExists: true,
10341// disallowedFlagExpected: true,
10342// },
10343// }
10344//
10345// for _, testCase := range testCases {
10346// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10347// fixtures := []android.FixturePreparer{}
10348// if testCase.lintFileExists {
10349// fixtures = append(fixtures, fs.AddToFixture())
10350// }
10351//
10352// result := testApex(t, bp, fixtures...)
10353// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10354// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10355// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10356//
10357// if disallowedFlagActual != testCase.disallowedFlagExpected {
10358// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10359// }
10360// }
10361//}
10362//
10363//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10364// bp := `
10365// apex {
10366// name: "myapex",
10367// key: "myapex.key",
10368// java_libs: ["myjavalib"],
10369// updatable: true,
10370// min_sdk_version: "29",
10371// }
10372// apex_key {
10373// name: "myapex.key",
10374// }
10375// java_library {
10376// name: "myjavalib",
10377// srcs: ["MyClass.java"],
10378// apex_available: [ "myapex" ],
10379// sdk_version: "current",
10380// min_sdk_version: "29",
10381// }
10382// `
10383//
10384// testCases := []struct {
10385// testCaseName string
10386// moduleDirectory string
10387// disallowedFlagExpected bool
10388// }{
10389// {
10390// testCaseName: "lintable module defined outside libcore",
10391// moduleDirectory: "",
10392// disallowedFlagExpected: true,
10393// },
10394// {
10395// testCaseName: "lintable module defined in libcore root directory",
10396// moduleDirectory: "libcore/",
10397// disallowedFlagExpected: false,
10398// },
10399// {
10400// testCaseName: "lintable module defined in libcore child directory",
10401// moduleDirectory: "libcore/childdir/",
10402// disallowedFlagExpected: true,
10403// },
10404// }
10405//
10406// for _, testCase := range testCases {
10407// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10408// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10409// result := testApex(t, "", lintFileCreator, bpFileCreator)
10410// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10411// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10412// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10413// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10414//
10415// if disallowedFlagActual != testCase.disallowedFlagExpected {
10416// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10417// }
10418// }
10419//}
10420//
10421//// checks transtive deps of an apex coming from bootclasspath_fragment
10422//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10423// bp := `
10424// apex {
10425// name: "myapex",
10426// key: "myapex.key",
10427// bootclasspath_fragments: ["mybootclasspathfragment"],
10428// updatable: true,
10429// min_sdk_version: "29",
10430// }
10431// apex_key {
10432// name: "myapex.key",
10433// }
10434// bootclasspath_fragment {
10435// name: "mybootclasspathfragment",
10436// contents: ["myjavalib"],
10437// apex_available: ["myapex"],
10438// hidden_api: {
10439// split_packages: ["*"],
10440// },
10441// }
10442// java_library {
10443// name: "myjavalib",
10444// srcs: ["MyClass.java"],
10445// apex_available: [ "myapex" ],
10446// sdk_version: "current",
10447// min_sdk_version: "29",
10448// compile_dex: true,
10449// }
10450// `
10451// fs := android.MockFS{
10452// "lint-baseline.xml": nil,
10453// }
10454//
10455// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10456// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10457// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10458// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10459// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10460// }
10461//}
Spandan Das66773252022-01-15 00:23:18 +000010462
Spandan Das42e89502022-05-06 22:12:55 +000010463// updatable apexes should propagate updatable=true to its apps
10464func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10465 bp := `
10466 apex {
10467 name: "myapex",
10468 key: "myapex.key",
10469 updatable: %v,
10470 apps: [
10471 "myapp",
10472 ],
10473 min_sdk_version: "30",
10474 }
10475 apex_key {
10476 name: "myapex.key",
10477 }
10478 android_app {
10479 name: "myapp",
10480 updatable: %v,
10481 apex_available: [
10482 "myapex",
10483 ],
10484 sdk_version: "current",
10485 min_sdk_version: "30",
10486 }
10487 `
10488 testCases := []struct {
10489 name string
10490 apex_is_updatable_bp bool
10491 app_is_updatable_bp bool
10492 app_is_updatable_expected bool
10493 }{
10494 {
10495 name: "Non-updatable apex respects updatable property of non-updatable app",
10496 apex_is_updatable_bp: false,
10497 app_is_updatable_bp: false,
10498 app_is_updatable_expected: false,
10499 },
10500 {
10501 name: "Non-updatable apex respects updatable property of updatable app",
10502 apex_is_updatable_bp: false,
10503 app_is_updatable_bp: true,
10504 app_is_updatable_expected: true,
10505 },
10506 {
10507 name: "Updatable apex respects updatable property of updatable app",
10508 apex_is_updatable_bp: true,
10509 app_is_updatable_bp: true,
10510 app_is_updatable_expected: true,
10511 },
10512 {
10513 name: "Updatable apex sets updatable=true on non-updatable app",
10514 apex_is_updatable_bp: true,
10515 app_is_updatable_bp: false,
10516 app_is_updatable_expected: true,
10517 },
10518 }
10519 for _, testCase := range testCases {
10520 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10521 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10522 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10523 }
10524}
10525
Kiyoung Kim487689e2022-07-26 09:48:22 +090010526func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10527 bp := `
10528 apex {
10529 name: "myapex",
10530 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010531 native_shared_libs: ["libbaz"],
10532 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010533 min_sdk_version: "29",
10534 }
10535 apex_key {
10536 name: "myapex.key",
10537 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010538 cc_binary {
10539 name: "binfoo",
10540 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010541 apex_available: ["myapex"],
10542 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010543 recovery_available: false,
10544 }
10545 cc_library {
10546 name: "libbar",
10547 srcs: ["libbar.cc"],
10548 stubs: {
10549 symbol_file: "libbar.map.txt",
10550 versions: [
10551 "29",
10552 ],
10553 },
10554 }
10555 cc_library {
10556 name: "libbaz",
10557 srcs: ["libbaz.cc"],
10558 apex_available: ["myapex"],
10559 min_sdk_version: "29",
10560 stubs: {
10561 symbol_file: "libbaz.map.txt",
10562 versions: [
10563 "29",
10564 ],
10565 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010566 }
10567 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010568 name: "libbar",
10569 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010570 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010571 variants: ["apex.29"],
10572 }
10573 cc_api_variant {
10574 name: "libbar",
10575 variant: "apex",
10576 version: "29",
10577 src: "libbar_apex_29.so",
10578 }
10579 cc_api_library {
10580 name: "libbaz",
10581 src: "libbaz_stub.so",
10582 min_sdk_version: "29",
10583 variants: ["apex.29"],
10584 }
10585 cc_api_variant {
10586 name: "libbaz",
10587 variant: "apex",
10588 version: "29",
10589 src: "libbaz_apex_29.so",
10590 }
10591 cc_api_library {
10592 name: "libqux",
10593 src: "libqux_stub.so",
10594 min_sdk_version: "29",
10595 variants: ["apex.29"],
10596 }
10597 cc_api_variant {
10598 name: "libqux",
10599 variant: "apex",
10600 version: "29",
10601 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010602 }
10603 api_imports {
10604 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010605 apex_shared_libs: [
10606 "libbar",
10607 "libbaz",
10608 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010609 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010610 }
10611 `
10612 result := testApex(t, bp)
10613
10614 hasDep := func(m android.Module, wantDep android.Module) bool {
10615 t.Helper()
10616 var found bool
10617 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10618 if dep == wantDep {
10619 found = true
10620 }
10621 })
10622 return found
10623 }
10624
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010625 // Library defines stubs and cc_api_library should be used with cc_api_library
10626 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10627 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10628 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010629
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010630 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10631 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010632
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010633 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10634 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10635 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10636 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10637
10638 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10639 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10640 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10641 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10642 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10643
10644 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10645 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10646 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10647
10648 // cc_api_library defined without original library should be linked with cc_api_library
10649 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10650 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10651 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10652}
10653
10654func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10655 bp := `
10656 apex {
10657 name: "myapex",
10658 key: "myapex.key",
10659 native_shared_libs: ["libbar"],
10660 min_sdk_version: "29",
10661 }
10662 apex_key {
10663 name: "myapex.key",
10664 }
10665 cc_binary {
10666 name: "binfoo",
10667 shared_libs: ["libbar"],
10668 recovery_available: false,
10669 }
10670 cc_library {
10671 name: "libbar",
10672 srcs: ["libbar.cc"],
10673 apex_available: ["myapex"],
10674 min_sdk_version: "29",
10675 stubs: {
10676 symbol_file: "libbar.map.txt",
10677 versions: [
10678 "29",
10679 ],
10680 },
10681 }
10682 cc_api_library {
10683 name: "libbar",
10684 src: "libbar_stub.so",
10685 variants: ["apex.29"],
10686 }
10687 cc_api_variant {
10688 name: "libbar",
10689 variant: "apex",
10690 version: "29",
10691 src: "libbar_apex_29.so",
10692 }
10693 api_imports {
10694 name: "api_imports",
10695 apex_shared_libs: [
10696 "libbar",
10697 ],
10698 }
10699 `
10700
10701 result := testApex(t, bp)
10702
10703 hasDep := func(m android.Module, wantDep android.Module) bool {
10704 t.Helper()
10705 var found bool
10706 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10707 if dep == wantDep {
10708 found = true
10709 }
10710 })
10711 return found
10712 }
10713
10714 // Library defines stubs and cc_api_library should be used with cc_api_library
10715 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10716 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10717 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10718
10719 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10720 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10721
10722 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10723 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10724 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10725 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010726}
Dennis Shend4f5d932023-01-31 20:27:21 +000010727
10728func TestTrimmedApex(t *testing.T) {
10729 bp := `
10730 apex {
10731 name: "myapex",
10732 key: "myapex.key",
10733 native_shared_libs: ["libfoo","libbaz"],
10734 min_sdk_version: "29",
10735 trim_against: "mydcla",
10736 }
10737 apex {
10738 name: "mydcla",
10739 key: "myapex.key",
10740 native_shared_libs: ["libfoo","libbar"],
10741 min_sdk_version: "29",
10742 file_contexts: ":myapex-file_contexts",
10743 dynamic_common_lib_apex: true,
10744 }
10745 apex_key {
10746 name: "myapex.key",
10747 }
10748 cc_library {
10749 name: "libfoo",
10750 shared_libs: ["libc"],
10751 apex_available: ["myapex","mydcla"],
10752 min_sdk_version: "29",
10753 }
10754 cc_library {
10755 name: "libbar",
10756 shared_libs: ["libc"],
10757 apex_available: ["myapex","mydcla"],
10758 min_sdk_version: "29",
10759 }
10760 cc_library {
10761 name: "libbaz",
10762 shared_libs: ["libc"],
10763 apex_available: ["myapex","mydcla"],
10764 min_sdk_version: "29",
10765 }
10766 cc_api_library {
10767 name: "libc",
10768 src: "libc.so",
10769 min_sdk_version: "29",
10770 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010771 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010772 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010773 }
10774 api_imports {
10775 name: "api_imports",
10776 shared_libs: [
10777 "libc",
10778 ],
10779 header_libs: [],
10780 }
10781 `
10782 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010783 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010784 apexRule := module.MaybeRule("apexRule")
10785 if apexRule.Rule == nil {
10786 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10787 }
10788
10789 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010790 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010791 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10792 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10793 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10794 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10795}
Jingwen Chendea7a642023-03-28 11:30:50 +000010796
10797func TestCannedFsConfig(t *testing.T) {
10798 ctx := testApex(t, `
10799 apex {
10800 name: "myapex",
10801 key: "myapex.key",
10802 updatable: false,
10803 }
10804
10805 apex_key {
10806 name: "myapex.key",
10807 public_key: "testkey.avbpubkey",
10808 private_key: "testkey.pem",
10809 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010810 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010811 generateFsRule := mod.Rule("generateFsConfig")
10812 cmd := generateFsRule.RuleParams.Command
10813
10814 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10815}
10816
10817func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10818 ctx := testApex(t, `
10819 apex {
10820 name: "myapex",
10821 key: "myapex.key",
10822 canned_fs_config: "my_config",
10823 updatable: false,
10824 }
10825
10826 apex_key {
10827 name: "myapex.key",
10828 public_key: "testkey.avbpubkey",
10829 private_key: "testkey.pem",
10830 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010831 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010832 generateFsRule := mod.Rule("generateFsConfig")
10833 cmd := generateFsRule.RuleParams.Command
10834
10835 // Ensure that canned_fs_config has "cat my_config" at the end
10836 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10837}
Spandan Das20fce2d2023-04-12 17:21:39 +000010838
10839func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10840 testCases := []struct {
10841 desc string
10842 hasStubs bool
10843 apexAvailable string
10844 expectedError string
10845 }{
10846 {
10847 desc: "non-stub library can have multiple apex_available",
10848 hasStubs: false,
10849 apexAvailable: `["myapex", "otherapex"]`,
10850 },
10851 {
10852 desc: "stub library should not be available to anyapex",
10853 hasStubs: true,
10854 apexAvailable: `["//apex_available:anyapex"]`,
10855 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10856 },
10857 {
10858 desc: "stub library should not be available to multiple apexes",
10859 hasStubs: true,
10860 apexAvailable: `["myapex", "otherapex"]`,
10861 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10862 },
10863 {
10864 desc: "stub library can be available to a core apex and a test apex",
10865 hasStubs: true,
10866 apexAvailable: `["myapex", "test_myapex"]`,
10867 },
10868 }
10869 bpTemplate := `
10870 cc_library {
10871 name: "libfoo",
10872 %v
10873 apex_available: %v,
10874 }
10875 apex {
10876 name: "myapex",
10877 key: "apex.key",
10878 updatable: false,
10879 native_shared_libs: ["libfoo"],
10880 }
10881 apex {
10882 name: "otherapex",
10883 key: "apex.key",
10884 updatable: false,
10885 }
10886 apex_test {
10887 name: "test_myapex",
10888 key: "apex.key",
10889 updatable: false,
10890 native_shared_libs: ["libfoo"],
10891 }
10892 apex_key {
10893 name: "apex.key",
10894 }
10895 `
10896 for _, tc := range testCases {
10897 stubs := ""
10898 if tc.hasStubs {
10899 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10900 }
10901 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10902 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10903 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10904 })
10905 if tc.expectedError == "" {
10906 testApex(t, bp, mockFsFixturePreparer)
10907 } else {
10908 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10909 }
10910 }
10911}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010912
10913func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10914 context := android.GroupFixturePreparers(
10915 android.PrepareForIntegrationTestWithAndroid,
10916 cc.PrepareForIntegrationTestWithCc,
10917 PrepareForTestWithApexBuildComponents,
10918 prepareForTestWithMyapex,
10919 filesystem.PrepareForTestWithFilesystemBuildComponents,
10920 )
10921 result := context.RunTestWithBp(t, `
10922 android_system_image {
10923 name: "myfilesystem",
10924 deps: [
10925 "libfoo",
10926 ],
10927 linker_config_src: "linker.config.json",
10928 }
10929
10930 cc_library {
10931 name: "libfoo",
10932 shared_libs: [
10933 "libbar",
10934 ],
10935 stl: "none",
10936 }
10937
10938 cc_library {
10939 name: "libbar",
10940 stl: "none",
10941 apex_available: ["myapex"],
10942 }
10943
10944 apex {
10945 name: "myapex",
10946 native_shared_libs: ["libbar"],
10947 key: "myapex.key",
10948 updatable: false,
10949 }
10950
10951 apex_key {
10952 name: "myapex.key",
10953 public_key: "testkey.avbpubkey",
10954 private_key: "testkey.pem",
10955 }
10956 `)
10957
10958 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10959 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10960 inputs.Strings(),
10961 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10962}
Yu Liueae7b362023-11-16 17:05:47 -080010963
10964var apex_default_bp = `
10965 apex_key {
10966 name: "myapex.key",
10967 public_key: "testkey.avbpubkey",
10968 private_key: "testkey.pem",
10969 }
10970
10971 filegroup {
10972 name: "myapex.manifest",
10973 srcs: ["apex_manifest.json"],
10974 }
10975
10976 filegroup {
10977 name: "myapex.androidmanifest",
10978 srcs: ["AndroidManifest.xml"],
10979 }
10980`
10981
10982func TestAconfigFilesJavaDeps(t *testing.T) {
10983 ctx := testApex(t, apex_default_bp+`
10984 apex {
10985 name: "myapex",
10986 manifest: ":myapex.manifest",
10987 androidManifest: ":myapex.androidmanifest",
10988 key: "myapex.key",
10989 java_libs: [
10990 "my_java_library_foo",
10991 "my_java_library_bar",
10992 ],
10993 updatable: false,
10994 }
10995
10996 java_library {
10997 name: "my_java_library_foo",
10998 srcs: ["foo/bar/MyClass.java"],
10999 sdk_version: "none",
11000 system_modules: "none",
11001 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011002 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011003 "myapex",
11004 ],
11005 }
11006
11007 java_library {
11008 name: "my_java_library_bar",
11009 srcs: ["foo/bar/MyClass.java"],
11010 sdk_version: "none",
11011 system_modules: "none",
11012 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011013 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011014 "myapex",
11015 ],
11016 }
11017
11018 aconfig_declarations {
11019 name: "my_aconfig_declarations_foo",
11020 package: "com.example.package",
11021 container: "myapex",
11022 srcs: ["foo.aconfig"],
11023 }
11024
11025 java_aconfig_library {
11026 name: "my_java_aconfig_library_foo",
11027 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011028 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011029 "myapex",
11030 ],
11031 }
11032
11033 aconfig_declarations {
11034 name: "my_aconfig_declarations_bar",
11035 package: "com.example.package",
11036 container: "myapex",
11037 srcs: ["bar.aconfig"],
11038 }
11039
11040 java_aconfig_library {
11041 name: "my_java_aconfig_library_bar",
11042 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011043 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011044 "myapex",
11045 ],
11046 }
11047 `)
11048
11049 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11050 s := mod.Rule("apexRule").Args["copy_commands"]
11051 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11052 if len(copyCmds) != 5 {
11053 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11054 }
11055
11056 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11057
11058 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11059 s = " " + combineAconfigRule.Args["cache_files"]
11060 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11061 if len(aconfigArgs) != 2 {
11062 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11063 }
11064 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11065 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11066
11067 buildParams := combineAconfigRule.BuildParams
11068 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11069 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11070 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11071}
11072
11073func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11074 ctx := testApex(t, apex_default_bp+`
11075 apex {
11076 name: "myapex",
11077 manifest: ":myapex.manifest",
11078 androidManifest: ":myapex.androidmanifest",
11079 key: "myapex.key",
11080 java_libs: [
11081 "my_java_library_foo",
11082 ],
11083 native_shared_libs: [
11084 "my_cc_library_bar",
11085 ],
11086 binaries: [
11087 "my_cc_binary_baz",
11088 ],
11089 updatable: false,
11090 }
11091
11092 java_library {
11093 name: "my_java_library_foo",
11094 srcs: ["foo/bar/MyClass.java"],
11095 sdk_version: "none",
11096 system_modules: "none",
11097 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011098 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011099 "myapex",
11100 ],
11101 }
11102
11103 cc_library {
11104 name: "my_cc_library_bar",
11105 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011106 static_libs: [
11107 "my_cc_aconfig_library_bar",
11108 "my_cc_aconfig_library_baz",
11109 ],
Yu Liueae7b362023-11-16 17:05:47 -080011110 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011111 "myapex",
11112 ],
11113 }
11114
11115 cc_binary {
11116 name: "my_cc_binary_baz",
11117 srcs: ["foo/bar/MyClass.cc"],
11118 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011119 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011120 "myapex",
11121 ],
11122 }
11123
11124 aconfig_declarations {
11125 name: "my_aconfig_declarations_foo",
11126 package: "com.example.package",
11127 container: "myapex",
11128 srcs: ["foo.aconfig"],
11129 }
11130
11131 java_aconfig_library {
11132 name: "my_java_aconfig_library_foo",
11133 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011134 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011135 "myapex",
11136 ],
11137 }
11138
11139 aconfig_declarations {
11140 name: "my_aconfig_declarations_bar",
11141 package: "com.example.package",
11142 container: "myapex",
11143 srcs: ["bar.aconfig"],
11144 }
11145
11146 cc_aconfig_library {
11147 name: "my_cc_aconfig_library_bar",
11148 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011149 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011150 "myapex",
11151 ],
11152 }
11153
11154 aconfig_declarations {
11155 name: "my_aconfig_declarations_baz",
11156 package: "com.example.package",
11157 container: "myapex",
11158 srcs: ["baz.aconfig"],
11159 }
11160
11161 cc_aconfig_library {
11162 name: "my_cc_aconfig_library_baz",
11163 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011164 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011165 "myapex",
11166 ],
11167 }
11168
11169 cc_library {
11170 name: "server_configurable_flags",
11171 srcs: ["server_configurable_flags.cc"],
11172 }
11173 `)
11174
11175 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11176 s := mod.Rule("apexRule").Args["copy_commands"]
11177 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11178 if len(copyCmds) != 9 {
11179 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11180 }
11181
11182 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11183
11184 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11185 s = " " + combineAconfigRule.Args["cache_files"]
11186 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11187 if len(aconfigArgs) != 3 {
11188 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11189 }
11190 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011191 android.EnsureListContainsSuffix(t, aconfigArgs, "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011192 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11193
11194 buildParams := combineAconfigRule.BuildParams
11195 if len(buildParams.Inputs) != 3 {
11196 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11197 }
11198 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011199 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011200 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11201 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11202}
11203
Yu Liucec0e412023-11-30 16:45:50 -080011204func TestAconfigFilesRustDeps(t *testing.T) {
11205 ctx := testApex(t, apex_default_bp+`
11206 apex {
11207 name: "myapex",
11208 manifest: ":myapex.manifest",
11209 androidManifest: ":myapex.androidmanifest",
11210 key: "myapex.key",
11211 native_shared_libs: [
11212 "libmy_rust_library",
11213 ],
11214 binaries: [
11215 "my_rust_binary",
11216 ],
11217 rust_dyn_libs: [
11218 "libmy_rust_dylib",
11219 ],
11220 updatable: false,
11221 }
11222
11223 rust_library {
11224 name: "libflags_rust", // test mock
11225 crate_name: "flags_rust",
11226 srcs: ["lib.rs"],
11227 apex_available: [
11228 "myapex",
11229 ],
11230 }
11231
11232 rust_library {
11233 name: "liblazy_static", // test mock
11234 crate_name: "lazy_static",
11235 srcs: ["src/lib.rs"],
11236 apex_available: [
11237 "myapex",
11238 ],
11239 }
11240
11241 rust_ffi_shared {
11242 name: "libmy_rust_library",
11243 srcs: ["src/lib.rs"],
11244 rustlibs: ["libmy_rust_aconfig_library_foo"],
11245 crate_name: "my_rust_library",
11246 apex_available: [
11247 "myapex",
11248 ],
11249 }
11250
11251 rust_library_dylib {
11252 name: "libmy_rust_dylib",
11253 srcs: ["foo/bar/MyClass.rs"],
11254 rustlibs: ["libmy_rust_aconfig_library_bar"],
11255 crate_name: "my_rust_dylib",
11256 apex_available: [
11257 "myapex",
11258 ],
11259 }
11260
11261 rust_binary {
11262 name: "my_rust_binary",
11263 srcs: ["foo/bar/MyClass.rs"],
11264 rustlibs: [
11265 "libmy_rust_aconfig_library_baz",
11266 "libmy_rust_dylib",
11267 ],
11268 apex_available: [
11269 "myapex",
11270 ],
11271 }
11272
11273 aconfig_declarations {
11274 name: "my_aconfig_declarations_foo",
11275 package: "com.example.package",
11276 container: "myapex",
11277 srcs: ["foo.aconfig"],
11278 }
11279
11280 aconfig_declarations {
11281 name: "my_aconfig_declarations_bar",
11282 package: "com.example.package",
11283 container: "myapex",
11284 srcs: ["bar.aconfig"],
11285 }
11286
11287 aconfig_declarations {
11288 name: "my_aconfig_declarations_baz",
11289 package: "com.example.package",
11290 container: "myapex",
11291 srcs: ["baz.aconfig"],
11292 }
11293
11294 rust_aconfig_library {
11295 name: "libmy_rust_aconfig_library_foo",
11296 aconfig_declarations: "my_aconfig_declarations_foo",
11297 crate_name: "my_rust_aconfig_library_foo",
11298 apex_available: [
11299 "myapex",
11300 ],
11301 }
11302
11303 rust_aconfig_library {
11304 name: "libmy_rust_aconfig_library_bar",
11305 aconfig_declarations: "my_aconfig_declarations_bar",
11306 crate_name: "my_rust_aconfig_library_bar",
11307 apex_available: [
11308 "myapex",
11309 ],
11310 }
11311
11312 rust_aconfig_library {
11313 name: "libmy_rust_aconfig_library_baz",
11314 aconfig_declarations: "my_aconfig_declarations_baz",
11315 crate_name: "my_rust_aconfig_library_baz",
11316 apex_available: [
11317 "myapex",
11318 ],
11319 }
11320 `)
11321
11322 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11323 s := mod.Rule("apexRule").Args["copy_commands"]
11324 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11325 if len(copyCmds) != 23 {
11326 t.Fatalf("Expected 23 commands, got %d in:\n%s", len(copyCmds), s)
11327 }
11328
11329 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11330
11331 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11332 s = " " + combineAconfigRule.Args["cache_files"]
11333 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11334 if len(aconfigArgs) != 2 {
11335 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11336 }
11337 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011338 android.EnsureListContainsSuffix(t, aconfigArgs, "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011339
11340 buildParams := combineAconfigRule.BuildParams
11341 if len(buildParams.Inputs) != 2 {
11342 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11343 }
11344 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011345 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011346 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11347}
11348
Yu Liueae7b362023-11-16 17:05:47 -080011349func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11350 ctx := testApex(t, apex_default_bp+`
11351 apex {
11352 name: "myapex",
11353 manifest: ":myapex.manifest",
11354 androidManifest: ":myapex.androidmanifest",
11355 key: "myapex.key",
11356 java_libs: [
11357 "my_java_library_foo",
11358 "other_java_library_bar",
11359 ],
11360 updatable: false,
11361 }
11362
11363 java_library {
11364 name: "my_java_library_foo",
11365 srcs: ["foo/bar/MyClass.java"],
11366 sdk_version: "none",
11367 system_modules: "none",
11368 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011369 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011370 "myapex",
11371 ],
11372 }
11373
11374 java_library {
11375 name: "other_java_library_bar",
11376 srcs: ["foo/bar/MyClass.java"],
11377 sdk_version: "none",
11378 system_modules: "none",
11379 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011380 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011381 "myapex",
11382 ],
11383 }
11384
11385 aconfig_declarations {
11386 name: "my_aconfig_declarations_foo",
11387 package: "com.example.package",
11388 container: "myapex",
11389 srcs: ["foo.aconfig"],
11390 }
11391
11392 java_aconfig_library {
11393 name: "my_java_aconfig_library_foo",
11394 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011395 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011396 "myapex",
11397 ],
11398 }
11399
11400 aconfig_declarations {
11401 name: "other_aconfig_declarations_bar",
11402 package: "com.example.package",
11403 container: "otherapex",
11404 srcs: ["bar.aconfig"],
11405 }
11406
11407 java_aconfig_library {
11408 name: "other_java_aconfig_library_bar",
11409 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011410 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011411 "myapex",
11412 ],
11413 }
11414 `)
11415
11416 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11417 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11418 s := " " + combineAconfigRule.Args["cache_files"]
11419 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11420 if len(aconfigArgs) != 1 {
11421 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11422 }
11423 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11424
11425 buildParams := combineAconfigRule.BuildParams
11426 if len(buildParams.Inputs) != 1 {
11427 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11428 }
11429 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11430 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11431}
11432
11433func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11434 ctx := testApex(t, apex_default_bp+`
11435 apex {
11436 name: "myapex",
11437 manifest: ":myapex.manifest",
11438 androidManifest: ":myapex.androidmanifest",
11439 key: "myapex.key",
11440 java_libs: [
11441 "my_java_library_foo",
11442 "my_java_library_bar",
11443 ],
11444 updatable: false,
11445 }
11446
11447 java_library {
11448 name: "my_java_library_foo",
11449 srcs: ["foo/bar/MyClass.java"],
11450 sdk_version: "none",
11451 system_modules: "none",
11452 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011453 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011454 "myapex",
11455 ],
11456 }
11457
11458 java_library {
11459 name: "my_java_library_bar",
11460 srcs: ["foo/bar/MyClass.java"],
11461 sdk_version: "none",
11462 system_modules: "none",
11463 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011464 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011465 "myapex",
11466 ],
11467 }
11468
11469 aconfig_declarations {
11470 name: "my_aconfig_declarations_foo",
11471 package: "com.example.package",
11472 container: "myapex",
11473 srcs: ["foo.aconfig"],
11474 }
11475
11476 java_aconfig_library {
11477 name: "my_java_aconfig_library_foo",
11478 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011479 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011480 "myapex",
11481 ],
11482 }
11483
11484 java_aconfig_library {
11485 name: "my_java_aconfig_library_bar",
11486 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011487 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011488 "myapex",
11489 ],
11490 }
11491 `)
11492
11493 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11494 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11495 s := " " + combineAconfigRule.Args["cache_files"]
11496 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11497 if len(aconfigArgs) != 1 {
11498 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11499 }
11500 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11501
11502 buildParams := combineAconfigRule.BuildParams
11503 if len(buildParams.Inputs) != 1 {
11504 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11505 }
11506 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11507 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11508}
Spandan Das5be63332023-12-13 00:06:32 +000011509
11510// Test that the boot jars come from the _selected_ apex prebuilt
11511// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11512func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11513 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11514 t.Helper()
11515 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11516 foundLibfooJar := false
11517 base := stem + ".jar"
11518 for _, output := range s.AllOutputs() {
11519 if filepath.Base(output) == base {
11520 foundLibfooJar = true
11521 buildRule := s.Output(output)
11522 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11523 }
11524 }
11525 if !foundLibfooJar {
11526 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11527 }
11528 }
11529
Spandan Das64c9e0c2023-12-20 20:13:34 +000011530 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11531 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11532 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11533 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11534 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11535 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)
11536 }
11537
11538 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11539 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11540 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11541 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11542 }
11543
Spandan Das5be63332023-12-13 00:06:32 +000011544 bp := `
11545 // Source APEX.
11546
11547 java_library {
11548 name: "framework-foo",
11549 srcs: ["foo.java"],
11550 installable: true,
11551 apex_available: [
11552 "com.android.foo",
11553 ],
11554 }
11555
11556 bootclasspath_fragment {
11557 name: "foo-bootclasspath-fragment",
11558 contents: ["framework-foo"],
11559 apex_available: [
11560 "com.android.foo",
11561 ],
11562 hidden_api: {
11563 split_packages: ["*"],
11564 },
11565 }
11566
11567 apex_key {
11568 name: "com.android.foo.key",
11569 public_key: "com.android.foo.avbpubkey",
11570 private_key: "com.android.foo.pem",
11571 }
11572
11573 apex {
11574 name: "com.android.foo",
11575 key: "com.android.foo.key",
11576 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11577 updatable: false,
11578 }
11579
11580 // Prebuilt APEX.
11581
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011582 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011583 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011584 public: {
11585 jars: ["foo.jar"],
11586 },
Spandan Das5be63332023-12-13 00:06:32 +000011587 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011588 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011589 }
11590
11591 prebuilt_bootclasspath_fragment {
11592 name: "foo-bootclasspath-fragment",
11593 contents: ["framework-foo"],
11594 hidden_api: {
11595 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11596 metadata: "my-bootclasspath-fragment/metadata.csv",
11597 index: "my-bootclasspath-fragment/index.csv",
11598 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11599 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11600 },
11601 apex_available: [
11602 "com.android.foo",
11603 ],
11604 }
11605
11606 prebuilt_apex {
11607 name: "com.android.foo",
11608 apex_name: "com.android.foo",
11609 src: "com.android.foo-arm.apex",
11610 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11611 }
11612
11613 // Another Prebuilt ART APEX
11614 prebuilt_apex {
11615 name: "com.android.foo.v2",
11616 apex_name: "com.android.foo", // Used to determine the API domain
11617 src: "com.android.foo-arm.apex",
11618 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11619 }
11620
11621 // APEX contribution modules
11622
11623 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011624 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011625 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011626 contents: ["com.android.foo"],
11627 }
11628
11629 apex_contributions {
11630 name: "foo.prebuilt.contributions",
11631 api_domain: "com.android.foo",
11632 contents: ["prebuilt_com.android.foo"],
11633 }
11634
11635 apex_contributions {
11636 name: "foo.prebuilt.v2.contributions",
11637 api_domain: "com.android.foo",
11638 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011639 }
11640 `
11641
11642 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011643 desc string
11644 selectedApexContributions string
11645 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011646 }{
11647 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011648 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11649 selectedApexContributions: "foo.source.contributions",
11650 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011651 },
11652 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011653 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11654 selectedApexContributions: "foo.prebuilt.contributions",
11655 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011656 },
11657 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011658 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11659 selectedApexContributions: "foo.prebuilt.v2.contributions",
11660 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011661 },
11662 }
11663
11664 fragment := java.ApexVariantReference{
11665 Apex: proptools.StringPtr("com.android.foo"),
11666 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11667 }
11668
11669 for _, tc := range testCases {
11670 preparer := android.GroupFixturePreparers(
11671 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11672 android.FixtureMergeMockFs(map[string][]byte{
11673 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11674 }),
11675 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11676 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011677 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011678 }
11679 }),
11680 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011681 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011682 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011683 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11684 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011685 }
11686}
Spandan Das3576e762024-01-03 18:57:03 +000011687
11688// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11689// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11690func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11691 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11692 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11693 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11694 // Variations are created based on apex_name
11695 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11696 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11697 }
11698 // for a mainline module family, check that only the flagged soong module is visible to make
11699 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11700 variation := func(moduleName string) string {
11701 ret := "android_common_com.android.foo"
11702 if moduleName == "com.google.android.foo" {
11703 ret = "android_common_com.google.android.foo_com.android.foo"
11704 }
11705 return ret
11706 }
11707
11708 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11709 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11710
11711 for _, hiddenModuleName := range hiddenModuleNames {
11712 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11713 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11714
11715 }
11716 }
11717
11718 bp := `
11719 apex_key {
11720 name: "com.android.foo.key",
11721 public_key: "com.android.foo.avbpubkey",
11722 private_key: "com.android.foo.pem",
11723 }
11724
11725 // AOSP source apex
11726 apex {
11727 name: "com.android.foo",
11728 key: "com.android.foo.key",
11729 updatable: false,
11730 }
11731
11732 // Google source apex
11733 override_apex {
11734 name: "com.google.android.foo",
11735 base: "com.android.foo",
11736 key: "com.android.foo.key",
11737 }
11738
11739 // Prebuilt Google APEX.
11740
11741 prebuilt_apex {
11742 name: "com.google.android.foo",
11743 apex_name: "com.android.foo",
11744 src: "com.android.foo-arm.apex",
11745 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11746 }
11747
11748 // Another Prebuilt Google APEX
11749 prebuilt_apex {
11750 name: "com.google.android.foo.v2",
11751 apex_name: "com.android.foo",
11752 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11753 src: "com.android.foo-arm.apex",
11754 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11755 }
11756
11757 // APEX contribution modules
11758
11759 apex_contributions {
11760 name: "foo.source.contributions",
11761 api_domain: "com.android.foo",
11762 contents: ["com.google.android.foo"],
11763 }
11764
11765 apex_contributions {
11766 name: "foo.prebuilt.contributions",
11767 api_domain: "com.android.foo",
11768 contents: ["prebuilt_com.google.android.foo"],
11769 }
11770
11771 apex_contributions {
11772 name: "foo.prebuilt.v2.contributions",
11773 api_domain: "com.android.foo",
11774 contents: ["prebuilt_com.google.android.foo.v2"],
11775 }
11776
11777 // This is an incompatible module because it selects multiple versions of the same mainline module
11778 apex_contributions {
11779 name: "foo.prebuilt.duplicate.contributions",
11780 api_domain: "com.android.foo",
11781 contents: [
11782 "prebuilt_com.google.android.foo",
11783 "prebuilt_com.google.android.foo.v2",
11784 ],
11785 }
11786 `
11787
11788 testCases := []struct {
11789 desc string
11790 selectedApexContributions string
11791 expectedVisibleModuleName string
11792 expectedHiddenModuleNames []string
11793 expectedError string
11794 }{
11795 {
11796 desc: "Source apex is selected, prebuilts should be hidden from make",
11797 selectedApexContributions: "foo.source.contributions",
11798 expectedVisibleModuleName: "com.google.android.foo",
11799 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11800 },
11801 {
11802 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11803 selectedApexContributions: "foo.prebuilt.contributions",
11804 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11805 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11806 },
11807 {
11808 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11809 selectedApexContributions: "foo.prebuilt.v2.contributions",
11810 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11811 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11812 },
11813 {
11814 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11815 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11816 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11817 },
11818 }
11819
11820 for _, tc := range testCases {
11821 preparer := android.GroupFixturePreparers(
11822 android.FixtureMergeMockFs(map[string][]byte{
11823 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11824 }),
11825 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11826 variables.BuildFlags = map[string]string{
11827 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11828 }
11829 }),
11830 )
11831 if tc.expectedError != "" {
11832 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11833 testApex(t, bp, preparer)
11834 return
11835 }
11836 ctx := testApex(t, bp, preparer)
11837
11838 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11839 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11840 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11841 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11842
11843 // Check that
11844 // 1. The contents of the selected apex_contributions are visible to make
11845 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11846 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11847 }
11848}