blob: 97b9c84f0f84e2a11ece3f52494c30058253a1ea [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
221 variables.DeviceVndkVersion = proptools.StringPtr("current")
222 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
223 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
224 variables.Platform_sdk_codename = proptools.StringPtr("Q")
225 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000226 // "Tiramisu" needs to be in the next line for compatibility with soong code,
227 // not because of these tests specifically (it's not used by the tests)
228 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900229 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000230 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000231 }),
232)
233
Paul Duffin52bfaa42021-03-23 23:40:12 +0000234var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
235 "system/sepolicy/apex/myapex-file_contexts": nil,
236})
237
Jooyung Han643adc42020-02-27 13:50:06 +0900238// ensure that 'result' equals 'expected'
239func ensureEquals(t *testing.T, result string, expected string) {
240 t.Helper()
241 if result != expected {
242 t.Errorf("%q != %q", expected, result)
243 }
244}
245
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246// ensure that 'result' contains 'expected'
247func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900248 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if !strings.Contains(result, expected) {
250 t.Errorf("%q is not found in %q", expected, result)
251 }
252}
253
Liz Kammer5bd365f2020-05-27 15:15:11 -0700254// ensure that 'result' contains 'expected' exactly one time
255func ensureContainsOnce(t *testing.T, result string, expected string) {
256 t.Helper()
257 count := strings.Count(result, expected)
258 if count != 1 {
259 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
260 }
261}
262
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263// ensures that 'result' does not contain 'notExpected'
264func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900265 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266 if strings.Contains(result, notExpected) {
267 t.Errorf("%q is found in %q", notExpected, result)
268 }
269}
270
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271func ensureMatches(t *testing.T, result string, expectedRex string) {
272 ok, err := regexp.MatchString(expectedRex, result)
273 if err != nil {
274 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
275 return
276 }
277 if !ok {
278 t.Errorf("%s does not match regular expession %s", result, expectedRex)
279 }
280}
281
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900283 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284 if !android.InList(expected, result) {
285 t.Errorf("%q is not found in %v", expected, result)
286 }
287}
288
289func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if android.InList(notExpected, result) {
292 t.Errorf("%q is found in %v", notExpected, result)
293 }
294}
295
Jooyung Hane1633032019-08-01 17:41:43 +0900296func ensureListEmpty(t *testing.T, result []string) {
297 t.Helper()
298 if len(result) > 0 {
299 t.Errorf("%q is expected to be empty", result)
300 }
301}
302
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000303func ensureListNotEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) == 0 {
306 t.Errorf("%q is expected to be not empty", result)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310// Minimal test
311func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800312 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900313 apex_defaults {
314 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900315 manifest: ":myapex.manifest",
316 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900318 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900319 native_shared_libs: [
320 "mylib",
321 "libfoo.ffi",
322 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900323 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800324 multilib: {
325 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900326 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800327 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900328 },
Jiyong Park77acec62020-06-01 21:39:15 +0900329 java_libs: [
330 "myjar",
331 "myjar_dex",
332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000333 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 shared_libs: [
361 "mylib2",
362 "libbar.ffi",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 system_shared_libs: [],
365 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000366 // TODO: remove //apex_available:platform
367 apex_available: [
368 "//apex_available:platform",
369 "myapex",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 }
372
Alex Light3d673592019-01-18 14:37:31 -0800373 cc_binary {
374 name: "foo",
375 srcs: ["mylib.cpp"],
376 compile_multilib: "both",
377 multilib: {
378 lib32: {
379 suffix: "32",
380 },
381 lib64: {
382 suffix: "64",
383 },
384 },
385 symlinks: ["foo_link_"],
386 symlink_preferred_arch: true,
387 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800388 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700389 apex_available: [ "myapex", "com.android.gki.*" ],
390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400396 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900405 shared_libs: ["libfoo.shared_from_rust"],
406 }
407
408 cc_library_shared {
409 name: "libfoo.shared_from_rust",
410 srcs: ["mylib.cpp"],
411 system_shared_libs: [],
412 stl: "none",
413 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900414 }
415
416 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000417 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900423 rust_ffi_shared {
424 name: "libfoo.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
430 rust_ffi_shared {
431 name: "libbar.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "bar",
434 apex_available: ["myapex"],
435 }
436
Yifan Hongd22a84a2020-07-28 17:37:46 -0700437 apex {
438 name: "com.android.gki.fake",
439 binaries: ["foo"],
440 key: "myapex.key",
441 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000442 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800443 }
444
Paul Duffindddd5462020-04-07 15:25:44 +0100445 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900446 name: "mylib2",
447 srcs: ["mylib.cpp"],
448 system_shared_libs: [],
449 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900450 static_libs: ["libstatic"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Paul Duffindddd5462020-04-07 15:25:44 +0100458 cc_prebuilt_library_shared {
459 name: "mylib2",
460 srcs: ["prebuilt.so"],
461 // TODO: remove //apex_available:platform
462 apex_available: [
463 "//apex_available:platform",
464 "myapex",
465 ],
466 }
467
Jiyong Park9918e1a2020-03-17 19:16:40 +0900468 cc_library_static {
469 name: "libstatic",
470 srcs: ["mylib.cpp"],
471 system_shared_libs: [],
472 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479
480 java_library {
481 name: "myjar",
482 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900483 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 sdk_version: "none",
485 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900487 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900493 }
494
Jiyong Park77acec62020-06-01 21:39:15 +0900495 dex_import {
496 name: "myjar_dex",
497 jars: ["prebuilt.jar"],
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
502 }
503
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 java_library {
505 name: "myotherjar",
506 srcs: ["foo/bar/MyClass.java"],
507 sdk_version: "none",
508 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900509 // TODO: remove //apex_available:platform
510 apex_available: [
511 "//apex_available:platform",
512 "myapex",
513 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900515
516 java_library {
517 name: "mysharedjar",
518 srcs: ["foo/bar/MyClass.java"],
519 sdk_version: "none",
520 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900521 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900522 `)
523
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900525
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900527 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700528 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900529 var builder strings.Builder
530 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
531
532 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000533 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
535
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536 optFlags := apexRule.Args["opt_flags"]
537 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700538 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900539 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900540
Jiyong Park25fc6a92018-11-18 18:02:45 +0900541 copyCmds := apexRule.Args["copy_commands"]
542
543 // Ensure that main rule creates an output
544 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
545
546 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700554 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560
561 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900565 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
568 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900569 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 // .. but not for java libs
571 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800573
Colin Cross7113d202019-11-20 16:39:12 -0800574 // Ensure that the platform variant ends with _shared or _common
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
576 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
578 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
580
581 // Ensure that dynamic dependency to java libs are not included
582 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800583
584 // Ensure that all symlinks are present.
585 found_foo_link_64 := false
586 found_foo := false
587 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900588 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800589 if strings.HasSuffix(cmd, "bin/foo") {
590 found_foo = true
591 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
592 found_foo_link_64 = true
593 }
594 }
595 }
596 good := found_foo && found_foo_link_64
597 if !good {
598 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
599 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900600
Colin Crossf61d03d2023-11-02 16:56:39 -0700601 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
602 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
605 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
606 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800626 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800680 name: "netdTest",
681 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900686 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000690 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800694 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
Jooyung Hana0503a52023-08-23 13:12:50 +0900713 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Jihoon Kang842b9992024-02-08 01:41:51 +0000793func TestApexWithDessertSha(t *testing.T) {
794 ctx := testApex(t, `
795 apex_defaults {
796 name: "my_defaults",
797 key: "myapex.key",
798 product_specific: true,
799 file_contexts: ":my-file-contexts",
800 updatable: false,
801 }
802 apex {
803 name: "myapex_30",
804 min_sdk_version: "30",
805 defaults: ["my_defaults"],
806 }
807
808 apex {
809 name: "myapex_current",
810 min_sdk_version: "current",
811 defaults: ["my_defaults"],
812 }
813
814 apex {
815 name: "myapex_none",
816 defaults: ["my_defaults"],
817 }
818
819 apex_key {
820 name: "myapex.key",
821 public_key: "testkey.avbpubkey",
822 private_key: "testkey.pem",
823 }
824
825 filegroup {
826 name: "my-file-contexts",
827 srcs: ["product_specific_file_contexts"],
828 }
829 `, withFiles(map[string][]byte{
830 "product_specific_file_contexts": nil,
831 }), android.FixtureModifyProductVariables(
832 func(variables android.FixtureProductVariables) {
833 variables.Unbundled_build = proptools.BoolPtr(true)
834 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
835 }), android.FixtureMergeEnv(map[string]string{
836 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
837 }))
838
839 testCases := []struct {
840 module string
841 minSdkVersion string
842 }{
843 {
844 module: "myapex_30",
845 minSdkVersion: "30",
846 },
847 {
848 module: "myapex_current",
849 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 },
851 {
852 module: "myapex_none",
853 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
854 },
855 }
856 for _, tc := range testCases {
857 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
858 args := module.Rule("apexRule").Args
859 optFlags := args["opt_flags"]
860 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
861 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
862 }
863 }
864}
865
Jooyung Hanaf730952023-02-28 14:13:38 +0900866func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900867 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900868 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900869 if vendor {
870 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 }
872 ctx := testApex(t, `
873 apex {
874 name: "myapex",
875 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900876 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900877 `+prop+`
878 }
879
880 apex_key {
881 name: "myapex.key",
882 public_key: "testkey.avbpubkey",
883 private_key: "testkey.pem",
884 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900885 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900886
Jooyung Hana0503a52023-08-23 13:12:50 +0900887 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900888 if vendor {
889 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
890 rule.RuleParams.Command,
891 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900892 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900893 android.AssertStringDoesContain(t, "should force-label as system_file",
894 rule.RuleParams.Command,
895 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900896 }
897 }
898}
899
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800901 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900902 apex {
903 name: "myapex",
904 key: "myapex.key",
905 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900906 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000907 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908 }
909
910 apex_key {
911 name: "myapex.key",
912 public_key: "testkey.avbpubkey",
913 private_key: "testkey.pem",
914 }
915
916 cc_library {
917 name: "mylib",
918 srcs: ["mylib.cpp"],
919 shared_libs: ["mylib2", "mylib3"],
920 system_shared_libs: [],
921 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000922 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 }
924
925 cc_library {
926 name: "mylib2",
927 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900928 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 system_shared_libs: [],
930 stl: "none",
931 stubs: {
932 versions: ["1", "2", "3"],
933 },
934 }
935
936 cc_library {
937 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900938 srcs: ["mylib.cpp"],
939 shared_libs: ["mylib4"],
940 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900941 stl: "none",
942 stubs: {
943 versions: ["10", "11", "12"],
944 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000945 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900946 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900947
948 cc_library {
949 name: "mylib4",
950 srcs: ["mylib.cpp"],
951 system_shared_libs: [],
952 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000953 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 }
Jiyong Park105dc322021-06-11 17:22:09 +0900955
956 rust_binary {
957 name: "foo.rust",
958 srcs: ["foo.rs"],
959 shared_libs: ["libfoo.shared_from_rust"],
960 prefer_rlib: true,
961 apex_available: ["myapex"],
962 }
963
964 cc_library_shared {
965 name: "libfoo.shared_from_rust",
966 srcs: ["mylib.cpp"],
967 system_shared_libs: [],
968 stl: "none",
969 stubs: {
970 versions: ["10", "11", "12"],
971 },
972 }
973
Jiyong Park25fc6a92018-11-18 18:02:45 +0900974 `)
975
Jooyung Hana0503a52023-08-23 13:12:50 +0900976 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900977 copyCmds := apexRule.Args["copy_commands"]
978
979 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800980 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900981
982 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800983 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984
985 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800986 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987
Colin Crossaede88c2020-08-11 12:17:01 -0700988 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989
990 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900991 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900993 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900994
995 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700996 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900997 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700998 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900999
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001000 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1001 // is replaced by sharing of "cFlags" in cc/builder.go.
1002 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1003 // module variable representing "cflags". So it was not detected by ensureNotContains.
1004 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1005 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1006 // including the original cflags's "-include mylib.h".
1007 //
Jiyong Park64379952018-12-13 18:37:29 +09001008 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001009 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1010 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001011
Jiyong Park85cc35a2022-07-17 11:30:47 +09001012 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1013 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1014 // Ensure that genstub for apex-provided lib is invoked with --apex
1015 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001016
Jooyung Hana0503a52023-08-23 13:12:50 +09001017 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001018 "lib64/mylib.so",
1019 "lib64/mylib3.so",
1020 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001021 "bin/foo.rust",
1022 "lib64/libc++.so", // by the implicit dependency from foo.rust
1023 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001024 })
Jiyong Park105dc322021-06-11 17:22:09 +09001025
1026 // Ensure that stub dependency from a rust module is not included
1027 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1028 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001029 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001030 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1031 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001032
Jooyung Hana0503a52023-08-23 13:12:50 +09001033 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001034 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001035}
1036
Jooyung Han20348752023-12-05 15:23:56 +09001037func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1038 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1039 apex {
1040 name: "myapex",
1041 key: "myapex.key",
1042 vendor: true,
1043 updatable: false,
1044 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1045 }
1046
1047 apex_key {
1048 name: "myapex.key",
1049 public_key: "testkey.avbpubkey",
1050 private_key: "testkey.pem",
1051 }
1052
1053 cc_library {
1054 name: "libbar",
1055 srcs: ["mylib.cpp"],
1056 llndk: {
1057 symbol_file: "libbar.map.txt",
1058 }
1059 }
1060 `)
1061}
1062
Jiyong Park1bc84122021-06-22 20:23:05 +09001063func TestApexCanUsePrivateApis(t *testing.T) {
1064 ctx := testApex(t, `
1065 apex {
1066 name: "myapex",
1067 key: "myapex.key",
1068 native_shared_libs: ["mylib"],
1069 binaries: ["foo.rust"],
1070 updatable: false,
1071 platform_apis: true,
1072 }
1073
1074 apex_key {
1075 name: "myapex.key",
1076 public_key: "testkey.avbpubkey",
1077 private_key: "testkey.pem",
1078 }
1079
1080 cc_library {
1081 name: "mylib",
1082 srcs: ["mylib.cpp"],
1083 shared_libs: ["mylib2"],
1084 system_shared_libs: [],
1085 stl: "none",
1086 apex_available: [ "myapex" ],
1087 }
1088
1089 cc_library {
1090 name: "mylib2",
1091 srcs: ["mylib.cpp"],
1092 cflags: ["-include mylib.h"],
1093 system_shared_libs: [],
1094 stl: "none",
1095 stubs: {
1096 versions: ["1", "2", "3"],
1097 },
1098 }
1099
1100 rust_binary {
1101 name: "foo.rust",
1102 srcs: ["foo.rs"],
1103 shared_libs: ["libfoo.shared_from_rust"],
1104 prefer_rlib: true,
1105 apex_available: ["myapex"],
1106 }
1107
1108 cc_library_shared {
1109 name: "libfoo.shared_from_rust",
1110 srcs: ["mylib.cpp"],
1111 system_shared_libs: [],
1112 stl: "none",
1113 stubs: {
1114 versions: ["10", "11", "12"],
1115 },
1116 }
1117 `)
1118
Jooyung Hana0503a52023-08-23 13:12:50 +09001119 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001120 copyCmds := apexRule.Args["copy_commands"]
1121
1122 // Ensure that indirect stubs dep is not included
1123 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1124 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1125
1126 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1127 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001128 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001129 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1130 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001131 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001132 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1133 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1134}
1135
Colin Cross7812fd32020-09-25 12:35:10 -07001136func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1137 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001138 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001139 apex {
1140 name: "myapex",
1141 key: "myapex.key",
1142 native_shared_libs: ["mylib", "mylib3"],
1143 min_sdk_version: "29",
1144 }
1145
1146 apex_key {
1147 name: "myapex.key",
1148 public_key: "testkey.avbpubkey",
1149 private_key: "testkey.pem",
1150 }
1151
1152 cc_library {
1153 name: "mylib",
1154 srcs: ["mylib.cpp"],
1155 shared_libs: ["mylib2", "mylib3"],
1156 system_shared_libs: [],
1157 stl: "none",
1158 apex_available: [ "myapex" ],
1159 min_sdk_version: "28",
1160 }
1161
1162 cc_library {
1163 name: "mylib2",
1164 srcs: ["mylib.cpp"],
1165 cflags: ["-include mylib.h"],
1166 system_shared_libs: [],
1167 stl: "none",
1168 stubs: {
1169 versions: ["28", "29", "30", "current"],
1170 },
1171 min_sdk_version: "28",
1172 }
1173
1174 cc_library {
1175 name: "mylib3",
1176 srcs: ["mylib.cpp"],
1177 shared_libs: ["mylib4"],
1178 system_shared_libs: [],
1179 stl: "none",
1180 stubs: {
1181 versions: ["28", "29", "30", "current"],
1182 },
1183 apex_available: [ "myapex" ],
1184 min_sdk_version: "28",
1185 }
1186
1187 cc_library {
1188 name: "mylib4",
1189 srcs: ["mylib.cpp"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 apex_available: [ "myapex" ],
1193 min_sdk_version: "28",
1194 }
1195 `)
1196
Jooyung Hana0503a52023-08-23 13:12:50 +09001197 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001198 copyCmds := apexRule.Args["copy_commands"]
1199
1200 // Ensure that direct non-stubs dep is always included
1201 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1202
1203 // Ensure that indirect stubs dep is not included
1204 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1205
1206 // Ensure that direct stubs dep is included
1207 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1208
1209 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1210
Jiyong Park55549df2021-02-26 23:57:23 +09001211 // Ensure that mylib is linking with the latest version of stub for mylib2
1212 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001213 // ... and not linking to the non-stub (impl) variant of mylib2
1214 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1215
1216 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1217 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1218 // .. and not linking to the stubs variant of mylib3
1219 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1220
1221 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001222 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001223 ensureNotContains(t, mylib2Cflags, "-include ")
1224
Jiyong Park85cc35a2022-07-17 11:30:47 +09001225 // Ensure that genstub is invoked with --systemapi
1226 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001227
Jooyung Hana0503a52023-08-23 13:12:50 +09001228 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001229 "lib64/mylib.so",
1230 "lib64/mylib3.so",
1231 "lib64/mylib4.so",
1232 })
1233}
1234
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001235func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1236 t.Parallel()
1237 // myapex (Z)
1238 // mylib -----------------.
1239 // |
1240 // otherapex (29) |
1241 // libstub's versions: 29 Z current
1242 // |
1243 // <platform> |
1244 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001245 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246 apex {
1247 name: "myapex",
1248 key: "myapex.key",
1249 native_shared_libs: ["mylib"],
1250 min_sdk_version: "Z", // non-final
1251 }
1252
1253 cc_library {
1254 name: "mylib",
1255 srcs: ["mylib.cpp"],
1256 shared_libs: ["libstub"],
1257 apex_available: ["myapex"],
1258 min_sdk_version: "Z",
1259 }
1260
1261 apex_key {
1262 name: "myapex.key",
1263 public_key: "testkey.avbpubkey",
1264 private_key: "testkey.pem",
1265 }
1266
1267 apex {
1268 name: "otherapex",
1269 key: "myapex.key",
1270 native_shared_libs: ["libstub"],
1271 min_sdk_version: "29",
1272 }
1273
1274 cc_library {
1275 name: "libstub",
1276 srcs: ["mylib.cpp"],
1277 stubs: {
1278 versions: ["29", "Z", "current"],
1279 },
1280 apex_available: ["otherapex"],
1281 min_sdk_version: "29",
1282 }
1283
1284 // platform module depending on libstub from otherapex should use the latest stub("current")
1285 cc_library {
1286 name: "libplatform",
1287 srcs: ["mylib.cpp"],
1288 shared_libs: ["libstub"],
1289 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001290 `,
1291 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1292 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1293 variables.Platform_sdk_final = proptools.BoolPtr(false)
1294 variables.Platform_version_active_codenames = []string{"Z"}
1295 }),
1296 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297
Jiyong Park55549df2021-02-26 23:57:23 +09001298 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001300 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001301 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001302 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001303
1304 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1305 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1306 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1307 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1308 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1309}
1310
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001312 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001313 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314 name: "myapex2",
1315 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001317 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001318 }
1319
1320 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001321 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001322 public_key: "testkey.avbpubkey",
1323 private_key: "testkey.pem",
1324 }
1325
1326 cc_library {
1327 name: "mylib",
1328 srcs: ["mylib.cpp"],
1329 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001330 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331 system_shared_libs: [],
1332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001333 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001334 }
1335
1336 cc_library {
1337 name: "libfoo",
1338 srcs: ["mylib.cpp"],
1339 shared_libs: ["libbar"],
1340 system_shared_libs: [],
1341 stl: "none",
1342 stubs: {
1343 versions: ["10", "20", "30"],
1344 },
1345 }
1346
1347 cc_library {
1348 name: "libbar",
1349 srcs: ["mylib.cpp"],
1350 system_shared_libs: [],
1351 stl: "none",
1352 }
1353
Jiyong Park678c8812020-02-07 17:25:49 +09001354 cc_library_static {
1355 name: "libbaz",
1356 srcs: ["mylib.cpp"],
1357 system_shared_libs: [],
1358 stl: "none",
1359 apex_available: [ "myapex2" ],
1360 }
1361
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001362 `)
1363
Jooyung Hana0503a52023-08-23 13:12:50 +09001364 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 copyCmds := apexRule.Args["copy_commands"]
1366
1367 // Ensure that direct non-stubs dep is always included
1368 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1369
1370 // Ensure that indirect stubs dep is not included
1371 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1372
1373 // Ensure that dependency of stubs is not included
1374 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1375
Colin Crossaede88c2020-08-11 12:17:01 -07001376 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001377
1378 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001379 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001380 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001381 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001382
Jiyong Park3ff16992019-12-27 14:11:47 +09001383 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001384
1385 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1386 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001387
Colin Crossf61d03d2023-11-02 16:56:39 -07001388 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1389 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001390 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001391
Colin Crossf61d03d2023-11-02 16:56:39 -07001392 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1393 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001394 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001395}
1396
Jooyung Hand3639552019-08-09 12:57:43 +09001397func TestApexWithRuntimeLibsDependency(t *testing.T) {
1398 /*
1399 myapex
1400 |
1401 v (runtime_libs)
1402 mylib ------+------> libfoo [provides stub]
1403 |
1404 `------> libbar
1405 */
Colin Cross1c460562021-02-16 17:55:47 -08001406 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001407 apex {
1408 name: "myapex",
1409 key: "myapex.key",
1410 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001411 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001412 }
1413
1414 apex_key {
1415 name: "myapex.key",
1416 public_key: "testkey.avbpubkey",
1417 private_key: "testkey.pem",
1418 }
1419
1420 cc_library {
1421 name: "mylib",
1422 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001423 static_libs: ["libstatic"],
1424 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001425 runtime_libs: ["libfoo", "libbar"],
1426 system_shared_libs: [],
1427 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001428 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001429 }
1430
1431 cc_library {
1432 name: "libfoo",
1433 srcs: ["mylib.cpp"],
1434 system_shared_libs: [],
1435 stl: "none",
1436 stubs: {
1437 versions: ["10", "20", "30"],
1438 },
1439 }
1440
1441 cc_library {
1442 name: "libbar",
1443 srcs: ["mylib.cpp"],
1444 system_shared_libs: [],
1445 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001446 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
Liz Kammer5f108fa2023-05-11 14:33:17 -04001449 cc_library {
1450 name: "libstatic",
1451 srcs: ["mylib.cpp"],
1452 system_shared_libs: [],
1453 stl: "none",
1454 apex_available: [ "myapex" ],
1455 runtime_libs: ["libstatic_to_runtime"],
1456 }
1457
1458 cc_library {
1459 name: "libshared",
1460 srcs: ["mylib.cpp"],
1461 system_shared_libs: [],
1462 stl: "none",
1463 apex_available: [ "myapex" ],
1464 runtime_libs: ["libshared_to_runtime"],
1465 }
1466
1467 cc_library {
1468 name: "libstatic_to_runtime",
1469 srcs: ["mylib.cpp"],
1470 system_shared_libs: [],
1471 stl: "none",
1472 apex_available: [ "myapex" ],
1473 }
1474
1475 cc_library {
1476 name: "libshared_to_runtime",
1477 srcs: ["mylib.cpp"],
1478 system_shared_libs: [],
1479 stl: "none",
1480 apex_available: [ "myapex" ],
1481 }
Jooyung Hand3639552019-08-09 12:57:43 +09001482 `)
1483
Jooyung Hana0503a52023-08-23 13:12:50 +09001484 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001485 copyCmds := apexRule.Args["copy_commands"]
1486
1487 // Ensure that direct non-stubs dep is always included
1488 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1489
1490 // Ensure that indirect stubs dep is not included
1491 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1492
1493 // Ensure that runtime_libs dep in included
1494 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001495 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1496 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1497
1498 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001499
Jooyung Hana0503a52023-08-23 13:12:50 +09001500 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001501 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1502 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001503}
1504
Paul Duffina02cae32021-03-09 01:44:06 +00001505var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1506 cc.PrepareForTestWithCcBuildComponents,
1507 PrepareForTestWithApexBuildComponents,
1508 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509 apex {
1510 name: "com.android.runtime",
1511 key: "com.android.runtime.key",
1512 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001513 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514 }
1515
1516 apex_key {
1517 name: "com.android.runtime.key",
1518 public_key: "testkey.avbpubkey",
1519 private_key: "testkey.pem",
1520 }
Paul Duffina02cae32021-03-09 01:44:06 +00001521 `),
1522 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1523)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001524
Paul Duffina02cae32021-03-09 01:44:06 +00001525func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001526 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001527 cc_library {
1528 name: "libc",
1529 no_libcrt: true,
1530 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001531 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001532 stl: "none",
1533 system_shared_libs: [],
1534 stubs: { versions: ["1"] },
1535 apex_available: ["com.android.runtime"],
1536
1537 sanitize: {
1538 hwaddress: true,
1539 }
1540 }
1541
1542 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001543 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 no_libcrt: true,
1545 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001546 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547 stl: "none",
1548 system_shared_libs: [],
1549 srcs: [""],
1550 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001551 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552
1553 sanitize: {
1554 never: true,
1555 },
Spandan Das4de7b492023-05-05 21:13:01 +00001556 apex_available: [
1557 "//apex_available:anyapex",
1558 "//apex_available:platform",
1559 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001560 } `)
1561 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562
Jooyung Hana0503a52023-08-23 13:12:50 +09001563 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001564 "lib64/bionic/libc.so",
1565 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1566 })
1567
Colin Cross4c4c1be2022-02-10 11:41:18 -08001568 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001569
1570 installed := hwasan.Description("install libclang_rt.hwasan")
1571 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1572
1573 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1574 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1575 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1576}
1577
1578func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001579 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001580 prepareForTestOfRuntimeApexWithHwasan,
1581 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1582 variables.SanitizeDevice = []string{"hwaddress"}
1583 }),
1584 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001585 cc_library {
1586 name: "libc",
1587 no_libcrt: true,
1588 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001589 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001590 stl: "none",
1591 system_shared_libs: [],
1592 stubs: { versions: ["1"] },
1593 apex_available: ["com.android.runtime"],
1594 }
1595
1596 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001597 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598 no_libcrt: true,
1599 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001600 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001601 stl: "none",
1602 system_shared_libs: [],
1603 srcs: [""],
1604 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001605 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001606
1607 sanitize: {
1608 never: true,
1609 },
Spandan Das4de7b492023-05-05 21:13:01 +00001610 apex_available: [
1611 "//apex_available:anyapex",
1612 "//apex_available:platform",
1613 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001614 }
Paul Duffina02cae32021-03-09 01:44:06 +00001615 `)
1616 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001617
Jooyung Hana0503a52023-08-23 13:12:50 +09001618 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001619 "lib64/bionic/libc.so",
1620 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1621 })
1622
Colin Cross4c4c1be2022-02-10 11:41:18 -08001623 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001624
1625 installed := hwasan.Description("install libclang_rt.hwasan")
1626 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1627
1628 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1629 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1630 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1631}
1632
Jooyung Han61b66e92020-03-21 14:21:46 +00001633func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1634 testcases := []struct {
1635 name string
1636 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001637 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001638 shouldLink string
1639 shouldNotLink []string
1640 }{
1641 {
Jiyong Park55549df2021-02-26 23:57:23 +09001642 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001643 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001644 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001645 shouldLink: "current",
1646 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 },
1648 {
Jiyong Park55549df2021-02-26 23:57:23 +09001649 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001650 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001651 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001652 shouldLink: "current",
1653 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001654 },
1655 }
1656 for _, tc := range testcases {
1657 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001658 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001659 apex {
1660 name: "myapex",
1661 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001662 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001663 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001664 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001665 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001666
Jooyung Han61b66e92020-03-21 14:21:46 +00001667 apex_key {
1668 name: "myapex.key",
1669 public_key: "testkey.avbpubkey",
1670 private_key: "testkey.pem",
1671 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001672
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 cc_library {
1674 name: "mylib",
1675 srcs: ["mylib.cpp"],
1676 vendor_available: true,
1677 shared_libs: ["libbar"],
1678 system_shared_libs: [],
1679 stl: "none",
1680 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001681 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001683
Jooyung Han61b66e92020-03-21 14:21:46 +00001684 cc_library {
1685 name: "libbar",
1686 srcs: ["mylib.cpp"],
1687 system_shared_libs: [],
1688 stl: "none",
1689 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001690 llndk: {
1691 symbol_file: "libbar.map.txt",
1692 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001694 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001695 withUnbundledBuild,
1696 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001697
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001699 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001700 "lib64/mylib.so",
1701 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001702
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001704 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001705 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1706 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001707
Steven Moreland2c4000c2021-04-27 02:08:49 +00001708 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1709 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001711 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001713
Steven Moreland2c4000c2021-04-27 02:08:49 +00001714 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001715 ver := tc.shouldLink
1716 if tc.shouldLink == "current" {
1717 ver = strconv.Itoa(android.FutureApiLevelInt)
1718 }
1719 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001720 })
1721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722}
1723
Jiyong Park25fc6a92018-11-18 18:02:45 +09001724func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001725 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 apex {
1727 name: "myapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001730 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "mylib",
1741 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001742 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001743 shared_libs: ["libdl#27"],
1744 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001745 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001746 }
1747
1748 cc_library_shared {
1749 name: "mylib_shared",
1750 srcs: ["mylib.cpp"],
1751 shared_libs: ["libdl#27"],
1752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001753 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001754 }
1755
1756 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001757 name: "libBootstrap",
1758 srcs: ["mylib.cpp"],
1759 stl: "none",
1760 bootstrap: true,
1761 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001762 `)
1763
Jooyung Hana0503a52023-08-23 13:12:50 +09001764 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001765 copyCmds := apexRule.Args["copy_commands"]
1766
1767 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001768 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001769 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1770 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771
1772 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001773 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001774
Colin Crossaede88c2020-08-11 12:17:01 -07001775 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1776 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1777 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001778
1779 // For dependency to libc
1780 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001781 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001782 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001783 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001785 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1786 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001787
1788 // For dependency to libm
1789 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001790 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001792 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001793 // ... and is not compiling with the stub
1794 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1795 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1796
1797 // For dependency to libdl
1798 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001799 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001801 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1802 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001803 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001804 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 // ... Cflags from stub is correctly exported to mylib
1806 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1807 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001808
1809 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001810 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1811 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1812 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1813 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001815
Jooyung Han749dc692020-04-15 11:03:39 +09001816func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001817 // there are three links between liba --> libz.
1818 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001819 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001820 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001821 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001822 apex {
1823 name: "myapex",
1824 key: "myapex.key",
1825 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001826 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001827 }
1828
1829 apex {
1830 name: "otherapex",
1831 key: "myapex.key",
1832 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001833 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001834 }
1835
1836 apex_key {
1837 name: "myapex.key",
1838 public_key: "testkey.avbpubkey",
1839 private_key: "testkey.pem",
1840 }
1841
1842 cc_library {
1843 name: "libx",
1844 shared_libs: ["liba"],
1845 system_shared_libs: [],
1846 stl: "none",
1847 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001848 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001849 }
1850
1851 cc_library {
1852 name: "liby",
1853 shared_libs: ["liba"],
1854 system_shared_libs: [],
1855 stl: "none",
1856 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001857 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001858 }
1859
1860 cc_library {
1861 name: "liba",
1862 shared_libs: ["libz"],
1863 system_shared_libs: [],
1864 stl: "none",
1865 apex_available: [
1866 "//apex_available:anyapex",
1867 "//apex_available:platform",
1868 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001869 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001870 }
1871
1872 cc_library {
1873 name: "libz",
1874 system_shared_libs: [],
1875 stl: "none",
1876 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001877 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001878 },
1879 }
Jooyung Han749dc692020-04-15 11:03:39 +09001880 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001881
1882 expectLink := func(from, from_variant, to, to_variant string) {
1883 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1884 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1885 }
1886 expectNoLink := func(from, from_variant, to, to_variant string) {
1887 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1888 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1889 }
1890 // platform liba is linked to non-stub version
1891 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001892 // liba in myapex is linked to current
1893 expectLink("liba", "shared_apex29", "libz", "shared_current")
1894 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001895 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001896 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001897 // liba in otherapex is linked to current
1898 expectLink("liba", "shared_apex30", "libz", "shared_current")
1899 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001900 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1901 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001902}
1903
Jooyung Hanaed150d2020-04-02 01:41:41 +09001904func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001905 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001906 apex {
1907 name: "myapex",
1908 key: "myapex.key",
1909 native_shared_libs: ["libx"],
1910 min_sdk_version: "R",
1911 }
1912
1913 apex_key {
1914 name: "myapex.key",
1915 public_key: "testkey.avbpubkey",
1916 private_key: "testkey.pem",
1917 }
1918
1919 cc_library {
1920 name: "libx",
1921 shared_libs: ["libz"],
1922 system_shared_libs: [],
1923 stl: "none",
1924 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001925 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001926 }
1927
1928 cc_library {
1929 name: "libz",
1930 system_shared_libs: [],
1931 stl: "none",
1932 stubs: {
1933 versions: ["29", "R"],
1934 },
1935 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001936 `,
1937 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1938 variables.Platform_version_active_codenames = []string{"R"}
1939 }),
1940 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001941
1942 expectLink := func(from, from_variant, to, to_variant string) {
1943 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1944 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1945 }
1946 expectNoLink := func(from, from_variant, to, to_variant string) {
1947 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1948 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1949 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001950 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1951 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001952 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1953 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001954}
1955
Jooyung Han4c4da062021-06-23 10:23:16 +09001956func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1957 testApex(t, `
1958 apex {
1959 name: "myapex",
1960 key: "myapex.key",
1961 java_libs: ["libx"],
1962 min_sdk_version: "S",
1963 }
1964
1965 apex_key {
1966 name: "myapex.key",
1967 public_key: "testkey.avbpubkey",
1968 private_key: "testkey.pem",
1969 }
1970
1971 java_library {
1972 name: "libx",
1973 srcs: ["a.java"],
1974 apex_available: [ "myapex" ],
1975 sdk_version: "current",
1976 min_sdk_version: "S", // should be okay
1977 }
1978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"S"}
1981 variables.Platform_sdk_codename = proptools.StringPtr("S")
1982 }),
1983 )
1984}
1985
Jooyung Han749dc692020-04-15 11:03:39 +09001986func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001987 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001988 apex {
1989 name: "myapex",
1990 key: "myapex.key",
1991 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001992 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001993 }
1994
1995 apex_key {
1996 name: "myapex.key",
1997 public_key: "testkey.avbpubkey",
1998 private_key: "testkey.pem",
1999 }
2000
2001 cc_library {
2002 name: "libx",
2003 shared_libs: ["libz"],
2004 system_shared_libs: [],
2005 stl: "none",
2006 apex_available: [ "myapex" ],
2007 }
2008
2009 cc_library {
2010 name: "libz",
2011 system_shared_libs: [],
2012 stl: "none",
2013 stubs: {
2014 versions: ["1", "2"],
2015 },
2016 }
2017 `)
2018
2019 expectLink := func(from, from_variant, to, to_variant string) {
2020 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2021 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2022 }
2023 expectNoLink := func(from, from_variant, to, to_variant string) {
2024 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2025 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2026 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002027 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002028 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002029 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002030 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002031}
2032
Jooyung Handfc864c2023-03-20 18:19:07 +09002033func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002034 ctx := testApex(t, `
2035 apex {
2036 name: "myapex",
2037 key: "myapex.key",
2038 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002039 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002040 vendor: true,
2041 min_sdk_version: "29",
2042 }
2043
2044 apex_key {
2045 name: "myapex.key",
2046 public_key: "testkey.avbpubkey",
2047 private_key: "testkey.pem",
2048 }
2049
2050 cc_library {
2051 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002052 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002053 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002054 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002055 shared_libs: ["libbar"],
2056 }
2057
2058 cc_library {
2059 name: "libbar",
2060 stubs: { versions: ["29", "30"] },
2061 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002062 }
2063 `)
2064
2065 vendorVariant := "android_vendor.29_arm64_armv8-a"
2066
Jooyung Handfc864c2023-03-20 18:19:07 +09002067 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
2068
2069 // Ensure that mylib links with "current" LLNDK
2070 libFlags := names(mylib.Rule("ld").Args["libFlags"])
2071 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
2072
2073 // Ensure that mylib is targeting 29
2074 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2075 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2076
2077 // Ensure that the correct variant of crtbegin_so is used.
2078 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2079 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080
2081 // Ensure that the crtbegin_so used by the APEX is targeting 29
2082 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2083 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2084}
2085
Jooyung Han4495f842023-04-25 16:39:59 +09002086func TestTrackAllowedDeps(t *testing.T) {
2087 ctx := testApex(t, `
2088 apex {
2089 name: "myapex",
2090 key: "myapex.key",
2091 updatable: true,
2092 native_shared_libs: [
2093 "mylib",
2094 "yourlib",
2095 ],
2096 min_sdk_version: "29",
2097 }
2098
2099 apex {
2100 name: "myapex2",
2101 key: "myapex.key",
2102 updatable: false,
2103 native_shared_libs: ["yourlib"],
2104 }
2105
2106 apex_key {
2107 name: "myapex.key",
2108 public_key: "testkey.avbpubkey",
2109 private_key: "testkey.pem",
2110 }
2111
2112 cc_library {
2113 name: "mylib",
2114 srcs: ["mylib.cpp"],
2115 shared_libs: ["libbar"],
2116 min_sdk_version: "29",
2117 apex_available: ["myapex"],
2118 }
2119
2120 cc_library {
2121 name: "libbar",
2122 stubs: { versions: ["29", "30"] },
2123 }
2124
2125 cc_library {
2126 name: "yourlib",
2127 srcs: ["mylib.cpp"],
2128 min_sdk_version: "29",
2129 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2130 }
2131 `, withFiles(android.MockFS{
2132 "packages/modules/common/build/allowed_deps.txt": nil,
2133 }))
2134
2135 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2136 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2137 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002138 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002139 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002140 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002141
Jooyung Hana0503a52023-08-23 13:12:50 +09002142 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002143 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2144 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002145 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2146 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2147 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2148 flatlist, "mylib:(minSdkVersion:29)")
2149 android.AssertStringListContains(t, "track platform-available lib",
2150 flatlist, "yourlib(minSdkVersion:29)")
2151}
2152
2153func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2154 ctx := testApex(t, `
2155 apex {
2156 name: "myapex",
2157 key: "myapex.key",
2158 updatable: true,
2159 min_sdk_version: "29",
2160 }
2161
2162 apex_key {
2163 name: "myapex.key",
2164 public_key: "testkey.avbpubkey",
2165 private_key: "testkey.pem",
2166 }
2167 `)
2168 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2169 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2170 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2171 }
2172}
2173
Jooyung Han03b51852020-02-26 22:45:42 +09002174func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002175 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002176 apex {
2177 name: "myapex",
2178 key: "myapex.key",
2179 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002180 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002181 }
2182
2183 apex_key {
2184 name: "myapex.key",
2185 public_key: "testkey.avbpubkey",
2186 private_key: "testkey.pem",
2187 }
2188
2189 cc_library {
2190 name: "libx",
2191 system_shared_libs: [],
2192 stl: "none",
2193 apex_available: [ "myapex" ],
2194 stubs: {
2195 versions: ["1", "2"],
2196 },
2197 }
2198
2199 cc_library {
2200 name: "libz",
2201 shared_libs: ["libx"],
2202 system_shared_libs: [],
2203 stl: "none",
2204 }
2205 `)
2206
2207 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002208 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002209 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2210 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2211 }
2212 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002213 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002214 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2215 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2216 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002217 expectLink("libz", "shared", "libx", "shared_current")
2218 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002219 expectNoLink("libz", "shared", "libz", "shared_1")
2220 expectNoLink("libz", "shared", "libz", "shared")
2221}
2222
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002223var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2224 func(variables android.FixtureProductVariables) {
2225 variables.SanitizeDevice = []string{"hwaddress"}
2226 },
2227)
2228
Jooyung Han75568392020-03-20 04:29:24 +09002229func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002230 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002231 apex {
2232 name: "myapex",
2233 key: "myapex.key",
2234 native_shared_libs: ["libx"],
2235 min_sdk_version: "29",
2236 }
2237
2238 apex_key {
2239 name: "myapex.key",
2240 public_key: "testkey.avbpubkey",
2241 private_key: "testkey.pem",
2242 }
2243
2244 cc_library {
2245 name: "libx",
2246 shared_libs: ["libbar"],
2247 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002248 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002249 }
2250
2251 cc_library {
2252 name: "libbar",
2253 stubs: {
2254 versions: ["29", "30"],
2255 },
2256 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002257 `,
2258 prepareForTestWithSantitizeHwaddress,
2259 )
Jooyung Han03b51852020-02-26 22:45:42 +09002260 expectLink := func(from, from_variant, to, to_variant string) {
2261 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2262 libFlags := ld.Args["libFlags"]
2263 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2264 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002265 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002266}
2267
Jooyung Han75568392020-03-20 04:29:24 +09002268func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002269 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002270 apex {
2271 name: "myapex",
2272 key: "myapex.key",
2273 native_shared_libs: ["libx"],
2274 min_sdk_version: "29",
2275 }
2276
2277 apex_key {
2278 name: "myapex.key",
2279 public_key: "testkey.avbpubkey",
2280 private_key: "testkey.pem",
2281 }
2282
2283 cc_library {
2284 name: "libx",
2285 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002286 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002287 }
Jooyung Han75568392020-03-20 04:29:24 +09002288 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002289
2290 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002291 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002292 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002293 // note that platform variant is not.
2294 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002295 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002296}
2297
Jooyung Han749dc692020-04-15 11:03:39 +09002298func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2299 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002300 apex {
2301 name: "myapex",
2302 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002303 native_shared_libs: ["mylib"],
2304 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002305 }
2306
2307 apex_key {
2308 name: "myapex.key",
2309 public_key: "testkey.avbpubkey",
2310 private_key: "testkey.pem",
2311 }
Jooyung Han749dc692020-04-15 11:03:39 +09002312
2313 cc_library {
2314 name: "mylib",
2315 srcs: ["mylib.cpp"],
2316 system_shared_libs: [],
2317 stl: "none",
2318 apex_available: [
2319 "myapex",
2320 ],
2321 min_sdk_version: "30",
2322 }
2323 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002324
2325 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2326 apex {
2327 name: "myapex",
2328 key: "myapex.key",
2329 native_shared_libs: ["libfoo.ffi"],
2330 min_sdk_version: "29",
2331 }
2332
2333 apex_key {
2334 name: "myapex.key",
2335 public_key: "testkey.avbpubkey",
2336 private_key: "testkey.pem",
2337 }
2338
2339 rust_ffi_shared {
2340 name: "libfoo.ffi",
2341 srcs: ["foo.rs"],
2342 crate_name: "foo",
2343 apex_available: [
2344 "myapex",
2345 ],
2346 min_sdk_version: "30",
2347 }
2348 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002349
2350 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2351 apex {
2352 name: "myapex",
2353 key: "myapex.key",
2354 java_libs: ["libfoo"],
2355 min_sdk_version: "29",
2356 }
2357
2358 apex_key {
2359 name: "myapex.key",
2360 public_key: "testkey.avbpubkey",
2361 private_key: "testkey.pem",
2362 }
2363
2364 java_import {
2365 name: "libfoo",
2366 jars: ["libfoo.jar"],
2367 apex_available: [
2368 "myapex",
2369 ],
2370 min_sdk_version: "30",
2371 }
2372 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002373
2374 // Skip check for modules compiling against core API surface
2375 testApex(t, `
2376 apex {
2377 name: "myapex",
2378 key: "myapex.key",
2379 java_libs: ["libfoo"],
2380 min_sdk_version: "29",
2381 }
2382
2383 apex_key {
2384 name: "myapex.key",
2385 public_key: "testkey.avbpubkey",
2386 private_key: "testkey.pem",
2387 }
2388
2389 java_library {
2390 name: "libfoo",
2391 srcs: ["Foo.java"],
2392 apex_available: [
2393 "myapex",
2394 ],
2395 // Compile against core API surface
2396 sdk_version: "core_current",
2397 min_sdk_version: "30",
2398 }
2399 `)
2400
Jooyung Han749dc692020-04-15 11:03:39 +09002401}
2402
2403func TestApexMinSdkVersion_Okay(t *testing.T) {
2404 testApex(t, `
2405 apex {
2406 name: "myapex",
2407 key: "myapex.key",
2408 native_shared_libs: ["libfoo"],
2409 java_libs: ["libbar"],
2410 min_sdk_version: "29",
2411 }
2412
2413 apex_key {
2414 name: "myapex.key",
2415 public_key: "testkey.avbpubkey",
2416 private_key: "testkey.pem",
2417 }
2418
2419 cc_library {
2420 name: "libfoo",
2421 srcs: ["mylib.cpp"],
2422 shared_libs: ["libfoo_dep"],
2423 apex_available: ["myapex"],
2424 min_sdk_version: "29",
2425 }
2426
2427 cc_library {
2428 name: "libfoo_dep",
2429 srcs: ["mylib.cpp"],
2430 apex_available: ["myapex"],
2431 min_sdk_version: "29",
2432 }
2433
2434 java_library {
2435 name: "libbar",
2436 sdk_version: "current",
2437 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002438 static_libs: [
2439 "libbar_dep",
2440 "libbar_import_dep",
2441 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002442 apex_available: ["myapex"],
2443 min_sdk_version: "29",
2444 }
2445
2446 java_library {
2447 name: "libbar_dep",
2448 sdk_version: "current",
2449 srcs: ["a.java"],
2450 apex_available: ["myapex"],
2451 min_sdk_version: "29",
2452 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002453
2454 java_import {
2455 name: "libbar_import_dep",
2456 jars: ["libbar.jar"],
2457 apex_available: ["myapex"],
2458 min_sdk_version: "29",
2459 }
Jooyung Han03b51852020-02-26 22:45:42 +09002460 `)
2461}
2462
Colin Cross8ca61c12022-10-06 21:00:14 -07002463func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2464 // Tests that an apex dependency with min_sdk_version higher than the
2465 // min_sdk_version of the apex is allowed as long as the dependency's
2466 // min_sdk_version is less than or equal to the api level that the
2467 // architecture was introduced in. In this case, arm64 didn't exist
2468 // until api level 21, so the arm64 code will never need to run on
2469 // an api level 20 device, even if other architectures of the apex
2470 // will.
2471 testApex(t, `
2472 apex {
2473 name: "myapex",
2474 key: "myapex.key",
2475 native_shared_libs: ["libfoo"],
2476 min_sdk_version: "20",
2477 }
2478
2479 apex_key {
2480 name: "myapex.key",
2481 public_key: "testkey.avbpubkey",
2482 private_key: "testkey.pem",
2483 }
2484
2485 cc_library {
2486 name: "libfoo",
2487 srcs: ["mylib.cpp"],
2488 apex_available: ["myapex"],
2489 min_sdk_version: "21",
2490 stl: "none",
2491 }
2492 `)
2493}
2494
Artur Satayev8cf899a2020-04-15 17:29:42 +01002495func TestJavaStableSdkVersion(t *testing.T) {
2496 testCases := []struct {
2497 name string
2498 expectedError string
2499 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002500 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002501 }{
2502 {
2503 name: "Non-updatable apex with non-stable dep",
2504 bp: `
2505 apex {
2506 name: "myapex",
2507 java_libs: ["myjar"],
2508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002509 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002510 }
2511 apex_key {
2512 name: "myapex.key",
2513 public_key: "testkey.avbpubkey",
2514 private_key: "testkey.pem",
2515 }
2516 java_library {
2517 name: "myjar",
2518 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002519 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002520 apex_available: ["myapex"],
2521 }
2522 `,
2523 },
2524 {
2525 name: "Updatable apex with stable dep",
2526 bp: `
2527 apex {
2528 name: "myapex",
2529 java_libs: ["myjar"],
2530 key: "myapex.key",
2531 updatable: true,
2532 min_sdk_version: "29",
2533 }
2534 apex_key {
2535 name: "myapex.key",
2536 public_key: "testkey.avbpubkey",
2537 private_key: "testkey.pem",
2538 }
2539 java_library {
2540 name: "myjar",
2541 srcs: ["foo/bar/MyClass.java"],
2542 sdk_version: "current",
2543 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002544 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002545 }
2546 `,
2547 },
2548 {
2549 name: "Updatable apex with non-stable dep",
2550 expectedError: "cannot depend on \"myjar\"",
2551 bp: `
2552 apex {
2553 name: "myapex",
2554 java_libs: ["myjar"],
2555 key: "myapex.key",
2556 updatable: true,
2557 }
2558 apex_key {
2559 name: "myapex.key",
2560 public_key: "testkey.avbpubkey",
2561 private_key: "testkey.pem",
2562 }
2563 java_library {
2564 name: "myjar",
2565 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002566 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002567 apex_available: ["myapex"],
2568 }
2569 `,
2570 },
2571 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002572 name: "Updatable apex with non-stable legacy core platform dep",
2573 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2574 bp: `
2575 apex {
2576 name: "myapex",
2577 java_libs: ["myjar-uses-legacy"],
2578 key: "myapex.key",
2579 updatable: true,
2580 }
2581 apex_key {
2582 name: "myapex.key",
2583 public_key: "testkey.avbpubkey",
2584 private_key: "testkey.pem",
2585 }
2586 java_library {
2587 name: "myjar-uses-legacy",
2588 srcs: ["foo/bar/MyClass.java"],
2589 sdk_version: "core_platform",
2590 apex_available: ["myapex"],
2591 }
2592 `,
2593 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2594 },
2595 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002596 name: "Updatable apex with non-stable transitive dep",
2597 // This is not actually detecting that the transitive dependency is unstable, rather it is
2598 // detecting that the transitive dependency is building against a wider API surface than the
2599 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002600 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002601 bp: `
2602 apex {
2603 name: "myapex",
2604 java_libs: ["myjar"],
2605 key: "myapex.key",
2606 updatable: true,
2607 }
2608 apex_key {
2609 name: "myapex.key",
2610 public_key: "testkey.avbpubkey",
2611 private_key: "testkey.pem",
2612 }
2613 java_library {
2614 name: "myjar",
2615 srcs: ["foo/bar/MyClass.java"],
2616 sdk_version: "current",
2617 apex_available: ["myapex"],
2618 static_libs: ["transitive-jar"],
2619 }
2620 java_library {
2621 name: "transitive-jar",
2622 srcs: ["foo/bar/MyClass.java"],
2623 sdk_version: "core_platform",
2624 apex_available: ["myapex"],
2625 }
2626 `,
2627 },
2628 }
2629
2630 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002631 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2632 continue
2633 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002634 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002635 errorHandler := android.FixtureExpectsNoErrors
2636 if test.expectedError != "" {
2637 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002638 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002639 android.GroupFixturePreparers(
2640 java.PrepareForTestWithJavaDefaultModules,
2641 PrepareForTestWithApexBuildComponents,
2642 prepareForTestWithMyapex,
2643 android.OptionalFixturePreparer(test.preparer),
2644 ).
2645 ExtendWithErrorHandler(errorHandler).
2646 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002647 })
2648 }
2649}
2650
Jooyung Han749dc692020-04-15 11:03:39 +09002651func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2652 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2653 apex {
2654 name: "myapex",
2655 key: "myapex.key",
2656 native_shared_libs: ["mylib"],
2657 min_sdk_version: "29",
2658 }
2659
2660 apex_key {
2661 name: "myapex.key",
2662 public_key: "testkey.avbpubkey",
2663 private_key: "testkey.pem",
2664 }
2665
2666 cc_library {
2667 name: "mylib",
2668 srcs: ["mylib.cpp"],
2669 shared_libs: ["mylib2"],
2670 system_shared_libs: [],
2671 stl: "none",
2672 apex_available: [
2673 "myapex",
2674 ],
2675 min_sdk_version: "29",
2676 }
2677
2678 // indirect part of the apex
2679 cc_library {
2680 name: "mylib2",
2681 srcs: ["mylib.cpp"],
2682 system_shared_libs: [],
2683 stl: "none",
2684 apex_available: [
2685 "myapex",
2686 ],
2687 min_sdk_version: "30",
2688 }
2689 `)
2690}
2691
2692func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2693 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2694 apex {
2695 name: "myapex",
2696 key: "myapex.key",
2697 apps: ["AppFoo"],
2698 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002699 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002700 }
2701
2702 apex_key {
2703 name: "myapex.key",
2704 public_key: "testkey.avbpubkey",
2705 private_key: "testkey.pem",
2706 }
2707
2708 android_app {
2709 name: "AppFoo",
2710 srcs: ["foo/bar/MyClass.java"],
2711 sdk_version: "current",
2712 min_sdk_version: "29",
2713 system_modules: "none",
2714 stl: "none",
2715 static_libs: ["bar"],
2716 apex_available: [ "myapex" ],
2717 }
2718
2719 java_library {
2720 name: "bar",
2721 sdk_version: "current",
2722 srcs: ["a.java"],
2723 apex_available: [ "myapex" ],
2724 }
2725 `)
2726}
2727
2728func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002729 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002730 apex {
2731 name: "myapex",
2732 key: "myapex.key",
2733 native_shared_libs: ["mylib"],
2734 min_sdk_version: "29",
2735 }
2736
2737 apex_key {
2738 name: "myapex.key",
2739 public_key: "testkey.avbpubkey",
2740 private_key: "testkey.pem",
2741 }
2742
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002743 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002744 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2745 cc_library {
2746 name: "mylib",
2747 srcs: ["mylib.cpp"],
2748 shared_libs: ["mylib2"],
2749 system_shared_libs: [],
2750 stl: "none",
2751 apex_available: ["myapex", "otherapex"],
2752 min_sdk_version: "29",
2753 }
2754
2755 cc_library {
2756 name: "mylib2",
2757 srcs: ["mylib.cpp"],
2758 system_shared_libs: [],
2759 stl: "none",
2760 apex_available: ["otherapex"],
2761 stubs: { versions: ["29", "30"] },
2762 min_sdk_version: "30",
2763 }
2764
2765 apex {
2766 name: "otherapex",
2767 key: "myapex.key",
2768 native_shared_libs: ["mylib", "mylib2"],
2769 min_sdk_version: "30",
2770 }
2771 `)
2772 expectLink := func(from, from_variant, to, to_variant string) {
2773 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2774 libFlags := ld.Args["libFlags"]
2775 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2776 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002777 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002778 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002779}
2780
Jooyung Haned124c32021-01-26 11:43:46 +09002781func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002782 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2783 func(variables android.FixtureProductVariables) {
2784 variables.Platform_sdk_codename = proptools.StringPtr("S")
2785 variables.Platform_version_active_codenames = []string{"S"}
2786 },
2787 )
Jooyung Haned124c32021-01-26 11:43:46 +09002788 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2789 apex {
2790 name: "myapex",
2791 key: "myapex.key",
2792 native_shared_libs: ["libfoo"],
2793 min_sdk_version: "S",
2794 }
2795 apex_key {
2796 name: "myapex.key",
2797 public_key: "testkey.avbpubkey",
2798 private_key: "testkey.pem",
2799 }
2800 cc_library {
2801 name: "libfoo",
2802 shared_libs: ["libbar"],
2803 apex_available: ["myapex"],
2804 min_sdk_version: "29",
2805 }
2806 cc_library {
2807 name: "libbar",
2808 apex_available: ["myapex"],
2809 }
2810 `, withSAsActiveCodeNames)
2811}
2812
2813func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002814 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2815 variables.Platform_sdk_codename = proptools.StringPtr("S")
2816 variables.Platform_version_active_codenames = []string{"S", "T"}
2817 })
Colin Cross1c460562021-02-16 17:55:47 -08002818 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002819 apex {
2820 name: "myapex",
2821 key: "myapex.key",
2822 native_shared_libs: ["libfoo"],
2823 min_sdk_version: "S",
2824 }
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }
2830 cc_library {
2831 name: "libfoo",
2832 shared_libs: ["libbar"],
2833 apex_available: ["myapex"],
2834 min_sdk_version: "S",
2835 }
2836 cc_library {
2837 name: "libbar",
2838 stubs: {
2839 symbol_file: "libbar.map.txt",
2840 versions: ["30", "S", "T"],
2841 },
2842 }
2843 `, withSAsActiveCodeNames)
2844
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002845 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002846 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2847 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002848 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002849}
2850
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002852 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002853 apex {
2854 name: "myapex",
2855 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002856 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002857 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002858 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002859 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002860 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 prebuilt_etc {
2870 name: "myetc",
2871 src: "myprebuilt",
2872 sub_dir: "foo/bar",
2873 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002874
2875 cc_library {
2876 name: "mylib",
2877 srcs: ["mylib.cpp"],
2878 relative_install_path: "foo/bar",
2879 system_shared_libs: [],
2880 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002881 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002882 }
2883
2884 cc_binary {
2885 name: "mybin",
2886 srcs: ["mylib.cpp"],
2887 relative_install_path: "foo/bar",
2888 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002889 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002890 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002891 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002892
2893 rust_binary {
2894 name: "mybin.rust",
2895 srcs: ["foo.rs"],
2896 relative_install_path: "rust_subdir",
2897 apex_available: [ "myapex" ],
2898 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002899 `)
2900
Jooyung Hana0503a52023-08-23 13:12:50 +09002901 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002902 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002903
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002904 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002905 ensureContains(t, cmd, "/etc ")
2906 ensureContains(t, cmd, "/etc/foo ")
2907 ensureContains(t, cmd, "/etc/foo/bar ")
2908 ensureContains(t, cmd, "/lib64 ")
2909 ensureContains(t, cmd, "/lib64/foo ")
2910 ensureContains(t, cmd, "/lib64/foo/bar ")
2911 ensureContains(t, cmd, "/lib ")
2912 ensureContains(t, cmd, "/lib/foo ")
2913 ensureContains(t, cmd, "/lib/foo/bar ")
2914 ensureContains(t, cmd, "/bin ")
2915 ensureContains(t, cmd, "/bin/foo ")
2916 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002917 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002918}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002919
Jooyung Han35155c42020-02-06 17:33:20 +09002920func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002921 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002922 apex {
2923 name: "myapex",
2924 key: "myapex.key",
2925 multilib: {
2926 both: {
2927 native_shared_libs: ["mylib"],
2928 binaries: ["mybin"],
2929 },
2930 },
2931 compile_multilib: "both",
2932 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002933 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002934 }
2935
2936 apex_key {
2937 name: "myapex.key",
2938 public_key: "testkey.avbpubkey",
2939 private_key: "testkey.pem",
2940 }
2941
2942 cc_library {
2943 name: "mylib",
2944 relative_install_path: "foo/bar",
2945 system_shared_libs: [],
2946 stl: "none",
2947 apex_available: [ "myapex" ],
2948 native_bridge_supported: true,
2949 }
2950
2951 cc_binary {
2952 name: "mybin",
2953 relative_install_path: "foo/bar",
2954 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002955 stl: "none",
2956 apex_available: [ "myapex" ],
2957 native_bridge_supported: true,
2958 compile_multilib: "both", // default is "first" for binary
2959 multilib: {
2960 lib64: {
2961 suffix: "64",
2962 },
2963 },
2964 }
2965 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002966 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002967 "bin/foo/bar/mybin",
2968 "bin/foo/bar/mybin64",
2969 "bin/arm/foo/bar/mybin",
2970 "bin/arm64/foo/bar/mybin64",
2971 "lib/foo/bar/mylib.so",
2972 "lib/arm/foo/bar/mylib.so",
2973 "lib64/foo/bar/mylib.so",
2974 "lib64/arm64/foo/bar/mylib.so",
2975 })
2976}
2977
Jooyung Han85d61762020-06-24 23:50:26 +09002978func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002979 result := android.GroupFixturePreparers(
2980 prepareForApexTest,
2981 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2982 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002983 apex {
2984 name: "myapex",
2985 key: "myapex.key",
2986 binaries: ["mybin"],
2987 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002988 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002989 }
2990 apex_key {
2991 name: "myapex.key",
2992 public_key: "testkey.avbpubkey",
2993 private_key: "testkey.pem",
2994 }
2995 cc_binary {
2996 name: "mybin",
2997 vendor: true,
2998 shared_libs: ["libfoo"],
2999 }
3000 cc_library {
3001 name: "libfoo",
3002 proprietary: true,
3003 }
3004 `)
3005
Jooyung Hana0503a52023-08-23 13:12:50 +09003006 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003007 "bin/mybin",
3008 "lib64/libfoo.so",
3009 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3010 "lib64/libc++.so",
3011 })
3012
Jooyung Hana0503a52023-08-23 13:12:50 +09003013 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003014 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003015 name := apexBundle.BaseModuleName()
3016 prefix := "TARGET_"
3017 var builder strings.Builder
3018 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003019 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003020 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003021 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003022
Jooyung Hana0503a52023-08-23 13:12:50 +09003023 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003024 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3025 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003026}
3027
Jooyung Hanc5a96762022-02-04 11:54:50 +09003028func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
3029 testApexError(t, `Trying to include a VNDK library`, `
3030 apex {
3031 name: "myapex",
3032 key: "myapex.key",
3033 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
3034 vendor: true,
3035 use_vndk_as_stable: true,
3036 updatable: false,
3037 }
3038 apex_key {
3039 name: "myapex.key",
3040 public_key: "testkey.avbpubkey",
3041 private_key: "testkey.pem",
3042 }`)
3043}
3044
Jooyung Handf78e212020-07-22 15:54:47 +09003045func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09003046 // myapex myapex2
3047 // | |
3048 // mybin ------. mybin2
3049 // \ \ / |
3050 // (stable) .---\--------` |
3051 // \ / \ |
3052 // \ / \ /
3053 // libvndk libvendor
3054 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08003055 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09003056 apex {
3057 name: "myapex",
3058 key: "myapex.key",
3059 binaries: ["mybin"],
3060 vendor: true,
3061 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003062 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09003063 }
3064 apex_key {
3065 name: "myapex.key",
3066 public_key: "testkey.avbpubkey",
3067 private_key: "testkey.pem",
3068 }
3069 cc_binary {
3070 name: "mybin",
3071 vendor: true,
3072 shared_libs: ["libvndk", "libvendor"],
3073 }
3074 cc_library {
3075 name: "libvndk",
3076 vndk: {
3077 enabled: true,
3078 },
3079 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003080 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003081 }
3082 cc_library {
3083 name: "libvendor",
3084 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003085 stl: "none",
3086 }
3087 apex {
3088 name: "myapex2",
3089 key: "myapex.key",
3090 binaries: ["mybin2"],
3091 vendor: true,
3092 use_vndk_as_stable: false,
3093 updatable: false,
3094 }
3095 cc_binary {
3096 name: "mybin2",
3097 vendor: true,
3098 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003099 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003100 `,
3101 android.FixtureModifyConfig(func(config android.Config) {
3102 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3103 }),
3104 )
Jooyung Handf78e212020-07-22 15:54:47 +09003105
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003106 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003107
Jooyung Han91f92032022-02-04 12:36:33 +09003108 for _, tc := range []struct {
3109 name string
3110 apexName string
3111 moduleName string
3112 moduleVariant string
3113 libs []string
3114 contents []string
3115 requireVndkNamespace bool
3116 }{
3117 {
3118 name: "use_vndk_as_stable",
3119 apexName: "myapex",
3120 moduleName: "mybin",
3121 moduleVariant: vendorVariant + "_apex10000",
3122 libs: []string{
3123 // should link with vendor variants of VNDK libs(libvndk/libc++)
3124 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3125 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3126 // unstable Vendor libs as APEX variant
3127 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3128 },
3129 contents: []string{
3130 "bin/mybin",
3131 "lib64/libvendor.so",
3132 // VNDK libs (libvndk/libc++) are not included
3133 },
3134 requireVndkNamespace: true,
3135 },
3136 {
3137 name: "!use_vndk_as_stable",
3138 apexName: "myapex2",
3139 moduleName: "mybin2",
3140 moduleVariant: vendorVariant + "_myapex2",
3141 libs: []string{
3142 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3143 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3144 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3145 // unstable vendor libs have "merged" APEX variants
3146 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3147 },
3148 contents: []string{
3149 "bin/mybin2",
3150 "lib64/libvendor.so",
3151 // VNDK libs are included as well
3152 "lib64/libvndk.so",
3153 "lib64/libc++.so",
3154 },
3155 requireVndkNamespace: false,
3156 },
3157 } {
3158 t.Run(tc.name, func(t *testing.T) {
3159 // Check linked libs
3160 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3161 libs := names(ldRule.Args["libFlags"])
3162 for _, lib := range tc.libs {
3163 ensureListContains(t, libs, lib)
3164 }
3165 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003166 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003167
Jooyung Han91f92032022-02-04 12:36:33 +09003168 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003169 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003170 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3171 if tc.requireVndkNamespace {
3172 ensureListContains(t, requireNativeLibs, ":vndk")
3173 } else {
3174 ensureListNotContains(t, requireNativeLibs, ":vndk")
3175 }
3176 })
3177 }
Jooyung Handf78e212020-07-22 15:54:47 +09003178}
3179
Justin Yun13decfb2021-03-08 19:25:55 +09003180func TestProductVariant(t *testing.T) {
3181 ctx := testApex(t, `
3182 apex {
3183 name: "myapex",
3184 key: "myapex.key",
3185 updatable: false,
3186 product_specific: true,
3187 binaries: ["foo"],
3188 }
3189
3190 apex_key {
3191 name: "myapex.key",
3192 public_key: "testkey.avbpubkey",
3193 private_key: "testkey.pem",
3194 }
3195
3196 cc_binary {
3197 name: "foo",
3198 product_available: true,
3199 apex_available: ["myapex"],
3200 srcs: ["foo.cpp"],
3201 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003202 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003203
3204 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003205 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003206 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3207 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3208 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3209 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3210}
3211
Jooyung Han8e5685d2020-09-21 11:02:57 +09003212func TestApex_withPrebuiltFirmware(t *testing.T) {
3213 testCases := []struct {
3214 name string
3215 additionalProp string
3216 }{
3217 {"system apex with prebuilt_firmware", ""},
3218 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3219 }
3220 for _, tc := range testCases {
3221 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003222 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003223 apex {
3224 name: "myapex",
3225 key: "myapex.key",
3226 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003227 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003228 `+tc.additionalProp+`
3229 }
3230 apex_key {
3231 name: "myapex.key",
3232 public_key: "testkey.avbpubkey",
3233 private_key: "testkey.pem",
3234 }
3235 prebuilt_firmware {
3236 name: "myfirmware",
3237 src: "myfirmware.bin",
3238 filename_from_src: true,
3239 `+tc.additionalProp+`
3240 }
3241 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003242 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003243 "etc/firmware/myfirmware.bin",
3244 })
3245 })
3246 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003247}
3248
Jooyung Hanefb184e2020-06-25 17:14:25 +09003249func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003251 apex {
3252 name: "myapex",
3253 key: "myapex.key",
3254 vendor: true,
3255 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003256 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003257 }
3258
3259 apex_key {
3260 name: "myapex.key",
3261 public_key: "testkey.avbpubkey",
3262 private_key: "testkey.pem",
3263 }
3264
3265 cc_library {
3266 name: "mylib",
3267 vendor_available: true,
3268 }
3269 `)
3270
Jooyung Hana0503a52023-08-23 13:12:50 +09003271 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003272 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003273 name := apexBundle.BaseModuleName()
3274 prefix := "TARGET_"
3275 var builder strings.Builder
3276 data.Custom(&builder, name, prefix, "", data)
3277 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003278 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003279}
3280
Jooyung Han2ed99d02020-06-24 23:26:26 +09003281func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003282 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003283 apex {
3284 name: "myapex",
3285 key: "myapex.key",
3286 vintf_fragments: ["fragment.xml"],
3287 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003288 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003289 }
3290 apex_key {
3291 name: "myapex.key",
3292 public_key: "testkey.avbpubkey",
3293 private_key: "testkey.pem",
3294 }
3295 cc_binary {
3296 name: "mybin",
3297 }
3298 `)
3299
Jooyung Hana0503a52023-08-23 13:12:50 +09003300 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003301 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003302 name := apexBundle.BaseModuleName()
3303 prefix := "TARGET_"
3304 var builder strings.Builder
3305 data.Custom(&builder, name, prefix, "", data)
3306 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003307 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003308 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003309}
3310
Jiyong Park16e91a02018-12-20 18:18:08 +09003311func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003312 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003313 apex {
3314 name: "myapex",
3315 key: "myapex.key",
3316 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003317 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003318 }
3319
3320 apex_key {
3321 name: "myapex.key",
3322 public_key: "testkey.avbpubkey",
3323 private_key: "testkey.pem",
3324 }
3325
3326 cc_library {
3327 name: "mylib",
3328 srcs: ["mylib.cpp"],
3329 system_shared_libs: [],
3330 stl: "none",
3331 stubs: {
3332 versions: ["1", "2", "3"],
3333 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003334 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003335 }
3336
3337 cc_binary {
3338 name: "not_in_apex",
3339 srcs: ["mylib.cpp"],
3340 static_libs: ["mylib"],
3341 static_executable: true,
3342 system_shared_libs: [],
3343 stl: "none",
3344 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003345 `)
3346
Colin Cross7113d202019-11-20 16:39:12 -08003347 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003348
3349 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003350 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003351}
Jiyong Park9335a262018-12-24 11:31:58 +09003352
3353func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003354 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003355 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003356 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003357 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003358 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003359 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003360 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003361 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003362 }
3363
3364 cc_library {
3365 name: "mylib",
3366 srcs: ["mylib.cpp"],
3367 system_shared_libs: [],
3368 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003369 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003370 }
3371
3372 apex_key {
3373 name: "myapex.key",
3374 public_key: "testkey.avbpubkey",
3375 private_key: "testkey.pem",
3376 }
3377
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003378 android_app_certificate {
3379 name: "myapex.certificate",
3380 certificate: "testkey",
3381 }
3382
3383 android_app_certificate {
3384 name: "myapex.certificate.override",
3385 certificate: "testkey.override",
3386 }
3387
Jiyong Park9335a262018-12-24 11:31:58 +09003388 `)
3389
3390 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003391 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003392
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003393 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3394 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003395 "vendor/foo/devkeys/testkey.avbpubkey")
3396 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003397 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3398 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003399 "vendor/foo/devkeys/testkey.pem")
3400 }
3401
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003402 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003403 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003404 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003405 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003406 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003407 }
3408}
Jiyong Park58e364a2019-01-19 19:24:06 +09003409
Jooyung Hanf121a652019-12-17 14:30:11 +09003410func TestCertificate(t *testing.T) {
3411 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003412 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003413 apex {
3414 name: "myapex",
3415 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003423 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003424 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3425 if actual := rule.Args["certificates"]; actual != expected {
3426 t.Errorf("certificates should be %q, not %q", expected, actual)
3427 }
3428 })
3429 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003430 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003431 apex {
3432 name: "myapex_keytest",
3433 key: "myapex.key",
3434 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003435 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 }
3437 apex_key {
3438 name: "myapex.key",
3439 public_key: "testkey.avbpubkey",
3440 private_key: "testkey.pem",
3441 }
3442 android_app_certificate {
3443 name: "myapex.certificate.override",
3444 certificate: "testkey.override",
3445 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003446 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 expected := "testkey.override.x509.pem testkey.override.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003453 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003454 apex {
3455 name: "myapex",
3456 key: "myapex.key",
3457 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003458 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003459 }
3460 apex_key {
3461 name: "myapex.key",
3462 public_key: "testkey.avbpubkey",
3463 private_key: "testkey.pem",
3464 }
3465 android_app_certificate {
3466 name: "myapex.certificate",
3467 certificate: "testkey",
3468 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003469 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003470 expected := "testkey.x509.pem testkey.pk8"
3471 if actual := rule.Args["certificates"]; actual != expected {
3472 t.Errorf("certificates should be %q, not %q", expected, actual)
3473 }
3474 })
3475 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003477 apex {
3478 name: "myapex_keytest",
3479 key: "myapex.key",
3480 file_contexts: ":myapex-file_contexts",
3481 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003482 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 }
3484 apex_key {
3485 name: "myapex.key",
3486 public_key: "testkey.avbpubkey",
3487 private_key: "testkey.pem",
3488 }
3489 android_app_certificate {
3490 name: "myapex.certificate.override",
3491 certificate: "testkey.override",
3492 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003493 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003494 expected := "testkey.override.x509.pem testkey.override.pk8"
3495 if actual := rule.Args["certificates"]; actual != expected {
3496 t.Errorf("certificates should be %q, not %q", expected, actual)
3497 }
3498 })
3499 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003500 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003501 apex {
3502 name: "myapex",
3503 key: "myapex.key",
3504 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003505 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003506 }
3507 apex_key {
3508 name: "myapex.key",
3509 public_key: "testkey.avbpubkey",
3510 private_key: "testkey.pem",
3511 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003512 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003513 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3514 if actual := rule.Args["certificates"]; actual != expected {
3515 t.Errorf("certificates should be %q, not %q", expected, actual)
3516 }
3517 })
3518 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003519 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003520 apex {
3521 name: "myapex_keytest",
3522 key: "myapex.key",
3523 file_contexts: ":myapex-file_contexts",
3524 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003525 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003526 }
3527 apex_key {
3528 name: "myapex.key",
3529 public_key: "testkey.avbpubkey",
3530 private_key: "testkey.pem",
3531 }
3532 android_app_certificate {
3533 name: "myapex.certificate.override",
3534 certificate: "testkey.override",
3535 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003536 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003537 expected := "testkey.override.x509.pem testkey.override.pk8"
3538 if actual := rule.Args["certificates"]; actual != expected {
3539 t.Errorf("certificates should be %q, not %q", expected, actual)
3540 }
3541 })
3542}
3543
Jiyong Park58e364a2019-01-19 19:24:06 +09003544func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003545 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003546 apex {
3547 name: "myapex",
3548 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003549 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003550 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003551 }
3552
3553 apex {
3554 name: "otherapex",
3555 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003556 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003557 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003558 }
3559
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565
3566 cc_library {
3567 name: "mylib",
3568 srcs: ["mylib.cpp"],
3569 system_shared_libs: [],
3570 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003571 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003572 "myapex",
3573 "otherapex",
3574 ],
Jooyung Han24282772020-03-21 23:20:55 +09003575 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003576 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003577 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003578 cc_library {
3579 name: "mylib2",
3580 srcs: ["mylib.cpp"],
3581 system_shared_libs: [],
3582 stl: "none",
3583 apex_available: [
3584 "myapex",
3585 "otherapex",
3586 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003587 static_libs: ["mylib3"],
3588 recovery_available: true,
3589 min_sdk_version: "29",
3590 }
3591 cc_library {
3592 name: "mylib3",
3593 srcs: ["mylib.cpp"],
3594 system_shared_libs: [],
3595 stl: "none",
3596 apex_available: [
3597 "myapex",
3598 "otherapex",
3599 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003600 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003601 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003602 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003603 `)
3604
Jooyung Hanc87a0592020-03-02 17:44:33 +09003605 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003606 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003607 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003608
Vinh Tranf9754732023-01-19 22:41:46 -05003609 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003610 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003611 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003612
Vinh Tranf9754732023-01-19 22:41:46 -05003613 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003614 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003615 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003616
Colin Crossaede88c2020-08-11 12:17:01 -07003617 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3618 // each variant defines additional macros to distinguish which apex variant it is built for
3619
3620 // non-APEX variant does not have __ANDROID_APEX__ defined
3621 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3622 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3623
Vinh Tranf9754732023-01-19 22:41:46 -05003624 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003625 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3626 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003627
Jooyung Hanc87a0592020-03-02 17:44:33 +09003628 // non-APEX variant does not have __ANDROID_APEX__ defined
3629 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3630 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3631
Vinh Tranf9754732023-01-19 22:41:46 -05003632 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003633 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003634 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003635}
Jiyong Park7e636d02019-01-28 16:16:54 +09003636
3637func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003638 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003639 apex {
3640 name: "myapex",
3641 key: "myapex.key",
3642 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003643 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003644 }
3645
3646 apex_key {
3647 name: "myapex.key",
3648 public_key: "testkey.avbpubkey",
3649 private_key: "testkey.pem",
3650 }
3651
3652 cc_library_headers {
3653 name: "mylib_headers",
3654 export_include_dirs: ["my_include"],
3655 system_shared_libs: [],
3656 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003657 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003658 }
3659
3660 cc_library {
3661 name: "mylib",
3662 srcs: ["mylib.cpp"],
3663 system_shared_libs: [],
3664 stl: "none",
3665 header_libs: ["mylib_headers"],
3666 export_header_lib_headers: ["mylib_headers"],
3667 stubs: {
3668 versions: ["1", "2", "3"],
3669 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003670 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003671 }
3672
3673 cc_library {
3674 name: "otherlib",
3675 srcs: ["mylib.cpp"],
3676 system_shared_libs: [],
3677 stl: "none",
3678 shared_libs: ["mylib"],
3679 }
3680 `)
3681
Colin Cross7113d202019-11-20 16:39:12 -08003682 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003683
3684 // Ensure that the include path of the header lib is exported to 'otherlib'
3685 ensureContains(t, cFlags, "-Imy_include")
3686}
Alex Light9670d332019-01-29 18:07:33 -08003687
Jiyong Park7cd10e32020-01-14 09:22:18 +09003688type fileInApex struct {
3689 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003690 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003691 isLink bool
3692}
3693
Jooyung Han1724d582022-12-21 10:17:44 +09003694func (f fileInApex) String() string {
3695 return f.src + ":" + f.path
3696}
3697
3698func (f fileInApex) match(expectation string) bool {
3699 parts := strings.Split(expectation, ":")
3700 if len(parts) == 1 {
3701 match, _ := path.Match(parts[0], f.path)
3702 return match
3703 }
3704 if len(parts) == 2 {
3705 matchSrc, _ := path.Match(parts[0], f.src)
3706 matchDst, _ := path.Match(parts[1], f.path)
3707 return matchSrc && matchDst
3708 }
3709 panic("invalid expected file specification: " + expectation)
3710}
3711
Jooyung Hana57af4a2020-01-23 05:36:59 +00003712func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003713 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003714 module := ctx.ModuleForTests(moduleName, variant)
3715 apexRule := module.MaybeRule("apexRule")
3716 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003718 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 for _, cmd := range strings.Split(copyCmds, "&&") {
3720 cmd = strings.TrimSpace(cmd)
3721 if cmd == "" {
3722 continue
3723 }
3724 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003725 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003726 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003727 switch terms[0] {
3728 case "mkdir":
3729 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003730 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 t.Fatal("copyCmds contains invalid cp command", cmd)
3732 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003733 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003734 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003735 isLink = false
3736 case "ln":
3737 if len(terms) != 3 && len(terms) != 4 {
3738 // ln LINK TARGET or ln -s LINK TARGET
3739 t.Fatal("copyCmds contains invalid ln command", cmd)
3740 }
3741 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003742 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003743 isLink = true
3744 default:
3745 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3746 }
3747 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003748 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003749 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003750 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 }
Jooyung Han1724d582022-12-21 10:17:44 +09003752 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003753 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003754 }
3755 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003756 return ret
3757}
3758
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003759func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003760 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003761 var failed bool
3762 var surplus []string
3763 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003764 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003765 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003766 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003767 if file.match(expected) {
3768 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003769 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003770 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 }
3772 }
Jooyung Han1724d582022-12-21 10:17:44 +09003773 if !matchFound {
3774 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003775 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003776 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003777
Jooyung Han31c470b2019-10-18 16:26:59 +09003778 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003779 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 t.Log("surplus files", surplus)
3781 failed = true
3782 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003783
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003784 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003785 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003786 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003787 if !filesMatched[expected] {
3788 missing = append(missing, expected)
3789 }
3790 }
3791 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003792 t.Log("missing files", missing)
3793 failed = true
3794 }
3795 if failed {
3796 t.Fail()
3797 }
3798}
3799
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003800func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3801 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3802}
3803
3804func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003805 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003806 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3807 if deapexer.Output != nil {
3808 outputs = append(outputs, deapexer.Output.String())
3809 }
3810 for _, output := range deapexer.ImplicitOutputs {
3811 outputs = append(outputs, output.String())
3812 }
3813 actualFiles := make([]fileInApex, 0, len(outputs))
3814 for _, output := range outputs {
3815 dir := "/deapexer/"
3816 pos := strings.LastIndex(output, dir)
3817 if pos == -1 {
3818 t.Fatal("Unknown deapexer output ", output)
3819 }
3820 path := output[pos+len(dir):]
3821 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3822 }
3823 assertFileListEquals(t, files, actualFiles)
3824}
3825
Jooyung Han344d5432019-08-23 11:17:39 +09003826func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003827 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003828 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003829 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003830 "etc/llndk.libraries.29.txt",
3831 "etc/vndkcore.libraries.29.txt",
3832 "etc/vndksp.libraries.29.txt",
3833 "etc/vndkprivate.libraries.29.txt",
3834 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003835 }
3836 testCases := []struct {
3837 vndkVersion string
3838 expectedFiles []string
3839 }{
3840 {
3841 vndkVersion: "current",
3842 expectedFiles: append(commonFiles,
3843 "lib/libvndk.so",
3844 "lib/libvndksp.so",
3845 "lib64/libvndk.so",
3846 "lib64/libvndksp.so"),
3847 },
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003848 }
3849 for _, tc := range testCases {
3850 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3851 ctx := testApex(t, `
3852 apex_vndk {
3853 name: "com.android.vndk.current",
3854 key: "com.android.vndk.current.key",
3855 updatable: false,
3856 }
3857
3858 apex_key {
3859 name: "com.android.vndk.current.key",
3860 public_key: "testkey.avbpubkey",
3861 private_key: "testkey.pem",
3862 }
3863
3864 cc_library {
3865 name: "libvndk",
3866 srcs: ["mylib.cpp"],
3867 vendor_available: true,
3868 product_available: true,
3869 vndk: {
3870 enabled: true,
3871 },
3872 system_shared_libs: [],
3873 stl: "none",
3874 apex_available: [ "com.android.vndk.current" ],
3875 }
3876
3877 cc_library {
3878 name: "libvndksp",
3879 srcs: ["mylib.cpp"],
3880 vendor_available: true,
3881 product_available: true,
3882 vndk: {
3883 enabled: true,
3884 support_system_process: true,
3885 },
3886 system_shared_libs: [],
3887 stl: "none",
3888 apex_available: [ "com.android.vndk.current" ],
3889 }
3890
3891 // VNDK-Ext should not cause any problems
3892
3893 cc_library {
3894 name: "libvndk.ext",
3895 srcs: ["mylib2.cpp"],
3896 vendor: true,
3897 vndk: {
3898 enabled: true,
3899 extends: "libvndk",
3900 },
3901 system_shared_libs: [],
3902 stl: "none",
3903 }
3904
3905 cc_library {
3906 name: "libvndksp.ext",
3907 srcs: ["mylib2.cpp"],
3908 vendor: true,
3909 vndk: {
3910 enabled: true,
3911 support_system_process: true,
3912 extends: "libvndksp",
3913 },
3914 system_shared_libs: [],
3915 stl: "none",
3916 }
3917 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3918 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003919 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003920 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003921 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003922 })
3923 }
Jooyung Han344d5432019-08-23 11:17:39 +09003924}
3925
3926func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003927 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003928 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003929 name: "com.android.vndk.current",
3930 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003932 }
3933
3934 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003935 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003936 public_key: "testkey.avbpubkey",
3937 private_key: "testkey.pem",
3938 }
3939
3940 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 name: "libvndk",
3942 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003943 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003944 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003945 vndk: {
3946 enabled: true,
3947 },
3948 system_shared_libs: [],
3949 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003950 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003951 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003952
3953 cc_prebuilt_library_shared {
3954 name: "libvndk.arm",
3955 srcs: ["libvndk.arm.so"],
3956 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003957 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003958 vndk: {
3959 enabled: true,
3960 },
3961 enabled: false,
3962 arch: {
3963 arm: {
3964 enabled: true,
3965 },
3966 },
3967 system_shared_libs: [],
3968 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003969 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003971 `+vndkLibrariesTxtFiles("current"),
3972 withFiles(map[string][]byte{
3973 "libvndk.so": nil,
3974 "libvndk.arm.so": nil,
3975 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003976 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003977 "lib/libvndk.so",
3978 "lib/libvndk.arm.so",
3979 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003980 "lib/libc++.so",
3981 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003982 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 })
Jooyung Han344d5432019-08-23 11:17:39 +09003984}
3985
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986func vndkLibrariesTxtFiles(vers ...string) (result string) {
3987 for _, v := range vers {
3988 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003989 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003990 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003991 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003992 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003993 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003994 }
3995 `
3996 }
Justin Yund5784122023-10-25 13:25:32 +09003997 result += `
3998 llndk_libraries_txt {
3999 name: "llndk.libraries.txt",
4000 }
4001 llndk_libraries_txt_for_apex {
4002 name: "llndk.libraries.txt.apex",
4003 stem: "llndk.libraries.txt",
4004 insert_vndk_version: true,
4005 }
4006 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09004008 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004009 result += `
4010 prebuilt_etc {
4011 name: "` + txt + `.libraries.` + v + `.txt",
4012 src: "dummy.txt",
4013 }
4014 `
4015 }
4016 }
4017 }
4018 return
4019}
4020
Jooyung Han344d5432019-08-23 11:17:39 +09004021func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004022 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004023 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004024 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004025 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004026 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004027 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004028 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004029 }
4030
4031 apex_key {
4032 name: "myapex.key",
4033 public_key: "testkey.avbpubkey",
4034 private_key: "testkey.pem",
4035 }
4036
Jooyung Han31c470b2019-10-18 16:26:59 +09004037 vndk_prebuilt_shared {
4038 name: "libvndk27",
4039 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004040 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004041 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004042 vndk: {
4043 enabled: true,
4044 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 target_arch: "arm64",
4046 arch: {
4047 arm: {
4048 srcs: ["libvndk27_arm.so"],
4049 },
4050 arm64: {
4051 srcs: ["libvndk27_arm64.so"],
4052 },
4053 },
Colin Cross2807f002021-03-02 10:15:29 -08004054 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004055 }
4056
4057 vndk_prebuilt_shared {
4058 name: "libvndk27",
4059 version: "27",
4060 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004061 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004062 vndk: {
4063 enabled: true,
4064 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 target_arch: "x86_64",
4066 arch: {
4067 x86: {
4068 srcs: ["libvndk27_x86.so"],
4069 },
4070 x86_64: {
4071 srcs: ["libvndk27_x86_64.so"],
4072 },
4073 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004074 }
4075 `+vndkLibrariesTxtFiles("27"),
4076 withFiles(map[string][]byte{
4077 "libvndk27_arm.so": nil,
4078 "libvndk27_arm64.so": nil,
4079 "libvndk27_x86.so": nil,
4080 "libvndk27_x86_64.so": nil,
4081 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004082
Jooyung Hana0503a52023-08-23 13:12:50 +09004083 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 "lib/libvndk27_arm.so",
4085 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004086 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 })
Jooyung Han344d5432019-08-23 11:17:39 +09004088}
4089
Jooyung Han90eee022019-10-01 20:02:42 +09004090func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004091 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004092 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004093 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004094 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004095 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004096 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004097 }
4098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004100 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004102 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004103 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004104 }
4105 apex_key {
4106 name: "myapex.key",
4107 public_key: "testkey.avbpubkey",
4108 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004109 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004110
4111 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004112 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004113 apexManifestRule := module.Rule("apexManifestRule")
4114 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004115 }
4116
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004117 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004118 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004119}
4120
Jooyung Han344d5432019-08-23 11:17:39 +09004121func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004122 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004123 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004124 name: "com.android.vndk.current",
4125 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004126 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004127 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004128 }
4129
4130 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004131 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004132 public_key: "testkey.avbpubkey",
4133 private_key: "testkey.pem",
4134 }
4135
4136 cc_library {
4137 name: "libvndk",
4138 srcs: ["mylib.cpp"],
4139 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004140 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004141 native_bridge_supported: true,
4142 host_supported: true,
4143 vndk: {
4144 enabled: true,
4145 },
4146 system_shared_libs: [],
4147 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004148 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004149 }
Colin Cross2807f002021-03-02 10:15:29 -08004150 `+vndkLibrariesTxtFiles("current"),
4151 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004152
Jooyung Hana0503a52023-08-23 13:12:50 +09004153 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004154 "lib/libvndk.so",
4155 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004156 "lib/libc++.so",
4157 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004158 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004159 })
Jooyung Han344d5432019-08-23 11:17:39 +09004160}
4161
4162func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004163 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004164 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004165 name: "com.android.vndk.current",
4166 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004167 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004168 native_bridge_supported: true,
4169 }
4170
4171 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004172 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004173 public_key: "testkey.avbpubkey",
4174 private_key: "testkey.pem",
4175 }
4176
4177 cc_library {
4178 name: "libvndk",
4179 srcs: ["mylib.cpp"],
4180 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004181 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004182 native_bridge_supported: true,
4183 host_supported: true,
4184 vndk: {
4185 enabled: true,
4186 },
4187 system_shared_libs: [],
4188 stl: "none",
4189 }
4190 `)
4191}
4192
Jooyung Han31c470b2019-10-18 16:26:59 +09004193func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004194 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004195 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004196 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004197 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004198 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004199 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004200 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004201 }
4202
4203 apex_key {
4204 name: "myapex.key",
4205 public_key: "testkey.avbpubkey",
4206 private_key: "testkey.pem",
4207 }
4208
4209 vndk_prebuilt_shared {
4210 name: "libvndk27",
4211 version: "27",
4212 target_arch: "arm",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004215 vndk: {
4216 enabled: true,
4217 },
4218 arch: {
4219 arm: {
4220 srcs: ["libvndk27.so"],
4221 }
4222 },
4223 }
4224
4225 vndk_prebuilt_shared {
4226 name: "libvndk27",
4227 version: "27",
4228 target_arch: "arm",
4229 binder32bit: true,
4230 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004231 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004232 vndk: {
4233 enabled: true,
4234 },
4235 arch: {
4236 arm: {
4237 srcs: ["libvndk27binder32.so"],
4238 }
4239 },
Colin Cross2807f002021-03-02 10:15:29 -08004240 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004241 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004242 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004243 withFiles(map[string][]byte{
4244 "libvndk27.so": nil,
4245 "libvndk27binder32.so": nil,
4246 }),
4247 withBinder32bit,
4248 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004249 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004250 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4251 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004252 },
4253 }),
4254 )
4255
Jooyung Hana0503a52023-08-23 13:12:50 +09004256 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004257 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004258 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004259 })
4260}
4261
Jooyung Han45a96772020-06-15 14:59:42 +09004262func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004263 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004264 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004265 name: "com.android.vndk.current",
4266 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004267 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004268 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004269 }
4270
4271 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004272 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004273 public_key: "testkey.avbpubkey",
4274 private_key: "testkey.pem",
4275 }
4276
4277 cc_library {
4278 name: "libz",
4279 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004280 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004281 vndk: {
4282 enabled: true,
4283 },
4284 stubs: {
4285 symbol_file: "libz.map.txt",
4286 versions: ["30"],
4287 }
4288 }
4289 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4290 "libz.map.txt": nil,
4291 }))
4292
Jooyung Hana0503a52023-08-23 13:12:50 +09004293 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004294 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4295 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004296 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004297 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4298 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4299 "*/*",
4300 })
Jooyung Han45a96772020-06-15 14:59:42 +09004301}
4302
Jooyung Hane3f02812023-05-08 13:54:50 +09004303func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4304 ctx := testApex(t, "",
4305 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4306 variables.DeviceVndkVersion = proptools.StringPtr("27")
4307 }),
4308 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4309 cc.RegisterVendorSnapshotModules(ctx)
4310 }),
4311 withFiles(map[string][]byte{
4312 "vendor/foo/Android.bp": []byte(`
4313 apex {
4314 name: "myapex",
4315 binaries: ["foo"],
4316 key: "myapex.key",
4317 min_sdk_version: "27",
4318 vendor: true,
4319 }
4320
4321 cc_binary {
4322 name: "foo",
4323 vendor: true,
4324 srcs: ["abc.cpp"],
4325 shared_libs: [
4326 "libllndk",
4327 "libvndk",
4328 ],
4329 nocrt: true,
4330 system_shared_libs: [],
4331 min_sdk_version: "27",
4332 }
4333
4334 apex_key {
4335 name: "myapex.key",
4336 public_key: "testkey.avbpubkey",
4337 private_key: "testkey.pem",
4338 }
4339 `),
4340 // Simulate VNDK prebuilts with vendor_snapshot
4341 "prebuilts/vndk/Android.bp": []byte(`
4342 vndk_prebuilt_shared {
4343 name: "libllndk",
4344 version: "27",
4345 vendor_available: true,
4346 product_available: true,
4347 target_arch: "arm64",
4348 arch: {
4349 arm64: {
4350 srcs: ["libllndk.so"],
4351 },
4352 },
4353 }
4354
4355 vndk_prebuilt_shared {
4356 name: "libvndk",
4357 version: "27",
4358 vendor_available: true,
4359 product_available: true,
4360 target_arch: "arm64",
4361 arch: {
4362 arm64: {
4363 srcs: ["libvndk.so"],
4364 },
4365 },
4366 vndk: {
4367 enabled: true,
4368 },
4369 min_sdk_version: "27",
4370 }
4371
4372 vndk_prebuilt_shared {
4373 name: "libc++",
4374 version: "27",
4375 target_arch: "arm64",
4376 vendor_available: true,
4377 product_available: true,
4378 vndk: {
4379 enabled: true,
4380 support_system_process: true,
4381 },
4382 arch: {
4383 arm64: {
4384 srcs: ["libc++.so"],
4385 },
4386 },
4387 min_sdk_version: "apex_inherit",
4388 }
4389
4390 vendor_snapshot {
4391 name: "vendor_snapshot",
4392 version: "27",
4393 arch: {
4394 arm64: {
4395 vndk_libs: [
4396 "libc++",
4397 "libllndk",
4398 "libvndk",
4399 ],
4400 static_libs: [
4401 "libc++demangle",
4402 "libclang_rt.builtins",
4403 "libunwind",
4404 ],
4405 },
4406 }
4407 }
4408
4409 vendor_snapshot_static {
4410 name: "libclang_rt.builtins",
4411 version: "27",
4412 target_arch: "arm64",
4413 vendor: true,
4414 arch: {
4415 arm64: {
4416 src: "libclang_rt.builtins-aarch64-android.a",
4417 },
4418 },
4419 }
4420
4421 vendor_snapshot_static {
4422 name: "libc++demangle",
4423 version: "27",
4424 target_arch: "arm64",
4425 compile_multilib: "64",
4426 vendor: true,
4427 arch: {
4428 arm64: {
4429 src: "libc++demangle.a",
4430 },
4431 },
4432 min_sdk_version: "apex_inherit",
4433 }
4434
4435 vendor_snapshot_static {
4436 name: "libunwind",
4437 version: "27",
4438 target_arch: "arm64",
4439 compile_multilib: "64",
4440 vendor: true,
4441 arch: {
4442 arm64: {
4443 src: "libunwind.a",
4444 },
4445 },
4446 min_sdk_version: "apex_inherit",
4447 }
4448 `),
4449 }))
4450
4451 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004452 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004453 "bin/foo",
4454 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4455 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4456 })
4457
4458 // Should link foo with prebuilt libraries (shared/static)
4459 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4460 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4461 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4462 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4463 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4464
4465 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004466 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004467 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4468 ensureListContains(t, requireNativeLibs, "libllndk.so")
4469}
4470
Jooyung Hane1633032019-08-01 17:41:43 +09004471func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004472 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004473 apex {
4474 name: "myapex_nodep",
4475 key: "myapex.key",
4476 native_shared_libs: ["lib_nodep"],
4477 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004478 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004479 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004480 }
4481
4482 apex {
4483 name: "myapex_dep",
4484 key: "myapex.key",
4485 native_shared_libs: ["lib_dep"],
4486 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004487 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004488 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004489 }
4490
4491 apex {
4492 name: "myapex_provider",
4493 key: "myapex.key",
4494 native_shared_libs: ["libfoo"],
4495 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004496 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004497 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004498 }
4499
4500 apex {
4501 name: "myapex_selfcontained",
4502 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004503 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004504 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004505 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004506 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004507 }
4508
4509 apex_key {
4510 name: "myapex.key",
4511 public_key: "testkey.avbpubkey",
4512 private_key: "testkey.pem",
4513 }
4514
4515 cc_library {
4516 name: "lib_nodep",
4517 srcs: ["mylib.cpp"],
4518 system_shared_libs: [],
4519 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004520 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004521 }
4522
4523 cc_library {
4524 name: "lib_dep",
4525 srcs: ["mylib.cpp"],
4526 shared_libs: ["libfoo"],
4527 system_shared_libs: [],
4528 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004529 apex_available: [
4530 "myapex_dep",
4531 "myapex_provider",
4532 "myapex_selfcontained",
4533 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004534 }
4535
4536 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004537 name: "lib_dep_on_bar",
4538 srcs: ["mylib.cpp"],
4539 shared_libs: ["libbar"],
4540 system_shared_libs: [],
4541 stl: "none",
4542 apex_available: [
4543 "myapex_selfcontained",
4544 ],
4545 }
4546
4547
4548 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004549 name: "libfoo",
4550 srcs: ["mytest.cpp"],
4551 stubs: {
4552 versions: ["1"],
4553 },
4554 system_shared_libs: [],
4555 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004556 apex_available: [
4557 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004558 ],
4559 }
4560
4561 cc_library {
4562 name: "libbar",
4563 srcs: ["mytest.cpp"],
4564 stubs: {
4565 versions: ["1"],
4566 },
4567 system_shared_libs: [],
4568 stl: "none",
4569 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004570 "myapex_selfcontained",
4571 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004572 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004573
Jooyung Hane1633032019-08-01 17:41:43 +09004574 `)
4575
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004576 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004577 var provideNativeLibs, requireNativeLibs []string
4578
Jooyung Hana0503a52023-08-23 13:12:50 +09004579 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004580 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4581 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004582 ensureListEmpty(t, provideNativeLibs)
4583 ensureListEmpty(t, requireNativeLibs)
4584
Jooyung Hana0503a52023-08-23 13:12:50 +09004585 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004586 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4587 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004588 ensureListEmpty(t, provideNativeLibs)
4589 ensureListContains(t, requireNativeLibs, "libfoo.so")
4590
Jooyung Hana0503a52023-08-23 13:12:50 +09004591 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004592 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4593 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004594 ensureListContains(t, provideNativeLibs, "libfoo.so")
4595 ensureListEmpty(t, requireNativeLibs)
4596
Jooyung Hana0503a52023-08-23 13:12:50 +09004597 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004598 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4599 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004600 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004601 ensureListEmpty(t, requireNativeLibs)
4602}
4603
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004604func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4605 ctx := testApex(t, `
4606 apex {
4607 name: "myapex",
4608 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004609 native_shared_libs: ["mylib"],
4610 updatable: false,
4611 }
4612
4613 apex_key {
4614 name: "myapex.key",
4615 public_key: "testkey.avbpubkey",
4616 private_key: "testkey.pem",
4617 }
4618
4619 cc_library {
4620 name: "mylib",
4621 srcs: ["mylib.cpp"],
4622 system_shared_libs: [],
4623 stl: "none",
4624 apex_available: [
4625 "//apex_available:platform",
4626 "myapex",
4627 ],
4628 }
4629 `, android.FixtureMergeEnv(map[string]string{
4630 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4631 }))
4632
Jooyung Hana0503a52023-08-23 13:12:50 +09004633 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004634 apexManifestRule := module.Rule("apexManifestRule")
4635 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4636}
4637
Vinh Tran8f5310f2022-10-07 18:16:47 -04004638func TestCompileMultilibProp(t *testing.T) {
4639 testCases := []struct {
4640 compileMultiLibProp string
4641 containedLibs []string
4642 notContainedLibs []string
4643 }{
4644 {
4645 containedLibs: []string{
4646 "image.apex/lib64/mylib.so",
4647 "image.apex/lib/mylib.so",
4648 },
4649 compileMultiLibProp: `compile_multilib: "both",`,
4650 },
4651 {
4652 containedLibs: []string{"image.apex/lib64/mylib.so"},
4653 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4654 compileMultiLibProp: `compile_multilib: "first",`,
4655 },
4656 {
4657 containedLibs: []string{"image.apex/lib64/mylib.so"},
4658 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4659 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4660 },
4661 {
4662 containedLibs: []string{"image.apex/lib64/mylib.so"},
4663 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4664 compileMultiLibProp: `compile_multilib: "64",`,
4665 },
4666 {
4667 containedLibs: []string{"image.apex/lib/mylib.so"},
4668 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4669 compileMultiLibProp: `compile_multilib: "32",`,
4670 },
4671 }
4672 for _, testCase := range testCases {
4673 ctx := testApex(t, fmt.Sprintf(`
4674 apex {
4675 name: "myapex",
4676 key: "myapex.key",
4677 %s
4678 native_shared_libs: ["mylib"],
4679 updatable: false,
4680 }
4681 apex_key {
4682 name: "myapex.key",
4683 public_key: "testkey.avbpubkey",
4684 private_key: "testkey.pem",
4685 }
4686 cc_library {
4687 name: "mylib",
4688 srcs: ["mylib.cpp"],
4689 apex_available: [
4690 "//apex_available:platform",
4691 "myapex",
4692 ],
4693 }
4694 `, testCase.compileMultiLibProp),
4695 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004696 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004697 apexRule := module.Rule("apexRule")
4698 copyCmds := apexRule.Args["copy_commands"]
4699 for _, containedLib := range testCase.containedLibs {
4700 ensureContains(t, copyCmds, containedLib)
4701 }
4702 for _, notContainedLib := range testCase.notContainedLibs {
4703 ensureNotContains(t, copyCmds, notContainedLib)
4704 }
4705 }
4706}
4707
Alex Light0851b882019-02-07 13:20:53 -08004708func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004709 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
4713 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004714 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004715 }
4716
4717 apex_key {
4718 name: "myapex.key",
4719 public_key: "testkey.avbpubkey",
4720 private_key: "testkey.pem",
4721 }
4722
4723 cc_library {
4724 name: "mylib_common",
4725 srcs: ["mylib.cpp"],
4726 system_shared_libs: [],
4727 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004728 apex_available: [
4729 "//apex_available:platform",
4730 "myapex",
4731 ],
Alex Light0851b882019-02-07 13:20:53 -08004732 }
4733 `)
4734
Jooyung Hana0503a52023-08-23 13:12:50 +09004735 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004736 apexRule := module.Rule("apexRule")
4737 copyCmds := apexRule.Args["copy_commands"]
4738
4739 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4740 t.Log("Apex was a test apex!")
4741 t.Fail()
4742 }
4743 // Ensure that main rule creates an output
4744 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4745
4746 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004747 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004748
4749 // Ensure that both direct and indirect deps are copied into apex
4750 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4751
Colin Cross7113d202019-11-20 16:39:12 -08004752 // Ensure that the platform variant ends with _shared
4753 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004754
Colin Cross56a83212020-09-15 18:30:11 -07004755 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004756 t.Log("Found mylib_common not in any apex!")
4757 t.Fail()
4758 }
4759}
4760
4761func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004762 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004763 apex_test {
4764 name: "myapex",
4765 key: "myapex.key",
4766 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004767 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004768 }
4769
4770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775
4776 cc_library {
4777 name: "mylib_common_test",
4778 srcs: ["mylib.cpp"],
4779 system_shared_libs: [],
4780 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004781 // TODO: remove //apex_available:platform
4782 apex_available: [
4783 "//apex_available:platform",
4784 "myapex",
4785 ],
Alex Light0851b882019-02-07 13:20:53 -08004786 }
4787 `)
4788
Jooyung Hana0503a52023-08-23 13:12:50 +09004789 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004790 apexRule := module.Rule("apexRule")
4791 copyCmds := apexRule.Args["copy_commands"]
4792
4793 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4794 t.Log("Apex was not a test apex!")
4795 t.Fail()
4796 }
4797 // Ensure that main rule creates an output
4798 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4799
4800 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004802
4803 // Ensure that both direct and indirect deps are copied into apex
4804 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4805
Colin Cross7113d202019-11-20 16:39:12 -08004806 // Ensure that the platform variant ends with _shared
4807 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004808}
4809
Jooyung Han85707de2023-12-01 14:21:13 +09004810func TestLibzVendorIsntStable(t *testing.T) {
4811 ctx := testApex(t, `
4812 apex {
4813 name: "myapex",
4814 key: "myapex.key",
4815 updatable: false,
4816 binaries: ["mybin"],
4817 }
4818 apex {
4819 name: "myvendorapex",
4820 key: "myapex.key",
4821 file_contexts: "myvendorapex_file_contexts",
4822 vendor: true,
4823 updatable: false,
4824 binaries: ["mybin"],
4825 }
4826 apex_key {
4827 name: "myapex.key",
4828 public_key: "testkey.avbpubkey",
4829 private_key: "testkey.pem",
4830 }
4831 cc_binary {
4832 name: "mybin",
4833 vendor_available: true,
4834 system_shared_libs: [],
4835 stl: "none",
4836 shared_libs: ["libz"],
4837 apex_available: ["//apex_available:anyapex"],
4838 }
4839 cc_library {
4840 name: "libz",
4841 vendor_available: true,
4842 system_shared_libs: [],
4843 stl: "none",
4844 stubs: {
4845 versions: ["28", "30"],
4846 },
4847 target: {
4848 vendor: {
4849 no_stubs: true,
4850 },
4851 },
4852 }
4853 `, withFiles(map[string][]byte{
4854 "myvendorapex_file_contexts": nil,
4855 }))
4856
4857 // libz provides stubs for core variant.
4858 {
4859 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4860 "bin/mybin",
4861 })
4862 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4863 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4864 }
4865 // libz doesn't provide stubs for vendor variant.
4866 {
4867 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4868 "bin/mybin",
4869 "lib64/libz.so",
4870 })
4871 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4872 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4873 }
4874}
4875
Alex Light9670d332019-01-29 18:07:33 -08004876func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004877 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004878 apex {
4879 name: "myapex",
4880 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004881 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004882 multilib: {
4883 first: {
4884 native_shared_libs: ["mylib_common"],
4885 }
4886 },
4887 target: {
4888 android: {
4889 multilib: {
4890 first: {
4891 native_shared_libs: ["mylib"],
4892 }
4893 }
4894 },
4895 host: {
4896 multilib: {
4897 first: {
4898 native_shared_libs: ["mylib2"],
4899 }
4900 }
4901 }
4902 }
4903 }
4904
4905 apex_key {
4906 name: "myapex.key",
4907 public_key: "testkey.avbpubkey",
4908 private_key: "testkey.pem",
4909 }
4910
4911 cc_library {
4912 name: "mylib",
4913 srcs: ["mylib.cpp"],
4914 system_shared_libs: [],
4915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004916 // TODO: remove //apex_available:platform
4917 apex_available: [
4918 "//apex_available:platform",
4919 "myapex",
4920 ],
Alex Light9670d332019-01-29 18:07:33 -08004921 }
4922
4923 cc_library {
4924 name: "mylib_common",
4925 srcs: ["mylib.cpp"],
4926 system_shared_libs: [],
4927 stl: "none",
4928 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004929 // TODO: remove //apex_available:platform
4930 apex_available: [
4931 "//apex_available:platform",
4932 "myapex",
4933 ],
Alex Light9670d332019-01-29 18:07:33 -08004934 }
4935
4936 cc_library {
4937 name: "mylib2",
4938 srcs: ["mylib.cpp"],
4939 system_shared_libs: [],
4940 stl: "none",
4941 compile_multilib: "first",
4942 }
4943 `)
4944
Jooyung Hana0503a52023-08-23 13:12:50 +09004945 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004946 copyCmds := apexRule.Args["copy_commands"]
4947
4948 // Ensure that main rule creates an output
4949 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4950
4951 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004952 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4953 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4954 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004955
4956 // Ensure that both direct and indirect deps are copied into apex
4957 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4958 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4959 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4960
Colin Cross7113d202019-11-20 16:39:12 -08004961 // Ensure that the platform variant ends with _shared
4962 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4964 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004965}
Jiyong Park04480cf2019-02-06 00:16:29 +09004966
Jiyong Park59140302020-12-14 18:44:04 +09004967func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004968 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004969 apex {
4970 name: "myapex",
4971 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004972 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004973 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004974 arch: {
4975 arm64: {
4976 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004977 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004978 },
4979 x86_64: {
4980 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004981 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004982 },
4983 }
4984 }
4985
4986 apex_key {
4987 name: "myapex.key",
4988 public_key: "testkey.avbpubkey",
4989 private_key: "testkey.pem",
4990 }
4991
4992 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004993 name: "mylib.generic",
4994 srcs: ["mylib.cpp"],
4995 system_shared_libs: [],
4996 stl: "none",
4997 // TODO: remove //apex_available:platform
4998 apex_available: [
4999 "//apex_available:platform",
5000 "myapex",
5001 ],
5002 }
5003
5004 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09005005 name: "mylib.arm64",
5006 srcs: ["mylib.cpp"],
5007 system_shared_libs: [],
5008 stl: "none",
5009 // TODO: remove //apex_available:platform
5010 apex_available: [
5011 "//apex_available:platform",
5012 "myapex",
5013 ],
5014 }
5015
5016 cc_library {
5017 name: "mylib.x64",
5018 srcs: ["mylib.cpp"],
5019 system_shared_libs: [],
5020 stl: "none",
5021 // TODO: remove //apex_available:platform
5022 apex_available: [
5023 "//apex_available:platform",
5024 "myapex",
5025 ],
5026 }
5027 `)
5028
Jooyung Hana0503a52023-08-23 13:12:50 +09005029 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09005030 copyCmds := apexRule.Args["copy_commands"]
5031
5032 // Ensure that apex variant is created for the direct dep
5033 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07005034 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09005035 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
5036
5037 // Ensure that both direct and indirect deps are copied into apex
5038 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
5039 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
5040}
5041
Jiyong Park04480cf2019-02-06 00:16:29 +09005042func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005043 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09005044 apex {
5045 name: "myapex",
5046 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00005047 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005048 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00005049 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09005050 }
5051
5052 apex_key {
5053 name: "myapex.key",
5054 public_key: "testkey.avbpubkey",
5055 private_key: "testkey.pem",
5056 }
5057
5058 sh_binary {
5059 name: "myscript",
5060 src: "mylib.cpp",
5061 filename: "myscript.sh",
5062 sub_dir: "script",
5063 }
5064 `)
5065
Jooyung Hana0503a52023-08-23 13:12:50 +09005066 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09005067 copyCmds := apexRule.Args["copy_commands"]
5068
5069 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
5070}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005071
Jooyung Han91df2082019-11-20 01:49:42 +09005072func TestApexInVariousPartition(t *testing.T) {
5073 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005074 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005075 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005076 {"", "system"},
5077 {"product_specific: true", "product"},
5078 {"soc_specific: true", "vendor"},
5079 {"proprietary: true", "vendor"},
5080 {"vendor: true", "vendor"},
5081 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005082 }
5083 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005084 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005085 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005086 apex {
5087 name: "myapex",
5088 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005089 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005090 `+tc.propName+`
5091 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005092
Jooyung Han91df2082019-11-20 01:49:42 +09005093 apex_key {
5094 name: "myapex.key",
5095 public_key: "testkey.avbpubkey",
5096 private_key: "testkey.pem",
5097 }
5098 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005099
Jooyung Hana0503a52023-08-23 13:12:50 +09005100 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005101 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005102 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005103 if actual != expected {
5104 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5105 }
Jooyung Han91df2082019-11-20 01:49:42 +09005106 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005107 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005108}
Jiyong Park67882562019-03-21 01:11:21 +09005109
Jooyung Han580eb4f2020-06-24 19:33:06 +09005110func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005111 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 apex {
5113 name: "myapex",
5114 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005115 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005117
Jooyung Han580eb4f2020-06-24 19:33:06 +09005118 apex_key {
5119 name: "myapex.key",
5120 public_key: "testkey.avbpubkey",
5121 private_key: "testkey.pem",
5122 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005123 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005124 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 rule := module.Output("file_contexts")
5126 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5127}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005128
Jooyung Han580eb4f2020-06-24 19:33:06 +09005129func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005130 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005131 apex {
5132 name: "myapex",
5133 key: "myapex.key",
5134 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005135 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005136 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005137
Jooyung Han580eb4f2020-06-24 19:33:06 +09005138 apex_key {
5139 name: "myapex.key",
5140 public_key: "testkey.avbpubkey",
5141 private_key: "testkey.pem",
5142 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005143 `, withFiles(map[string][]byte{
5144 "my_own_file_contexts": nil,
5145 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005146}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005147
Jooyung Han580eb4f2020-06-24 19:33:06 +09005148func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005149 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005150 apex {
5151 name: "myapex",
5152 key: "myapex.key",
5153 product_specific: true,
5154 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005155 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005156 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005157
Jooyung Han580eb4f2020-06-24 19:33:06 +09005158 apex_key {
5159 name: "myapex.key",
5160 public_key: "testkey.avbpubkey",
5161 private_key: "testkey.pem",
5162 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005163 `)
5164
Colin Cross1c460562021-02-16 17:55:47 -08005165 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005166 apex {
5167 name: "myapex",
5168 key: "myapex.key",
5169 product_specific: true,
5170 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005171 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005172 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005173
Jooyung Han580eb4f2020-06-24 19:33:06 +09005174 apex_key {
5175 name: "myapex.key",
5176 public_key: "testkey.avbpubkey",
5177 private_key: "testkey.pem",
5178 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005179 `, withFiles(map[string][]byte{
5180 "product_specific_file_contexts": nil,
5181 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005182 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005183 rule := module.Output("file_contexts")
5184 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5185}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005186
Jooyung Han580eb4f2020-06-24 19:33:06 +09005187func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005188 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005189 apex {
5190 name: "myapex",
5191 key: "myapex.key",
5192 product_specific: true,
5193 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005194 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005195 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005196
Jooyung Han580eb4f2020-06-24 19:33:06 +09005197 apex_key {
5198 name: "myapex.key",
5199 public_key: "testkey.avbpubkey",
5200 private_key: "testkey.pem",
5201 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005202
Jooyung Han580eb4f2020-06-24 19:33:06 +09005203 filegroup {
5204 name: "my-file-contexts",
5205 srcs: ["product_specific_file_contexts"],
5206 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005207 `, withFiles(map[string][]byte{
5208 "product_specific_file_contexts": nil,
5209 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005210 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005211 rule := module.Output("file_contexts")
5212 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005213}
5214
Jiyong Park67882562019-03-21 01:11:21 +09005215func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005216 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005217 apex_key {
5218 name: "myapex.key",
5219 public_key: ":my.avbpubkey",
5220 private_key: ":my.pem",
5221 product_specific: true,
5222 }
5223
5224 filegroup {
5225 name: "my.avbpubkey",
5226 srcs: ["testkey2.avbpubkey"],
5227 }
5228
5229 filegroup {
5230 name: "my.pem",
5231 srcs: ["testkey2.pem"],
5232 }
5233 `)
5234
5235 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5236 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005237 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005238 if actual_pubkey != expected_pubkey {
5239 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5240 }
5241 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005242 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005243 if actual_privkey != expected_privkey {
5244 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5245 }
5246}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005247
5248func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005249 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005250 prebuilt_apex {
5251 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005252 arch: {
5253 arm64: {
5254 src: "myapex-arm64.apex",
5255 },
5256 arm: {
5257 src: "myapex-arm.apex",
5258 },
5259 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005260 }
5261 `)
5262
Wei Li340ee8e2022-03-18 17:33:24 -07005263 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5264 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005265
Jiyong Parkc95714e2019-03-29 14:23:10 +09005266 expectedInput := "myapex-arm64.apex"
5267 if prebuilt.inputApex.String() != expectedInput {
5268 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5269 }
Wei Li340ee8e2022-03-18 17:33:24 -07005270 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5271 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5272 rule := testingModule.Rule("genProvenanceMetaData")
5273 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5274 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5275 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5276 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005277
5278 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5279 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005280}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005281
Paul Duffinc0609c62021-03-01 17:27:16 +00005282func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005283 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005284 prebuilt_apex {
5285 name: "myapex",
5286 }
5287 `)
5288}
5289
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005290func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005291 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005292 prebuilt_apex {
5293 name: "myapex",
5294 src: "myapex-arm.apex",
5295 filename: "notmyapex.apex",
5296 }
5297 `)
5298
Wei Li340ee8e2022-03-18 17:33:24 -07005299 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5300 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005301
5302 expected := "notmyapex.apex"
5303 if p.installFilename != expected {
5304 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5305 }
Wei Li340ee8e2022-03-18 17:33:24 -07005306 rule := testingModule.Rule("genProvenanceMetaData")
5307 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5308 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5309 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5310 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005311}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005312
Samiul Islam7c02e262021-09-08 17:48:28 +01005313func TestApexSetFilenameOverride(t *testing.T) {
5314 testApex(t, `
5315 apex_set {
5316 name: "com.company.android.myapex",
5317 apex_name: "com.android.myapex",
5318 set: "company-myapex.apks",
5319 filename: "com.company.android.myapex.apex"
5320 }
5321 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5322
5323 testApex(t, `
5324 apex_set {
5325 name: "com.company.android.myapex",
5326 apex_name: "com.android.myapex",
5327 set: "company-myapex.apks",
5328 filename: "com.company.android.myapex.capex"
5329 }
5330 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5331
5332 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5333 apex_set {
5334 name: "com.company.android.myapex",
5335 apex_name: "com.android.myapex",
5336 set: "company-myapex.apks",
5337 filename: "some-random-suffix"
5338 }
5339 `)
5340}
5341
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005342func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005343 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005344 prebuilt_apex {
5345 name: "myapex.prebuilt",
5346 src: "myapex-arm.apex",
5347 overrides: [
5348 "myapex",
5349 ],
5350 }
5351 `)
5352
Wei Li340ee8e2022-03-18 17:33:24 -07005353 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5354 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005355
5356 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005357 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005358 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005359 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005360 }
Wei Li340ee8e2022-03-18 17:33:24 -07005361 rule := testingModule.Rule("genProvenanceMetaData")
5362 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5363 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5364 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5365 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005366}
5367
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005368func TestPrebuiltApexName(t *testing.T) {
5369 testApex(t, `
5370 prebuilt_apex {
5371 name: "com.company.android.myapex",
5372 apex_name: "com.android.myapex",
5373 src: "company-myapex-arm.apex",
5374 }
5375 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5376
5377 testApex(t, `
5378 apex_set {
5379 name: "com.company.android.myapex",
5380 apex_name: "com.android.myapex",
5381 set: "company-myapex.apks",
5382 }
5383 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5384}
5385
5386func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5387 _ = android.GroupFixturePreparers(
5388 java.PrepareForTestWithJavaDefaultModules,
5389 PrepareForTestWithApexBuildComponents,
5390 android.FixtureWithRootAndroidBp(`
5391 platform_bootclasspath {
5392 name: "platform-bootclasspath",
5393 fragments: [
5394 {
5395 apex: "com.android.art",
5396 module: "art-bootclasspath-fragment",
5397 },
5398 ],
5399 }
5400
5401 prebuilt_apex {
5402 name: "com.company.android.art",
5403 apex_name: "com.android.art",
5404 src: "com.company.android.art-arm.apex",
5405 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5406 }
5407
5408 prebuilt_bootclasspath_fragment {
5409 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005410 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005411 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005412 hidden_api: {
5413 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5414 metadata: "my-bootclasspath-fragment/metadata.csv",
5415 index: "my-bootclasspath-fragment/index.csv",
5416 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5417 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5418 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005419 }
5420
5421 java_import {
5422 name: "core-oj",
5423 jars: ["prebuilt.jar"],
5424 }
5425 `),
5426 ).RunTest(t)
5427}
5428
Spandan Das59a4a2b2024-01-09 21:35:56 +00005429// A minimal context object for use with DexJarBuildPath
5430type moduleErrorfTestCtx struct {
5431}
5432
5433func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5434}
5435
Paul Duffin092153d2021-01-26 11:42:39 +00005436// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5437// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005438func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005439 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005440
Paul Duffin89886cb2021-02-05 16:44:03 +00005441 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005442 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005443 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005444 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005445 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005446 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005447 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005448 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 android.NormalizePathForTesting(dexJarBuildPath))
5450 }
5451
5452 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005453 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005454 // Make sure the import has been given the correct path to the dex jar.
5455 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5456 dexJarBuildPath := p.DexJarInstallPath()
5457 stem := android.RemoveOptionalPrebuiltPrefix(name)
5458 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5459 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5460 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005461 }
5462
Paul Duffin39853512021-02-26 11:09:39 +00005463 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005464 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005465 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005466 android.AssertArrayString(t, "Check if there is no source variant",
5467 []string{"android_common"},
5468 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005469 }
5470
5471 t.Run("prebuilt only", func(t *testing.T) {
5472 bp := `
5473 prebuilt_apex {
5474 name: "myapex",
5475 arch: {
5476 arm64: {
5477 src: "myapex-arm64.apex",
5478 },
5479 arm: {
5480 src: "myapex-arm.apex",
5481 },
5482 },
Paul Duffin39853512021-02-26 11:09:39 +00005483 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005484 }
5485
5486 java_import {
5487 name: "libfoo",
5488 jars: ["libfoo.jar"],
5489 }
Paul Duffin39853512021-02-26 11:09:39 +00005490
5491 java_sdk_library_import {
5492 name: "libbar",
5493 public: {
5494 jars: ["libbar.jar"],
5495 },
5496 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005497 `
5498
5499 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5500 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5501
Spandan Das3576e762024-01-03 18:57:03 +00005502 deapexerName := deapexerModuleName("prebuilt_myapex")
5503 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005504
Paul Duffinf6932af2021-02-26 18:21:56 +00005505 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005506 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005507 rule := deapexer.Rule("deapexer")
5508 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5509 t.Errorf("expected: %q, found: %q", expected, actual)
5510 }
5511
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005512 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005513 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005514 rule = prebuiltApex.Rule("android/soong/android.Cp")
5515 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5516 t.Errorf("expected: %q, found: %q", expected, actual)
5517 }
5518
Paul Duffin89886cb2021-02-05 16:44:03 +00005519 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005520 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005521
5522 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005523 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005524 })
5525
5526 t.Run("prebuilt with source preferred", func(t *testing.T) {
5527
5528 bp := `
5529 prebuilt_apex {
5530 name: "myapex",
5531 arch: {
5532 arm64: {
5533 src: "myapex-arm64.apex",
5534 },
5535 arm: {
5536 src: "myapex-arm.apex",
5537 },
5538 },
Paul Duffin39853512021-02-26 11:09:39 +00005539 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005540 }
5541
5542 java_import {
5543 name: "libfoo",
5544 jars: ["libfoo.jar"],
5545 }
5546
5547 java_library {
5548 name: "libfoo",
5549 }
Paul Duffin39853512021-02-26 11:09:39 +00005550
5551 java_sdk_library_import {
5552 name: "libbar",
5553 public: {
5554 jars: ["libbar.jar"],
5555 },
5556 }
5557
5558 java_sdk_library {
5559 name: "libbar",
5560 srcs: ["foo/bar/MyClass.java"],
5561 unsafe_ignore_missing_latest_api: true,
5562 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005563 `
5564
5565 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5566 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5567
Paul Duffin89886cb2021-02-05 16:44:03 +00005568 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005569 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005570 ensureNoSourceVariant(t, ctx, "libfoo")
5571
5572 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005573 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005574 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005575 })
5576
5577 t.Run("prebuilt preferred with source", func(t *testing.T) {
5578 bp := `
5579 prebuilt_apex {
5580 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005581 arch: {
5582 arm64: {
5583 src: "myapex-arm64.apex",
5584 },
5585 arm: {
5586 src: "myapex-arm.apex",
5587 },
5588 },
Paul Duffin39853512021-02-26 11:09:39 +00005589 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005590 }
5591
5592 java_import {
5593 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005594 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005595 jars: ["libfoo.jar"],
5596 }
5597
5598 java_library {
5599 name: "libfoo",
5600 }
Paul Duffin39853512021-02-26 11:09:39 +00005601
5602 java_sdk_library_import {
5603 name: "libbar",
5604 prefer: true,
5605 public: {
5606 jars: ["libbar.jar"],
5607 },
5608 }
5609
5610 java_sdk_library {
5611 name: "libbar",
5612 srcs: ["foo/bar/MyClass.java"],
5613 unsafe_ignore_missing_latest_api: true,
5614 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005615 `
5616
5617 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5618 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5619
Paul Duffin89886cb2021-02-05 16:44:03 +00005620 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005621 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005622 ensureNoSourceVariant(t, ctx, "libfoo")
5623
5624 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005625 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005626 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005627 })
5628}
5629
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005630func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005631 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005632 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005633 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5634 // is disabled.
5635 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5636 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005637
Paul Duffin37856732021-02-26 14:24:15 +00005638 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5639 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005640 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005641 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005642 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005644 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 foundLibfooJar = true
5646 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005647 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005648 }
5649 }
5650 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005651 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 }
5653 }
5654
Paul Duffin40a3f652021-07-19 13:11:24 +01005655 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005656 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005657 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005658 var rule android.TestingBuildParams
5659
5660 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5661 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005662 }
5663
Paul Duffin40a3f652021-07-19 13:11:24 +01005664 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5665 t.Helper()
5666 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5667 var rule android.TestingBuildParams
5668
5669 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5670 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5671 }
5672
Paul Duffin89f570a2021-06-16 01:42:33 +01005673 fragment := java.ApexVariantReference{
5674 Apex: proptools.StringPtr("myapex"),
5675 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5676 }
5677
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005678 t.Run("prebuilt only", func(t *testing.T) {
5679 bp := `
5680 prebuilt_apex {
5681 name: "myapex",
5682 arch: {
5683 arm64: {
5684 src: "myapex-arm64.apex",
5685 },
5686 arm: {
5687 src: "myapex-arm.apex",
5688 },
5689 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005690 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5691 }
5692
5693 prebuilt_bootclasspath_fragment {
5694 name: "my-bootclasspath-fragment",
5695 contents: ["libfoo", "libbar"],
5696 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005697 hidden_api: {
5698 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5699 metadata: "my-bootclasspath-fragment/metadata.csv",
5700 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005701 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5702 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5703 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005704 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705 }
5706
5707 java_import {
5708 name: "libfoo",
5709 jars: ["libfoo.jar"],
5710 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005711 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005712 }
Paul Duffin37856732021-02-26 14:24:15 +00005713
5714 java_sdk_library_import {
5715 name: "libbar",
5716 public: {
5717 jars: ["libbar.jar"],
5718 },
5719 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005720 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005721 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005722 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005723 `
5724
Paul Duffin89f570a2021-06-16 01:42:33 +01005725 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005726 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5727 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005728
Paul Duffin537ea3d2021-05-14 10:38:00 +01005729 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005730 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005731 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005732 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005733 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005734 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005735 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005736 })
5737
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005738 t.Run("apex_set only", func(t *testing.T) {
5739 bp := `
5740 apex_set {
5741 name: "myapex",
5742 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005743 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005744 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005745 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5746 }
5747
5748 java_import {
5749 name: "myjavalib",
5750 jars: ["myjavalib.jar"],
5751 apex_available: ["myapex"],
5752 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005753 }
5754
5755 prebuilt_bootclasspath_fragment {
5756 name: "my-bootclasspath-fragment",
5757 contents: ["libfoo", "libbar"],
5758 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005759 hidden_api: {
5760 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5761 metadata: "my-bootclasspath-fragment/metadata.csv",
5762 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005763 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5764 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5765 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005766 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005767 }
5768
Liz Kammer2dc72442023-04-20 10:10:48 -04005769 prebuilt_systemserverclasspath_fragment {
5770 name: "my-systemserverclasspath-fragment",
5771 contents: ["libbaz"],
5772 apex_available: ["myapex"],
5773 }
5774
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005775 java_import {
5776 name: "libfoo",
5777 jars: ["libfoo.jar"],
5778 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005779 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005780 }
5781
5782 java_sdk_library_import {
5783 name: "libbar",
5784 public: {
5785 jars: ["libbar.jar"],
5786 },
5787 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005788 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005789 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005790 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005791
5792 java_sdk_library_import {
5793 name: "libbaz",
5794 public: {
5795 jars: ["libbaz.jar"],
5796 },
5797 apex_available: ["myapex"],
5798 shared_library: false,
5799 permitted_packages: ["baz"],
5800 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005801 `
5802
Paul Duffin89f570a2021-06-16 01:42:33 +01005803 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005804 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5805 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005806
Paul Duffin537ea3d2021-05-14 10:38:00 +01005807 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005808 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005809 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005810 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005811 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005813 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005814
5815 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5816
5817 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005818 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005819 "myjavalib.myapex",
5820 "libfoo.myapex",
5821 "libbar.myapex",
5822 "libbaz.myapex",
5823 }
5824 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5825 for i, e := range mkEntries {
5826 g := e.OverrideName
5827 if w := overrideNames[i]; w != g {
5828 t.Errorf("Expected override name %q, got %q", w, g)
5829 }
5830 }
5831
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005832 })
5833
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005834 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5835 bp := `
5836 prebuilt_apex {
5837 name: "myapex",
5838 arch: {
5839 arm64: {
5840 src: "myapex-arm64.apex",
5841 },
5842 arm: {
5843 src: "myapex-arm.apex",
5844 },
5845 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005846 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5847 }
5848
5849 prebuilt_bootclasspath_fragment {
5850 name: "my-bootclasspath-fragment",
5851 contents: ["libfoo", "libbar"],
5852 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005853 hidden_api: {
5854 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5855 metadata: "my-bootclasspath-fragment/metadata.csv",
5856 index: "my-bootclasspath-fragment/index.csv",
5857 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5858 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5859 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005860 }
5861
5862 java_import {
5863 name: "libfoo",
5864 jars: ["libfoo.jar"],
5865 apex_available: ["myapex"],
5866 }
5867
5868 java_library {
5869 name: "libfoo",
5870 srcs: ["foo/bar/MyClass.java"],
5871 apex_available: ["myapex"],
5872 }
Paul Duffin37856732021-02-26 14:24:15 +00005873
5874 java_sdk_library_import {
5875 name: "libbar",
5876 public: {
5877 jars: ["libbar.jar"],
5878 },
5879 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005880 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005881 }
5882
5883 java_sdk_library {
5884 name: "libbar",
5885 srcs: ["foo/bar/MyClass.java"],
5886 unsafe_ignore_missing_latest_api: true,
5887 apex_available: ["myapex"],
5888 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005889 `
5890
5891 // In this test the source (java_library) libfoo is active since the
5892 // prebuilt (java_import) defaults to prefer:false. However the
5893 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5894 // find the dex boot jar in it. We either need to disable the source libfoo
5895 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005896 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005897 // dexbootjar check is skipped if AllowMissingDependencies is true
5898 preparerAllowMissingDeps := android.GroupFixturePreparers(
5899 preparer,
5900 android.PrepareForTestWithAllowMissingDependencies,
5901 )
5902 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005903 })
5904
5905 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5906 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005907 apex {
5908 name: "myapex",
5909 key: "myapex.key",
5910 updatable: false,
5911 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5912 }
5913
5914 apex_key {
5915 name: "myapex.key",
5916 public_key: "testkey.avbpubkey",
5917 private_key: "testkey.pem",
5918 }
5919
5920 bootclasspath_fragment {
5921 name: "my-bootclasspath-fragment",
5922 contents: ["libfoo", "libbar"],
5923 apex_available: ["myapex"],
5924 hidden_api: {
5925 split_packages: ["*"],
5926 },
5927 }
5928
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005929 prebuilt_apex {
5930 name: "myapex",
5931 arch: {
5932 arm64: {
5933 src: "myapex-arm64.apex",
5934 },
5935 arm: {
5936 src: "myapex-arm.apex",
5937 },
5938 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005939 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5940 }
5941
5942 prebuilt_bootclasspath_fragment {
5943 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005944 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005945 contents: ["libfoo", "libbar"],
5946 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005947 hidden_api: {
5948 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5949 metadata: "my-bootclasspath-fragment/metadata.csv",
5950 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005951 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5952 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5953 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005954 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005955 }
5956
5957 java_import {
5958 name: "libfoo",
5959 prefer: true,
5960 jars: ["libfoo.jar"],
5961 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005962 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005963 }
5964
5965 java_library {
5966 name: "libfoo",
5967 srcs: ["foo/bar/MyClass.java"],
5968 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005969 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005970 }
Paul Duffin37856732021-02-26 14:24:15 +00005971
5972 java_sdk_library_import {
5973 name: "libbar",
5974 prefer: true,
5975 public: {
5976 jars: ["libbar.jar"],
5977 },
5978 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005979 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005980 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005981 }
5982
5983 java_sdk_library {
5984 name: "libbar",
5985 srcs: ["foo/bar/MyClass.java"],
5986 unsafe_ignore_missing_latest_api: true,
5987 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005988 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005989 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005990 `
5991
Paul Duffin89f570a2021-06-16 01:42:33 +01005992 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005993 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5994 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005995
Paul Duffin537ea3d2021-05-14 10:38:00 +01005996 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005997 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005998 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005999 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006000 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006001 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006002 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006003 })
6004
6005 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
6006 bp := `
6007 apex {
6008 name: "myapex",
6009 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006010 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006011 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006012 }
6013
6014 apex_key {
6015 name: "myapex.key",
6016 public_key: "testkey.avbpubkey",
6017 private_key: "testkey.pem",
6018 }
6019
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006020 bootclasspath_fragment {
6021 name: "my-bootclasspath-fragment",
6022 contents: ["libfoo", "libbar"],
6023 apex_available: ["myapex"],
6024 hidden_api: {
6025 split_packages: ["*"],
6026 },
6027 }
6028
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006029 prebuilt_apex {
6030 name: "myapex",
6031 arch: {
6032 arm64: {
6033 src: "myapex-arm64.apex",
6034 },
6035 arm: {
6036 src: "myapex-arm.apex",
6037 },
6038 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006039 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6040 }
6041
6042 prebuilt_bootclasspath_fragment {
6043 name: "my-bootclasspath-fragment",
6044 contents: ["libfoo", "libbar"],
6045 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006046 hidden_api: {
6047 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6048 metadata: "my-bootclasspath-fragment/metadata.csv",
6049 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006050 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6051 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6052 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006053 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006054 }
6055
6056 java_import {
6057 name: "libfoo",
6058 jars: ["libfoo.jar"],
6059 apex_available: ["myapex"],
6060 }
6061
6062 java_library {
6063 name: "libfoo",
6064 srcs: ["foo/bar/MyClass.java"],
6065 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006066 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006067 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006068 }
Paul Duffin37856732021-02-26 14:24:15 +00006069
6070 java_sdk_library_import {
6071 name: "libbar",
6072 public: {
6073 jars: ["libbar.jar"],
6074 },
6075 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006076 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006077 }
6078
6079 java_sdk_library {
6080 name: "libbar",
6081 srcs: ["foo/bar/MyClass.java"],
6082 unsafe_ignore_missing_latest_api: true,
6083 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006084 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006085 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006086 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006087 `
6088
Paul Duffin89f570a2021-06-16 01:42:33 +01006089 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006090 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6091 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006092
Paul Duffin537ea3d2021-05-14 10:38:00 +01006093 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006094 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006095 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6096 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006097 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6098 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006099 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006100 })
6101
6102 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6103 bp := `
6104 apex {
6105 name: "myapex",
6106 enabled: false,
6107 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006108 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006109 }
6110
6111 apex_key {
6112 name: "myapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006117 bootclasspath_fragment {
6118 name: "my-bootclasspath-fragment",
6119 enabled: false,
6120 contents: ["libfoo", "libbar"],
6121 apex_available: ["myapex"],
6122 hidden_api: {
6123 split_packages: ["*"],
6124 },
6125 }
6126
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006127 prebuilt_apex {
6128 name: "myapex",
6129 arch: {
6130 arm64: {
6131 src: "myapex-arm64.apex",
6132 },
6133 arm: {
6134 src: "myapex-arm.apex",
6135 },
6136 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006137 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6138 }
6139
6140 prebuilt_bootclasspath_fragment {
6141 name: "my-bootclasspath-fragment",
6142 contents: ["libfoo", "libbar"],
6143 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006144 hidden_api: {
6145 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6146 metadata: "my-bootclasspath-fragment/metadata.csv",
6147 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006148 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6149 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6150 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006151 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006152 }
6153
6154 java_import {
6155 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006156 jars: ["libfoo.jar"],
6157 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006158 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006159 }
6160
6161 java_library {
6162 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006163 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006164 srcs: ["foo/bar/MyClass.java"],
6165 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006166 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006167 }
Paul Duffin37856732021-02-26 14:24:15 +00006168
6169 java_sdk_library_import {
6170 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006171 public: {
6172 jars: ["libbar.jar"],
6173 },
6174 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006175 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006176 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006177 }
6178
6179 java_sdk_library {
6180 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006181 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006182 srcs: ["foo/bar/MyClass.java"],
6183 unsafe_ignore_missing_latest_api: true,
6184 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006185 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006186 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006187 `
6188
Paul Duffin89f570a2021-06-16 01:42:33 +01006189 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006190 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6191 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006192
Paul Duffin537ea3d2021-05-14 10:38:00 +01006193 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006194 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006195 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006196 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006197 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006198 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006199 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006200 })
Spandan Das3a392012024-01-17 18:26:27 +00006201
6202 t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
6203 bp := `
6204 // Source
6205 apex {
6206 name: "myapex",
6207 enabled: false,
6208 key: "myapex.key",
6209 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6210 }
6211
6212 apex_key {
6213 name: "myapex.key",
6214 public_key: "testkey.avbpubkey",
6215 private_key: "testkey.pem",
6216 }
6217
6218 // Prebuilt
6219 prebuilt_apex {
6220 name: "myapex.v1",
6221 source_apex_name: "myapex",
6222 arch: {
6223 arm64: {
6224 src: "myapex-arm64.apex",
6225 },
6226 arm: {
6227 src: "myapex-arm.apex",
6228 },
6229 },
6230 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6231 prefer: true,
6232 }
6233 prebuilt_apex {
6234 name: "myapex.v2",
6235 source_apex_name: "myapex",
6236 arch: {
6237 arm64: {
6238 src: "myapex-arm64.apex",
6239 },
6240 arm: {
6241 src: "myapex-arm.apex",
6242 },
6243 },
6244 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6245 prefer: true,
6246 }
6247
6248 prebuilt_bootclasspath_fragment {
6249 name: "my-bootclasspath-fragment",
6250 contents: ["libfoo", "libbar"],
6251 apex_available: ["myapex"],
6252 hidden_api: {
6253 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6254 metadata: "my-bootclasspath-fragment/metadata.csv",
6255 index: "my-bootclasspath-fragment/index.csv",
6256 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6257 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6258 },
6259 prefer: true,
6260 }
6261
6262 java_import {
6263 name: "libfoo",
6264 jars: ["libfoo.jar"],
6265 apex_available: ["myapex"],
6266 prefer: true,
6267 }
6268 java_import {
6269 name: "libbar",
6270 jars: ["libbar.jar"],
6271 apex_available: ["myapex"],
6272 prefer: true,
6273 }
6274 `
6275
6276 testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
6277 })
6278
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006279}
6280
Roland Levillain630846d2019-06-26 12:48:34 +01006281func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006282 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006283 apex_test {
6284 name: "myapex",
6285 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006286 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006287 tests: [
6288 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006289 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006290 ],
6291 }
6292
6293 apex_key {
6294 name: "myapex.key",
6295 public_key: "testkey.avbpubkey",
6296 private_key: "testkey.pem",
6297 }
6298
Liz Kammer1c14a212020-05-12 15:26:55 -07006299 filegroup {
6300 name: "fg",
6301 srcs: [
6302 "baz",
6303 "bar/baz"
6304 ],
6305 }
6306
Roland Levillain630846d2019-06-26 12:48:34 +01006307 cc_test {
6308 name: "mytest",
6309 gtest: false,
6310 srcs: ["mytest.cpp"],
6311 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006312 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006313 system_shared_libs: [],
6314 static_executable: true,
6315 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006316 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006317 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006318
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006319 cc_library {
6320 name: "mylib",
6321 srcs: ["mylib.cpp"],
6322 system_shared_libs: [],
6323 stl: "none",
6324 }
6325
Liz Kammer5bd365f2020-05-27 15:15:11 -07006326 filegroup {
6327 name: "fg2",
6328 srcs: [
6329 "testdata/baz"
6330 ],
6331 }
6332
Roland Levillain9b5fde92019-06-28 15:41:19 +01006333 cc_test {
6334 name: "mytests",
6335 gtest: false,
6336 srcs: [
6337 "mytest1.cpp",
6338 "mytest2.cpp",
6339 "mytest3.cpp",
6340 ],
6341 test_per_src: true,
6342 relative_install_path: "test",
6343 system_shared_libs: [],
6344 static_executable: true,
6345 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006346 data: [
6347 ":fg",
6348 ":fg2",
6349 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006350 }
Roland Levillain630846d2019-06-26 12:48:34 +01006351 `)
6352
Jooyung Hana0503a52023-08-23 13:12:50 +09006353 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006354 copyCmds := apexRule.Args["copy_commands"]
6355
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006356 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006357 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006358 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006359
Liz Kammer1c14a212020-05-12 15:26:55 -07006360 //Ensure that test data are copied into apex.
6361 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6362 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6363
Roland Levillain9b5fde92019-06-28 15:41:19 +01006364 // Ensure that test deps built with `test_per_src` are copied into apex.
6365 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6366 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6367 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006368
6369 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006370 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006371 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006372 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006373 prefix := "TARGET_"
6374 var builder strings.Builder
6375 data.Custom(&builder, name, prefix, "", data)
6376 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006377 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6378 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6379 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6380 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006381 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006382}
6383
Jooyung Hand48f3c32019-08-23 11:18:57 +09006384func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6385 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6386 apex {
6387 name: "myapex",
6388 key: "myapex.key",
6389 native_shared_libs: ["libfoo"],
6390 }
6391
6392 apex_key {
6393 name: "myapex.key",
6394 public_key: "testkey.avbpubkey",
6395 private_key: "testkey.pem",
6396 }
6397
6398 cc_library {
6399 name: "libfoo",
6400 stl: "none",
6401 system_shared_libs: [],
6402 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006403 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006404 }
6405 `)
6406 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6407 apex {
6408 name: "myapex",
6409 key: "myapex.key",
6410 java_libs: ["myjar"],
6411 }
6412
6413 apex_key {
6414 name: "myapex.key",
6415 public_key: "testkey.avbpubkey",
6416 private_key: "testkey.pem",
6417 }
6418
6419 java_library {
6420 name: "myjar",
6421 srcs: ["foo/bar/MyClass.java"],
6422 sdk_version: "none",
6423 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006424 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006425 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006426 }
6427 `)
6428}
6429
Bill Peckhama41a6962021-01-11 10:58:54 -08006430func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006431 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006432 apex {
6433 name: "myapex",
6434 key: "myapex.key",
6435 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006436 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006437 }
6438
6439 apex_key {
6440 name: "myapex.key",
6441 public_key: "testkey.avbpubkey",
6442 private_key: "testkey.pem",
6443 }
6444
6445 java_import {
6446 name: "myjavaimport",
6447 apex_available: ["myapex"],
6448 jars: ["my.jar"],
6449 compile_dex: true,
6450 }
6451 `)
6452
Jooyung Hana0503a52023-08-23 13:12:50 +09006453 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006454 apexRule := module.Rule("apexRule")
6455 copyCmds := apexRule.Args["copy_commands"]
6456 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6457}
6458
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006459func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006460 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006461 apex {
6462 name: "myapex",
6463 key: "myapex.key",
6464 apps: [
6465 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006466 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006467 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006468 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006469 }
6470
6471 apex_key {
6472 name: "myapex.key",
6473 public_key: "testkey.avbpubkey",
6474 private_key: "testkey.pem",
6475 }
6476
6477 android_app {
6478 name: "AppFoo",
6479 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006480 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006481 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006482 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006483 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006484 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006485 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006486
6487 android_app {
6488 name: "AppFooPriv",
6489 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006490 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006491 system_modules: "none",
6492 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006493 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006494 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006495 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006496 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006497
6498 cc_library_shared {
6499 name: "libjni",
6500 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006501 shared_libs: ["libfoo"],
6502 stl: "none",
6503 system_shared_libs: [],
6504 apex_available: [ "myapex" ],
6505 sdk_version: "current",
6506 }
6507
6508 cc_library_shared {
6509 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006510 stl: "none",
6511 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006512 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006513 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006514 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006515 `)
6516
Jooyung Hana0503a52023-08-23 13:12:50 +09006517 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006518 apexRule := module.Rule("apexRule")
6519 copyCmds := apexRule.Args["copy_commands"]
6520
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006521 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6522 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006523 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006524
Colin Crossaede88c2020-08-11 12:17:01 -07006525 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006526 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006527 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006528 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006529 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006530 // JNI libraries including transitive deps are
6531 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006532 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006533 // ... embedded inside APK (jnilibs.zip)
6534 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6535 // ... and not directly inside the APEX
6536 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6537 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006538
6539 apexBundle := module.Module().(*apexBundle)
6540 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6541 var builder strings.Builder
6542 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6543 androidMk := builder.String()
6544 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6545 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6546 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6547 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6548 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6549 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006550}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006551
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006552func TestApexWithAppImportBuildId(t *testing.T) {
6553 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6554 for _, id := range invalidBuildIds {
6555 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6556 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6557 variables.BuildId = proptools.StringPtr(id)
6558 })
6559 testApexError(t, message, `apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 apps: ["AppFooPrebuilt"],
6563 updatable: false,
6564 }
6565
6566 apex_key {
6567 name: "myapex.key",
6568 public_key: "testkey.avbpubkey",
6569 private_key: "testkey.pem",
6570 }
6571
6572 android_app_import {
6573 name: "AppFooPrebuilt",
6574 apk: "PrebuiltAppFoo.apk",
6575 presigned: true,
6576 apex_available: ["myapex"],
6577 }
6578 `, fixture)
6579 }
6580}
6581
Dario Frenicde2a032019-10-27 00:29:22 +01006582func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006583 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006584 apex {
6585 name: "myapex",
6586 key: "myapex.key",
6587 apps: [
6588 "AppFooPrebuilt",
6589 "AppFooPrivPrebuilt",
6590 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006591 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006592 }
6593
6594 apex_key {
6595 name: "myapex.key",
6596 public_key: "testkey.avbpubkey",
6597 private_key: "testkey.pem",
6598 }
6599
6600 android_app_import {
6601 name: "AppFooPrebuilt",
6602 apk: "PrebuiltAppFoo.apk",
6603 presigned: true,
6604 dex_preopt: {
6605 enabled: false,
6606 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006607 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006608 }
6609
6610 android_app_import {
6611 name: "AppFooPrivPrebuilt",
6612 apk: "PrebuiltAppFooPriv.apk",
6613 privileged: true,
6614 presigned: true,
6615 dex_preopt: {
6616 enabled: false,
6617 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006618 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006619 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006620 }
6621 `)
6622
Jooyung Hana0503a52023-08-23 13:12:50 +09006623 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006624 apexRule := module.Rule("apexRule")
6625 copyCmds := apexRule.Args["copy_commands"]
6626
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006627 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6628 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006629}
6630
6631func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006632 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006633 apex {
6634 name: "myapex",
6635 key: "myapex.key",
6636 apps: [
6637 "AppFoo",
6638 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006639 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006640 }
6641
6642 apex_key {
6643 name: "myapex.key",
6644 public_key: "testkey.avbpubkey",
6645 private_key: "testkey.pem",
6646 }
6647
6648 android_app {
6649 name: "AppFoo",
6650 srcs: ["foo/bar/MyClass.java"],
6651 sdk_version: "none",
6652 system_modules: "none",
6653 apex_available: [ "myapex" ],
6654 }
6655
6656 android_app_import {
6657 name: "AppFoo",
6658 apk: "AppFooPrebuilt.apk",
6659 filename: "AppFooPrebuilt.apk",
6660 presigned: true,
6661 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006662 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006663 }
6664 `, withFiles(map[string][]byte{
6665 "AppFooPrebuilt.apk": nil,
6666 }))
6667
Jooyung Hana0503a52023-08-23 13:12:50 +09006668 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006669 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006670 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006671}
6672
Dario Freni6f3937c2019-12-20 22:58:03 +00006673func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006674 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006675 apex {
6676 name: "myapex",
6677 key: "myapex.key",
6678 apps: [
6679 "TesterHelpAppFoo",
6680 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006681 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006682 }
6683
6684 apex_key {
6685 name: "myapex.key",
6686 public_key: "testkey.avbpubkey",
6687 private_key: "testkey.pem",
6688 }
6689
6690 android_test_helper_app {
6691 name: "TesterHelpAppFoo",
6692 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006693 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006694 }
6695
6696 `)
6697
Jooyung Hana0503a52023-08-23 13:12:50 +09006698 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006699 apexRule := module.Rule("apexRule")
6700 copyCmds := apexRule.Args["copy_commands"]
6701
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006702 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006703}
6704
Jooyung Han18020ea2019-11-13 10:50:48 +09006705func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6706 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006707 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006708 apex {
6709 name: "myapex",
6710 key: "myapex.key",
6711 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006712 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006713 }
6714
6715 apex_key {
6716 name: "myapex.key",
6717 public_key: "testkey.avbpubkey",
6718 private_key: "testkey.pem",
6719 }
6720
6721 apex {
6722 name: "otherapex",
6723 key: "myapex.key",
6724 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006725 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006726 }
6727
6728 cc_defaults {
6729 name: "libfoo-defaults",
6730 apex_available: ["otherapex"],
6731 }
6732
6733 cc_library {
6734 name: "libfoo",
6735 defaults: ["libfoo-defaults"],
6736 stl: "none",
6737 system_shared_libs: [],
6738 }`)
6739}
6740
Paul Duffine52e66f2020-03-30 17:54:29 +01006741func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006742 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006743 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006744 apex {
6745 name: "myapex",
6746 key: "myapex.key",
6747 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006748 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006749 }
6750
6751 apex_key {
6752 name: "myapex.key",
6753 public_key: "testkey.avbpubkey",
6754 private_key: "testkey.pem",
6755 }
6756
6757 apex {
6758 name: "otherapex",
6759 key: "otherapex.key",
6760 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006761 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006762 }
6763
6764 apex_key {
6765 name: "otherapex.key",
6766 public_key: "testkey.avbpubkey",
6767 private_key: "testkey.pem",
6768 }
6769
6770 cc_library {
6771 name: "libfoo",
6772 stl: "none",
6773 system_shared_libs: [],
6774 apex_available: ["otherapex"],
6775 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006776}
Jiyong Park127b40b2019-09-30 16:04:35 +09006777
Paul Duffine52e66f2020-03-30 17:54:29 +01006778func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006779 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006780 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006781.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006782.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006783.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006784.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006785.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006786.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006787 apex {
6788 name: "myapex",
6789 key: "myapex.key",
6790 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006791 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006792 }
6793
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799
Jiyong Park127b40b2019-09-30 16:04:35 +09006800 cc_library {
6801 name: "libfoo",
6802 stl: "none",
6803 shared_libs: ["libbar"],
6804 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006805 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006806 }
6807
6808 cc_library {
6809 name: "libbar",
6810 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006811 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006812 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006813 apex_available: ["myapex"],
6814 }
6815
6816 cc_library {
6817 name: "libbaz",
6818 stl: "none",
6819 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006820 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006821}
Jiyong Park127b40b2019-09-30 16:04:35 +09006822
Liz Kammer5f108fa2023-05-11 14:33:17 -04006823func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6824 testApex(t, `
6825 apex {
6826 name: "myapex",
6827 key: "myapex.key",
6828 native_shared_libs: ["libfoo"],
6829 updatable: false,
6830 }
6831
6832 apex_key {
6833 name: "myapex.key",
6834 public_key: "testkey.avbpubkey",
6835 private_key: "testkey.pem",
6836 }
6837
6838 cc_library {
6839 name: "libfoo",
6840 stl: "none",
6841 static_libs: ["libbar"],
6842 system_shared_libs: [],
6843 apex_available: ["myapex"],
6844 }
6845
6846 cc_library {
6847 name: "libbar",
6848 stl: "none",
6849 shared_libs: ["libbaz"],
6850 system_shared_libs: [],
6851 apex_available: ["myapex"],
6852 }
6853
6854 cc_library {
6855 name: "libbaz",
6856 stl: "none",
6857 system_shared_libs: [],
6858 }`)
6859
6860 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6861 apex {
6862 name: "myapex",
6863 key: "myapex.key",
6864 native_shared_libs: ["libfoo"],
6865 updatable: false,
6866 }
6867
6868 apex_key {
6869 name: "myapex.key",
6870 public_key: "testkey.avbpubkey",
6871 private_key: "testkey.pem",
6872 }
6873
6874 cc_library {
6875 name: "libfoo",
6876 stl: "none",
6877 static_libs: ["libbar"],
6878 system_shared_libs: [],
6879 apex_available: ["myapex"],
6880 }
6881
6882 cc_library {
6883 name: "libbar",
6884 stl: "none",
6885 system_shared_libs: [],
6886 }`)
6887}
6888
Paul Duffine52e66f2020-03-30 17:54:29 +01006889func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006890 testApexError(t, "\"otherapex\" is not a valid module name", `
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006895 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006896 }
6897
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903
6904 cc_library {
6905 name: "libfoo",
6906 stl: "none",
6907 system_shared_libs: [],
6908 apex_available: ["otherapex"],
6909 }`)
6910
Paul Duffine52e66f2020-03-30 17:54:29 +01006911 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006912 apex {
6913 name: "myapex",
6914 key: "myapex.key",
6915 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006916 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006917 }
6918
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924
6925 cc_library {
6926 name: "libfoo",
6927 stl: "none",
6928 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006929 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 apex_available: ["myapex"],
6931 }
6932
6933 cc_library {
6934 name: "libbar",
6935 stl: "none",
6936 system_shared_libs: [],
6937 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006938 }
6939
6940 cc_library {
6941 name: "libbaz",
6942 stl: "none",
6943 system_shared_libs: [],
6944 stubs: {
6945 versions: ["10", "20", "30"],
6946 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006947 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006948}
Jiyong Park127b40b2019-09-30 16:04:35 +09006949
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006950func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6951 t.Run("negative variant_version produces error", func(t *testing.T) {
6952 testApexError(t, "expected an integer between 0-9; got -1", `
6953 apex {
6954 name: "myapex",
6955 key: "myapex.key",
6956 apex_available_name: "com.android.foo",
6957 variant_version: "-1",
6958 updatable: false,
6959 }
6960 apex_key {
6961 name: "myapex.key",
6962 public_key: "testkey.avbpubkey",
6963 private_key: "testkey.pem",
6964 }
6965 `)
6966 })
6967
6968 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6969 testApexError(t, "expected an integer between 0-9; got 10", `
6970 apex {
6971 name: "myapex",
6972 key: "myapex.key",
6973 apex_available_name: "com.android.foo",
6974 variant_version: "10",
6975 updatable: false,
6976 }
6977 apex_key {
6978 name: "myapex.key",
6979 public_key: "testkey.avbpubkey",
6980 private_key: "testkey.pem",
6981 }
6982 `)
6983 })
6984}
6985
6986func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6987 context := android.GroupFixturePreparers(
6988 android.PrepareForIntegrationTestWithAndroid,
6989 PrepareForTestWithApexBuildComponents,
6990 android.FixtureMergeMockFs(android.MockFS{
6991 "system/sepolicy/apex/foo-file_contexts": nil,
6992 "system/sepolicy/apex/bar-file_contexts": nil,
6993 }),
6994 )
6995 result := context.RunTestWithBp(t, `
6996 apex {
6997 name: "foo",
6998 key: "myapex.key",
6999 apex_available_name: "com.android.foo",
7000 variant_version: "0",
7001 updatable: false,
7002 }
7003 apex {
7004 name: "bar",
7005 key: "myapex.key",
7006 apex_available_name: "com.android.foo",
7007 variant_version: "3",
7008 updatable: false,
7009 }
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007015 override_apex {
7016 name: "myoverrideapex",
7017 base: "bar",
7018 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007019 `)
7020
Jooyung Hana0503a52023-08-23 13:12:50 +09007021 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007022 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
7023 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
7024 if fooActualDefaultVersion != fooExpectedDefaultVersion {
7025 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
7026 }
7027
Jooyung Hana0503a52023-08-23 13:12:50 +09007028 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007029 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
7030 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
7031 barActualDefaultVersion := barManifestRule.Args["default_version"]
7032 if barActualDefaultVersion != barExpectedDefaultVersion {
7033 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7034 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007035
Jooyung Hana0503a52023-08-23 13:12:50 +09007036 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04007037 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
7038 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
7039 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7040 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007041}
7042
Sam Delmericoca816532023-06-02 14:09:50 -04007043func TestApexAvailable_ApexAvailableName(t *testing.T) {
7044 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
7045 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
7046 apex {
7047 name: "myapex_sminus",
7048 key: "myapex.key",
7049 apps: ["AppFoo"],
7050 apex_available_name: "myapex",
7051 updatable: false,
7052 }
7053 apex {
7054 name: "myapex",
7055 key: "myapex.key",
7056 apps: ["AppFoo"],
7057 updatable: false,
7058 }
7059 apex_key {
7060 name: "myapex.key",
7061 public_key: "testkey.avbpubkey",
7062 private_key: "testkey.pem",
7063 }
7064 android_app {
7065 name: "AppFoo",
7066 srcs: ["foo/bar/MyClass.java"],
7067 sdk_version: "none",
7068 system_modules: "none",
7069 apex_available: [ "myapex_sminus" ],
7070 }`,
7071 android.FixtureMergeMockFs(android.MockFS{
7072 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7073 }),
7074 )
7075 })
7076
7077 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7078 testApex(t, `
7079 apex {
7080 name: "myapex_sminus",
7081 key: "myapex.key",
7082 apps: ["AppFoo"],
7083 apex_available_name: "myapex",
7084 updatable: false,
7085 }
7086 apex {
7087 name: "myapex",
7088 key: "myapex.key",
7089 apps: ["AppFoo"],
7090 updatable: false,
7091 }
7092 apex_key {
7093 name: "myapex.key",
7094 public_key: "testkey.avbpubkey",
7095 private_key: "testkey.pem",
7096 }
7097 android_app {
7098 name: "AppFoo",
7099 srcs: ["foo/bar/MyClass.java"],
7100 sdk_version: "none",
7101 system_modules: "none",
7102 apex_available: [ "myapex" ],
7103 }`,
7104 android.FixtureMergeMockFs(android.MockFS{
7105 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7106 }),
7107 )
7108 })
7109
7110 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7111 testApex(t, `
7112 override_apex {
7113 name: "myoverrideapex_sminus",
7114 base: "myapex_sminus",
7115 key: "myapex.key",
7116 apps: ["AppFooOverride"],
7117 }
7118 override_apex {
7119 name: "myoverrideapex",
7120 base: "myapex",
7121 key: "myapex.key",
7122 apps: ["AppFooOverride"],
7123 }
7124 apex {
7125 name: "myapex_sminus",
7126 key: "myapex.key",
7127 apps: ["AppFoo"],
7128 apex_available_name: "myapex",
7129 updatable: false,
7130 }
7131 apex {
7132 name: "myapex",
7133 key: "myapex.key",
7134 apps: ["AppFoo"],
7135 updatable: false,
7136 }
7137 apex_key {
7138 name: "myapex.key",
7139 public_key: "testkey.avbpubkey",
7140 private_key: "testkey.pem",
7141 }
7142 android_app {
7143 name: "AppFooOverride",
7144 srcs: ["foo/bar/MyClass.java"],
7145 sdk_version: "none",
7146 system_modules: "none",
7147 apex_available: [ "myapex" ],
7148 }
7149 android_app {
7150 name: "AppFoo",
7151 srcs: ["foo/bar/MyClass.java"],
7152 sdk_version: "none",
7153 system_modules: "none",
7154 apex_available: [ "myapex" ],
7155 }`,
7156 android.FixtureMergeMockFs(android.MockFS{
7157 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7158 }),
7159 )
7160 })
7161}
7162
7163func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7164 context := android.GroupFixturePreparers(
7165 android.PrepareForIntegrationTestWithAndroid,
7166 PrepareForTestWithApexBuildComponents,
7167 java.PrepareForTestWithDexpreopt,
7168 android.FixtureMergeMockFs(android.MockFS{
7169 "system/sepolicy/apex/myapex-file_contexts": nil,
7170 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7171 }),
7172 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7173 variables.BuildId = proptools.StringPtr("buildid")
7174 }),
7175 )
7176 context.RunTestWithBp(t, `
7177 override_apex {
7178 name: "myoverrideapex_sminus",
7179 base: "myapex_sminus",
7180 }
7181 override_apex {
7182 name: "myoverrideapex",
7183 base: "myapex",
7184 }
7185 apex {
7186 name: "myapex",
7187 key: "myapex.key",
7188 apps: ["AppFoo"],
7189 updatable: false,
7190 }
7191 apex {
7192 name: "myapex_sminus",
7193 apex_available_name: "myapex",
7194 key: "myapex.key",
7195 apps: ["AppFoo_sminus"],
7196 updatable: false,
7197 }
7198 apex_key {
7199 name: "myapex.key",
7200 public_key: "testkey.avbpubkey",
7201 private_key: "testkey.pem",
7202 }
7203 android_app {
7204 name: "AppFoo",
7205 srcs: ["foo/bar/MyClass.java"],
7206 sdk_version: "none",
7207 system_modules: "none",
7208 apex_available: [ "myapex" ],
7209 }
7210 android_app {
7211 name: "AppFoo_sminus",
7212 srcs: ["foo/bar/MyClass.java"],
7213 sdk_version: "none",
7214 min_sdk_version: "29",
7215 system_modules: "none",
7216 apex_available: [ "myapex" ],
7217 }`)
7218}
7219
Jiyong Park89e850a2020-04-07 16:37:39 +09007220func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007221 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007222 apex {
7223 name: "myapex",
7224 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007225 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007226 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007227 }
7228
7229 apex_key {
7230 name: "myapex.key",
7231 public_key: "testkey.avbpubkey",
7232 private_key: "testkey.pem",
7233 }
7234
7235 cc_library {
7236 name: "libfoo",
7237 stl: "none",
7238 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007239 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007240 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007241 }
7242
7243 cc_library {
7244 name: "libfoo2",
7245 stl: "none",
7246 system_shared_libs: [],
7247 shared_libs: ["libbaz"],
7248 apex_available: ["//apex_available:platform"],
7249 }
7250
7251 cc_library {
7252 name: "libbar",
7253 stl: "none",
7254 system_shared_libs: [],
7255 apex_available: ["myapex"],
7256 }
7257
7258 cc_library {
7259 name: "libbaz",
7260 stl: "none",
7261 system_shared_libs: [],
7262 apex_available: ["myapex"],
7263 stubs: {
7264 versions: ["1"],
7265 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007266 }`)
7267
Jiyong Park89e850a2020-04-07 16:37:39 +09007268 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7269 // because it depends on libbar which isn't available to platform
7270 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7271 if libfoo.NotAvailableForPlatform() != true {
7272 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7273 }
7274
7275 // libfoo2 however can be available to platform because it depends on libbaz which provides
7276 // stubs
7277 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7278 if libfoo2.NotAvailableForPlatform() == true {
7279 t.Errorf("%q should be available to platform", libfoo2.String())
7280 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007281}
Jiyong Parka90ca002019-10-07 15:47:24 +09007282
Paul Duffine52e66f2020-03-30 17:54:29 +01007283func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007284 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007285 apex {
7286 name: "myapex",
7287 key: "myapex.key",
7288 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007289 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007290 }
7291
7292 apex_key {
7293 name: "myapex.key",
7294 public_key: "testkey.avbpubkey",
7295 private_key: "testkey.pem",
7296 }
7297
7298 cc_library {
7299 name: "libfoo",
7300 stl: "none",
7301 system_shared_libs: [],
7302 apex_available: ["myapex"],
7303 static: {
7304 apex_available: ["//apex_available:platform"],
7305 },
7306 }`)
7307
Jiyong Park89e850a2020-04-07 16:37:39 +09007308 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7309 if libfooShared.NotAvailableForPlatform() != true {
7310 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7311 }
7312 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7313 if libfooStatic.NotAvailableForPlatform() != false {
7314 t.Errorf("%q should be available to platform", libfooStatic.String())
7315 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007316}
7317
Jiyong Park5d790c32019-11-15 18:40:32 +09007318func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007319 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
7323 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007324 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007325 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007326 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007327 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007328 }
7329
7330 override_apex {
7331 name: "override_myapex",
7332 base: "myapex",
7333 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007334 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007335 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007336 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007337 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007338 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007339 key: "mynewapex.key",
7340 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007341 }
7342
7343 apex_key {
7344 name: "myapex.key",
7345 public_key: "testkey.avbpubkey",
7346 private_key: "testkey.pem",
7347 }
7348
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007349 apex_key {
7350 name: "mynewapex.key",
7351 public_key: "testkey2.avbpubkey",
7352 private_key: "testkey2.pem",
7353 }
7354
7355 android_app_certificate {
7356 name: "myapex.certificate",
7357 certificate: "testkey",
7358 }
7359
Jiyong Park5d790c32019-11-15 18:40:32 +09007360 android_app {
7361 name: "app",
7362 srcs: ["foo/bar/MyClass.java"],
7363 package_name: "foo",
7364 sdk_version: "none",
7365 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007366 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007367 }
7368
7369 override_android_app {
7370 name: "override_app",
7371 base: "app",
7372 package_name: "bar",
7373 }
markchien7c803b82021-08-26 22:10:06 +08007374
7375 bpf {
7376 name: "bpf",
7377 srcs: ["bpf.c"],
7378 }
7379
7380 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007381 name: "overrideBpf",
7382 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007383 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007384
7385 prebuilt_etc {
7386 name: "myetc",
7387 src: "myprebuilt",
7388 }
7389
7390 prebuilt_etc {
7391 name: "override_myetc",
7392 src: "override_myprebuilt",
7393 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007394 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007395
Jooyung Hana0503a52023-08-23 13:12:50 +09007396 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7397 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007398 if originalVariant.GetOverriddenBy() != "" {
7399 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7400 }
7401 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7402 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7403 }
7404
Jooyung Hana0503a52023-08-23 13:12:50 +09007405 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007406 apexRule := module.Rule("apexRule")
7407 copyCmds := apexRule.Args["copy_commands"]
7408
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007409 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7410 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007411
markchien7c803b82021-08-26 22:10:06 +08007412 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007413 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007414
Daniel Norman5a3ce132021-08-26 15:44:43 -07007415 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7416 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7417
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007418 apexBundle := module.Module().(*apexBundle)
7419 name := apexBundle.Name()
7420 if name != "override_myapex" {
7421 t.Errorf("name should be \"override_myapex\", but was %q", name)
7422 }
7423
Baligh Uddin004d7172020-02-19 21:29:28 -08007424 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7425 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7426 }
7427
Jiyong Park20bacab2020-03-03 11:45:41 +09007428 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007429 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007430 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7431
7432 signApkRule := module.Rule("signapk")
7433 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007434
Colin Crossaa255532020-07-03 13:18:24 -07007435 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007436 var builder strings.Builder
7437 data.Custom(&builder, name, "TARGET_", "", data)
7438 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007439 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7440 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007441 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007442 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007443 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007444 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007445 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007446 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007447}
7448
Albert Martineefabcf2022-03-21 20:11:16 +00007449func TestMinSdkVersionOverride(t *testing.T) {
7450 // Override from 29 to 31
7451 minSdkOverride31 := "31"
7452 ctx := testApex(t, `
7453 apex {
7454 name: "myapex",
7455 key: "myapex.key",
7456 native_shared_libs: ["mylib"],
7457 updatable: true,
7458 min_sdk_version: "29"
7459 }
7460
7461 override_apex {
7462 name: "override_myapex",
7463 base: "myapex",
7464 logging_parent: "com.foo.bar",
7465 package_name: "test.overridden.package"
7466 }
7467
7468 apex_key {
7469 name: "myapex.key",
7470 public_key: "testkey.avbpubkey",
7471 private_key: "testkey.pem",
7472 }
7473
7474 cc_library {
7475 name: "mylib",
7476 srcs: ["mylib.cpp"],
7477 runtime_libs: ["libbar"],
7478 system_shared_libs: [],
7479 stl: "none",
7480 apex_available: [ "myapex" ],
7481 min_sdk_version: "apex_inherit"
7482 }
7483
7484 cc_library {
7485 name: "libbar",
7486 srcs: ["mylib.cpp"],
7487 system_shared_libs: [],
7488 stl: "none",
7489 apex_available: [ "myapex" ],
7490 min_sdk_version: "apex_inherit"
7491 }
7492
7493 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7494
Jooyung Hana0503a52023-08-23 13:12:50 +09007495 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007496 copyCmds := apexRule.Args["copy_commands"]
7497
7498 // Ensure that direct non-stubs dep is always included
7499 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7500
7501 // Ensure that runtime_libs dep in included
7502 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7503
7504 // Ensure libraries target overridden min_sdk_version value
7505 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7506}
7507
7508func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7509 // Attempt to override from 31 to 29, should be a NOOP
7510 minSdkOverride29 := "29"
7511 ctx := testApex(t, `
7512 apex {
7513 name: "myapex",
7514 key: "myapex.key",
7515 native_shared_libs: ["mylib"],
7516 updatable: true,
7517 min_sdk_version: "31"
7518 }
7519
7520 override_apex {
7521 name: "override_myapex",
7522 base: "myapex",
7523 logging_parent: "com.foo.bar",
7524 package_name: "test.overridden.package"
7525 }
7526
7527 apex_key {
7528 name: "myapex.key",
7529 public_key: "testkey.avbpubkey",
7530 private_key: "testkey.pem",
7531 }
7532
7533 cc_library {
7534 name: "mylib",
7535 srcs: ["mylib.cpp"],
7536 runtime_libs: ["libbar"],
7537 system_shared_libs: [],
7538 stl: "none",
7539 apex_available: [ "myapex" ],
7540 min_sdk_version: "apex_inherit"
7541 }
7542
7543 cc_library {
7544 name: "libbar",
7545 srcs: ["mylib.cpp"],
7546 system_shared_libs: [],
7547 stl: "none",
7548 apex_available: [ "myapex" ],
7549 min_sdk_version: "apex_inherit"
7550 }
7551
7552 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7553
Jooyung Hana0503a52023-08-23 13:12:50 +09007554 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007555 copyCmds := apexRule.Args["copy_commands"]
7556
7557 // Ensure that direct non-stubs dep is always included
7558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7559
7560 // Ensure that runtime_libs dep in included
7561 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7562
7563 // Ensure libraries target the original min_sdk_version value rather than the overridden
7564 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7565}
7566
Jooyung Han214bf372019-11-12 13:03:50 +09007567func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007568 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007569 apex {
7570 name: "myapex",
7571 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007572 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007573 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007574 }
7575
7576 apex_key {
7577 name: "myapex.key",
7578 public_key: "testkey.avbpubkey",
7579 private_key: "testkey.pem",
7580 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007581
7582 cc_library {
7583 name: "mylib",
7584 srcs: ["mylib.cpp"],
7585 stl: "libc++",
7586 system_shared_libs: [],
7587 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007588 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007589 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007590 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007591
Jooyung Hana0503a52023-08-23 13:12:50 +09007592 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007593 args := module.Rule("apexRule").Args
7594 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007595 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007596
7597 // The copies of the libraries in the apex should have one more dependency than
7598 // the ones outside the apex, namely the unwinder. Ideally we should check
7599 // the dependency names directly here but for some reason the names are blank in
7600 // this test.
7601 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007602 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007603 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7604 if len(apexImplicits) != len(nonApexImplicits)+1 {
7605 t.Errorf("%q missing unwinder dep", lib)
7606 }
7607 }
Jooyung Han214bf372019-11-12 13:03:50 +09007608}
7609
Paul Duffine05480a2021-03-08 15:07:14 +00007610var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007611 "api/current.txt": nil,
7612 "api/removed.txt": nil,
7613 "api/system-current.txt": nil,
7614 "api/system-removed.txt": nil,
7615 "api/test-current.txt": nil,
7616 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007617
Anton Hanssondff2c782020-12-21 17:10:01 +00007618 "100/public/api/foo.txt": nil,
7619 "100/public/api/foo-removed.txt": nil,
7620 "100/system/api/foo.txt": nil,
7621 "100/system/api/foo-removed.txt": nil,
7622
Paul Duffineedc5d52020-06-12 17:46:39 +01007623 // For java_sdk_library_import
7624 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007625}
7626
Jooyung Han58f26ab2019-12-18 15:34:32 +09007627func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007628 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007629 apex {
7630 name: "myapex",
7631 key: "myapex.key",
7632 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007633 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007634 }
7635
7636 apex_key {
7637 name: "myapex.key",
7638 public_key: "testkey.avbpubkey",
7639 private_key: "testkey.pem",
7640 }
7641
7642 java_sdk_library {
7643 name: "foo",
7644 srcs: ["a.java"],
7645 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007646 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007647 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007648
7649 prebuilt_apis {
7650 name: "sdk",
7651 api_dirs: ["100"],
7652 }
Paul Duffin9b879592020-05-26 13:21:35 +01007653 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007654
7655 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007656 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007657 "javalib/foo.jar",
7658 "etc/permissions/foo.xml",
7659 })
7660 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007661 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007662 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 +09007663}
7664
Paul Duffin9b879592020-05-26 13:21:35 +01007665func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007666 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007667 apex {
7668 name: "myapex",
7669 key: "myapex.key",
7670 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007671 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007672 }
7673
7674 apex_key {
7675 name: "myapex.key",
7676 public_key: "testkey.avbpubkey",
7677 private_key: "testkey.pem",
7678 }
7679
7680 java_sdk_library {
7681 name: "foo",
7682 srcs: ["a.java"],
7683 api_packages: ["foo"],
7684 apex_available: ["myapex"],
7685 sdk_version: "none",
7686 system_modules: "none",
7687 }
7688
7689 java_library {
7690 name: "bar",
7691 srcs: ["a.java"],
7692 libs: ["foo"],
7693 apex_available: ["myapex"],
7694 sdk_version: "none",
7695 system_modules: "none",
7696 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007697
7698 prebuilt_apis {
7699 name: "sdk",
7700 api_dirs: ["100"],
7701 }
Paul Duffin9b879592020-05-26 13:21:35 +01007702 `, withFiles(filesForSdkLibrary))
7703
7704 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007705 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007706 "javalib/bar.jar",
7707 "javalib/foo.jar",
7708 "etc/permissions/foo.xml",
7709 })
7710
7711 // The bar library should depend on the implementation jar.
7712 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007713 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007714 t.Errorf("expected %q, found %#q", expected, actual)
7715 }
7716}
7717
7718func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007719 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007720 apex {
7721 name: "myapex",
7722 key: "myapex.key",
7723 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007724 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007725 }
7726
7727 apex_key {
7728 name: "myapex.key",
7729 public_key: "testkey.avbpubkey",
7730 private_key: "testkey.pem",
7731 }
7732
7733 java_sdk_library {
7734 name: "foo",
7735 srcs: ["a.java"],
7736 api_packages: ["foo"],
7737 apex_available: ["myapex"],
7738 sdk_version: "none",
7739 system_modules: "none",
7740 }
7741
7742 java_library {
7743 name: "bar",
7744 srcs: ["a.java"],
7745 libs: ["foo"],
7746 sdk_version: "none",
7747 system_modules: "none",
7748 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007749
7750 prebuilt_apis {
7751 name: "sdk",
7752 api_dirs: ["100"],
7753 }
Paul Duffin9b879592020-05-26 13:21:35 +01007754 `, withFiles(filesForSdkLibrary))
7755
7756 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007757 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007758 "javalib/foo.jar",
7759 "etc/permissions/foo.xml",
7760 })
7761
7762 // The bar library should depend on the stubs jar.
7763 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007764 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007765 t.Errorf("expected %q, found %#q", expected, actual)
7766 }
7767}
7768
Paul Duffineedc5d52020-06-12 17:46:39 +01007769func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007770 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007771 prebuilt_apis {
7772 name: "sdk",
7773 api_dirs: ["100"],
7774 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007775 withFiles(map[string][]byte{
7776 "apex/a.java": nil,
7777 "apex/apex_manifest.json": nil,
7778 "apex/Android.bp": []byte(`
7779 package {
7780 default_visibility: ["//visibility:private"],
7781 }
7782
7783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
7786 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 java_library {
7797 name: "bar",
7798 srcs: ["a.java"],
7799 libs: ["foo"],
7800 apex_available: ["myapex"],
7801 sdk_version: "none",
7802 system_modules: "none",
7803 }
7804`),
7805 "source/a.java": nil,
7806 "source/api/current.txt": nil,
7807 "source/api/removed.txt": nil,
7808 "source/Android.bp": []byte(`
7809 package {
7810 default_visibility: ["//visibility:private"],
7811 }
7812
7813 java_sdk_library {
7814 name: "foo",
7815 visibility: ["//apex"],
7816 srcs: ["a.java"],
7817 api_packages: ["foo"],
7818 apex_available: ["myapex"],
7819 sdk_version: "none",
7820 system_modules: "none",
7821 public: {
7822 enabled: true,
7823 },
7824 }
7825`),
7826 "prebuilt/a.jar": nil,
7827 "prebuilt/Android.bp": []byte(`
7828 package {
7829 default_visibility: ["//visibility:private"],
7830 }
7831
7832 java_sdk_library_import {
7833 name: "foo",
7834 visibility: ["//apex", "//source"],
7835 apex_available: ["myapex"],
7836 prefer: true,
7837 public: {
7838 jars: ["a.jar"],
7839 },
7840 }
7841`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007842 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007843 )
7844
7845 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007846 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007847 "javalib/bar.jar",
7848 "javalib/foo.jar",
7849 "etc/permissions/foo.xml",
7850 })
7851
7852 // The bar library should depend on the implementation jar.
7853 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007854 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007855 t.Errorf("expected %q, found %#q", expected, actual)
7856 }
7857}
7858
7859func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7860 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7861 apex {
7862 name: "myapex",
7863 key: "myapex.key",
7864 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007865 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007866 }
7867
7868 apex_key {
7869 name: "myapex.key",
7870 public_key: "testkey.avbpubkey",
7871 private_key: "testkey.pem",
7872 }
7873
7874 java_sdk_library_import {
7875 name: "foo",
7876 apex_available: ["myapex"],
7877 prefer: true,
7878 public: {
7879 jars: ["a.jar"],
7880 },
7881 }
7882
7883 `, withFiles(filesForSdkLibrary))
7884}
7885
atrost6e126252020-01-27 17:01:16 +00007886func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007887 result := android.GroupFixturePreparers(
7888 prepareForApexTest,
7889 java.PrepareForTestWithPlatformCompatConfig,
7890 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007891 apex {
7892 name: "myapex",
7893 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007894 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007895 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007896 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007897 }
7898
7899 apex_key {
7900 name: "myapex.key",
7901 public_key: "testkey.avbpubkey",
7902 private_key: "testkey.pem",
7903 }
7904
7905 platform_compat_config {
7906 name: "myjar-platform-compat-config",
7907 src: ":myjar",
7908 }
7909
7910 java_library {
7911 name: "myjar",
7912 srcs: ["foo/bar/MyClass.java"],
7913 sdk_version: "none",
7914 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007915 apex_available: [ "myapex" ],
7916 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007917
7918 // Make sure that a preferred prebuilt does not affect the apex contents.
7919 prebuilt_platform_compat_config {
7920 name: "myjar-platform-compat-config",
7921 metadata: "compat-config/metadata.xml",
7922 prefer: true,
7923 }
atrost6e126252020-01-27 17:01:16 +00007924 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007925 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007926 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007927 "etc/compatconfig/myjar-platform-compat-config.xml",
7928 "javalib/myjar.jar",
7929 })
7930}
7931
Jooyung Han862c0d62022-12-21 10:15:37 +09007932func TestNoDupeApexFiles(t *testing.T) {
7933 android.GroupFixturePreparers(
7934 android.PrepareForTestWithAndroidBuildComponents,
7935 PrepareForTestWithApexBuildComponents,
7936 prepareForTestWithMyapex,
7937 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7938 ).
7939 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7940 RunTestWithBp(t, `
7941 apex {
7942 name: "myapex",
7943 key: "myapex.key",
7944 prebuilts: ["foo", "bar"],
7945 updatable: false,
7946 }
7947
7948 apex_key {
7949 name: "myapex.key",
7950 public_key: "testkey.avbpubkey",
7951 private_key: "testkey.pem",
7952 }
7953
7954 prebuilt_etc {
7955 name: "foo",
7956 src: "myprebuilt",
7957 filename_from_src: true,
7958 }
7959
7960 prebuilt_etc {
7961 name: "bar",
7962 src: "myprebuilt",
7963 filename_from_src: true,
7964 }
7965 `)
7966}
7967
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007968func TestApexUnwantedTransitiveDeps(t *testing.T) {
7969 bp := `
7970 apex {
7971 name: "myapex",
7972 key: "myapex.key",
7973 native_shared_libs: ["libfoo"],
7974 updatable: false,
7975 unwanted_transitive_deps: ["libbar"],
7976 }
7977
7978 apex_key {
7979 name: "myapex.key",
7980 public_key: "testkey.avbpubkey",
7981 private_key: "testkey.pem",
7982 }
7983
7984 cc_library {
7985 name: "libfoo",
7986 srcs: ["foo.cpp"],
7987 shared_libs: ["libbar"],
7988 apex_available: ["myapex"],
7989 }
7990
7991 cc_library {
7992 name: "libbar",
7993 srcs: ["bar.cpp"],
7994 apex_available: ["myapex"],
7995 }`
7996 ctx := testApex(t, bp)
7997 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7998 "*/libc++.so",
7999 "*/libfoo.so",
8000 // not libbar.so
8001 })
8002}
8003
Jiyong Park479321d2019-12-16 11:47:12 +09008004func TestRejectNonInstallableJavaLibrary(t *testing.T) {
8005 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8006 apex {
8007 name: "myapex",
8008 key: "myapex.key",
8009 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008010 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008011 }
8012
8013 apex_key {
8014 name: "myapex.key",
8015 public_key: "testkey.avbpubkey",
8016 private_key: "testkey.pem",
8017 }
8018
8019 java_library {
8020 name: "myjar",
8021 srcs: ["foo/bar/MyClass.java"],
8022 sdk_version: "none",
8023 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008024 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008025 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008026 }
8027 `)
8028}
8029
Jiyong Park7afd1072019-12-30 16:56:33 +09008030func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008031 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09008032 apex {
8033 name: "myapex",
8034 key: "myapex.key",
8035 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008036 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09008037 }
8038
8039 apex_key {
8040 name: "myapex.key",
8041 public_key: "testkey.avbpubkey",
8042 private_key: "testkey.pem",
8043 }
8044
8045 cc_library {
8046 name: "mylib",
8047 srcs: ["mylib.cpp"],
8048 system_shared_libs: [],
8049 stl: "none",
8050 required: ["a", "b"],
8051 host_required: ["c", "d"],
8052 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00008053 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09008054 }
8055 `)
8056
Jooyung Hana0503a52023-08-23 13:12:50 +09008057 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008058 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09008059 name := apexBundle.BaseModuleName()
8060 prefix := "TARGET_"
8061 var builder strings.Builder
8062 data.Custom(&builder, name, prefix, "", data)
8063 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008064 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08008065 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
8066 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09008067}
8068
Jiyong Park7cd10e32020-01-14 09:22:18 +09008069func TestSymlinksFromApexToSystem(t *testing.T) {
8070 bp := `
8071 apex {
8072 name: "myapex",
8073 key: "myapex.key",
8074 native_shared_libs: ["mylib"],
8075 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008076 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008077 }
8078
Jiyong Park9d677202020-02-19 16:29:35 +09008079 apex {
8080 name: "myapex.updatable",
8081 key: "myapex.key",
8082 native_shared_libs: ["mylib"],
8083 java_libs: ["myjar"],
8084 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008085 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008086 }
8087
Jiyong Park7cd10e32020-01-14 09:22:18 +09008088 apex_key {
8089 name: "myapex.key",
8090 public_key: "testkey.avbpubkey",
8091 private_key: "testkey.pem",
8092 }
8093
8094 cc_library {
8095 name: "mylib",
8096 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008097 shared_libs: [
8098 "myotherlib",
8099 "myotherlib_ext",
8100 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008101 system_shared_libs: [],
8102 stl: "none",
8103 apex_available: [
8104 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008105 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008106 "//apex_available:platform",
8107 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008108 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008109 }
8110
8111 cc_library {
8112 name: "myotherlib",
8113 srcs: ["mylib.cpp"],
8114 system_shared_libs: [],
8115 stl: "none",
8116 apex_available: [
8117 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008118 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008119 "//apex_available:platform",
8120 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008121 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008122 }
8123
Jiyong Parkce243632023-02-17 18:22:25 +09008124 cc_library {
8125 name: "myotherlib_ext",
8126 srcs: ["mylib.cpp"],
8127 system_shared_libs: [],
8128 system_ext_specific: true,
8129 stl: "none",
8130 apex_available: [
8131 "myapex",
8132 "myapex.updatable",
8133 "//apex_available:platform",
8134 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008135 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008136 }
8137
Jiyong Park7cd10e32020-01-14 09:22:18 +09008138 java_library {
8139 name: "myjar",
8140 srcs: ["foo/bar/MyClass.java"],
8141 sdk_version: "none",
8142 system_modules: "none",
8143 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008144 apex_available: [
8145 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008146 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008147 "//apex_available:platform",
8148 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008149 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008150 }
8151
8152 java_library {
8153 name: "myotherjar",
8154 srcs: ["foo/bar/MyClass.java"],
8155 sdk_version: "none",
8156 system_modules: "none",
8157 apex_available: [
8158 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008159 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008160 "//apex_available:platform",
8161 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008162 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008163 }
8164 `
8165
8166 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8167 for _, f := range files {
8168 if f.path == file {
8169 if f.isLink {
8170 t.Errorf("%q is not a real file", file)
8171 }
8172 return
8173 }
8174 }
8175 t.Errorf("%q is not found", file)
8176 }
8177
Jiyong Parkce243632023-02-17 18:22:25 +09008178 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008179 for _, f := range files {
8180 if f.path == file {
8181 if !f.isLink {
8182 t.Errorf("%q is not a symlink", file)
8183 }
Jiyong Parkce243632023-02-17 18:22:25 +09008184 if f.src != target {
8185 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8186 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008187 return
8188 }
8189 }
8190 t.Errorf("%q is not found", file)
8191 }
8192
Jiyong Park9d677202020-02-19 16:29:35 +09008193 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8194 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008195 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008196 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008197 ensureRealfileExists(t, files, "javalib/myjar.jar")
8198 ensureRealfileExists(t, files, "lib64/mylib.so")
8199 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008200 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008201
Jooyung Hana0503a52023-08-23 13:12:50 +09008202 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008203 ensureRealfileExists(t, files, "javalib/myjar.jar")
8204 ensureRealfileExists(t, files, "lib64/mylib.so")
8205 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008206 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008207
8208 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008209 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008210 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008211 ensureRealfileExists(t, files, "javalib/myjar.jar")
8212 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008213 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8214 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008215
Jooyung Hana0503a52023-08-23 13:12:50 +09008216 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008217 ensureRealfileExists(t, files, "javalib/myjar.jar")
8218 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008219 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8220 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008221}
8222
Yo Chiange8128052020-07-23 20:09:18 +08008223func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008224 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008225 apex {
8226 name: "myapex",
8227 key: "myapex.key",
8228 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008229 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008230 }
8231
8232 apex_key {
8233 name: "myapex.key",
8234 public_key: "testkey.avbpubkey",
8235 private_key: "testkey.pem",
8236 }
8237
8238 cc_library_shared {
8239 name: "mylib",
8240 srcs: ["mylib.cpp"],
8241 shared_libs: ["myotherlib"],
8242 system_shared_libs: [],
8243 stl: "none",
8244 apex_available: [
8245 "myapex",
8246 "//apex_available:platform",
8247 ],
8248 }
8249
8250 cc_prebuilt_library_shared {
8251 name: "myotherlib",
8252 srcs: ["prebuilt.so"],
8253 system_shared_libs: [],
8254 stl: "none",
8255 apex_available: [
8256 "myapex",
8257 "//apex_available:platform",
8258 ],
8259 }
8260 `)
8261
Jooyung Hana0503a52023-08-23 13:12:50 +09008262 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008263 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008264 var builder strings.Builder
8265 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8266 androidMk := builder.String()
8267 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008268 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008269 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8270 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8271 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008272 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008273}
8274
Jooyung Han643adc42020-02-27 13:50:06 +09008275func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008276 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008277 apex {
8278 name: "myapex",
8279 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008280 binaries: ["mybin"],
8281 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008282 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008283 }
8284
8285 apex_key {
8286 name: "myapex.key",
8287 public_key: "testkey.avbpubkey",
8288 private_key: "testkey.pem",
8289 }
8290
8291 cc_library {
8292 name: "mylib",
8293 srcs: ["mylib.cpp"],
8294 shared_libs: ["mylib2"],
8295 system_shared_libs: [],
8296 stl: "none",
8297 apex_available: [ "myapex" ],
8298 }
8299
8300 cc_library {
8301 name: "mylib2",
8302 srcs: ["mylib.cpp"],
8303 system_shared_libs: [],
8304 stl: "none",
8305 apex_available: [ "myapex" ],
8306 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008307
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008308 // Used as both a JNI library and a regular shared library.
8309 cc_library {
8310 name: "mylib3",
8311 srcs: ["mylib.cpp"],
8312 system_shared_libs: [],
8313 stl: "none",
8314 apex_available: [ "myapex" ],
8315 }
8316
8317 cc_binary {
8318 name: "mybin",
8319 srcs: ["mybin.cpp"],
8320 shared_libs: ["mylib3"],
8321 system_shared_libs: [],
8322 stl: "none",
8323 apex_available: [ "myapex" ],
8324 }
8325
Jiyong Park34d5c332022-02-24 18:02:44 +09008326 rust_ffi_shared {
8327 name: "libfoo.rust",
8328 crate_name: "foo",
8329 srcs: ["foo.rs"],
8330 shared_libs: ["libfoo.shared_from_rust"],
8331 prefer_rlib: true,
8332 apex_available: ["myapex"],
8333 }
8334
8335 cc_library_shared {
8336 name: "libfoo.shared_from_rust",
8337 srcs: ["mylib.cpp"],
8338 system_shared_libs: [],
8339 stl: "none",
8340 stubs: {
8341 versions: ["10", "11", "12"],
8342 },
8343 }
8344
Jooyung Han643adc42020-02-27 13:50:06 +09008345 `)
8346
Jooyung Hana0503a52023-08-23 13:12:50 +09008347 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008348 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008349 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008350 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008351 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008352 "lib64/mylib.so",
8353 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008354 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008355 "lib64/libfoo.rust.so",
8356 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8357 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008358 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008359
8360 // b/220397949
8361 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008362}
8363
Jooyung Han49f67012020-04-17 13:43:10 +09008364func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008365 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008366 apex {
8367 name: "myapex",
8368 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008369 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008370 }
8371 apex_key {
8372 name: "myapex.key",
8373 public_key: "testkey.avbpubkey",
8374 private_key: "testkey.pem",
8375 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008376 `,
8377 android.FixtureModifyConfig(func(config android.Config) {
8378 delete(config.Targets, android.Android)
8379 config.AndroidCommonTarget = android.Target{}
8380 }),
8381 )
Jooyung Han49f67012020-04-17 13:43:10 +09008382
8383 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8384 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8385 }
8386}
8387
Jiyong Parkbd159612020-02-28 15:22:21 +09008388func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008389 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008390 apex {
8391 name: "myapex",
8392 key: "myapex.key",
8393 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008394 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008395 }
8396
8397 apex_key {
8398 name: "myapex.key",
8399 public_key: "testkey.avbpubkey",
8400 private_key: "testkey.pem",
8401 }
8402
8403 android_app {
8404 name: "AppFoo",
8405 srcs: ["foo/bar/MyClass.java"],
8406 sdk_version: "none",
8407 system_modules: "none",
8408 apex_available: [ "myapex" ],
8409 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008410 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008411
Jooyung Hana0503a52023-08-23 13:12:50 +09008412 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008413 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008414
8415 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008416 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 +09008417}
8418
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008419func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008420 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008421 apex {
8422 name: "myapex",
8423 key: "myapex.key",
8424 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008425 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008426 }
8427
8428 apex_key {
8429 name: "myapex.key",
8430 public_key: "testkey.avbpubkey",
8431 private_key: "testkey.pem",
8432 }
8433
8434 android_app_set {
8435 name: "AppSet",
8436 set: "AppSet.apks",
8437 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008438 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008439 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008440 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008441 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8442 s := mod.Rule("apexRule").Args["copy_commands"]
8443 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008444 if len(copyCmds) != 4 {
8445 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008446 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008447 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8448 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008449 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8450 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008451
8452 // Ensure that canned_fs_config has an entry for the app set zip file
8453 generateFsRule := mod.Rule("generateFsConfig")
8454 cmd := generateFsRule.RuleParams.Command
8455 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008456}
8457
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008458func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008459 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008460 apex_set {
8461 name: "myapex",
8462 filename: "foo_v2.apex",
8463 sanitized: {
8464 none: { set: "myapex.apks", },
8465 hwaddress: { set: "myapex.hwasan.apks", },
8466 },
Paul Duffin24704672021-04-06 16:09:30 +01008467 }
8468 `
8469 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008470
Paul Duffin24704672021-04-06 16:09:30 +01008471 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008472 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008473
Spandan Das3576e762024-01-03 18:57:03 +00008474 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008475 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008476
Paul Duffin24704672021-04-06 16:09:30 +01008477 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8478
8479 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008480 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8481 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008482
8483 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008484}
8485
Pranav Guptaeba03b02022-09-27 00:27:08 +00008486func TestApexSetApksModuleAssignment(t *testing.T) {
8487 ctx := testApex(t, `
8488 apex_set {
8489 name: "myapex",
8490 set: ":myapex_apks_file",
8491 }
8492
8493 filegroup {
8494 name: "myapex_apks_file",
8495 srcs: ["myapex.apks"],
8496 }
8497 `)
8498
Spandan Das3576e762024-01-03 18:57:03 +00008499 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008500
8501 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008502 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008503 extractedApex := m.Output(extractorOutput)
8504
8505 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8506}
8507
Paul Duffin89f570a2021-06-16 01:42:33 +01008508func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008509 t.Helper()
8510
Paul Duffin55607122021-03-30 23:32:51 +01008511 fs := android.MockFS{
8512 "a.java": nil,
8513 "a.jar": nil,
8514 "apex_manifest.json": nil,
8515 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008516 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008517 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8518 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8519 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008520 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008521 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008522
Paul Duffin55607122021-03-30 23:32:51 +01008523 errorHandler := android.FixtureExpectsNoErrors
8524 if errmsg != "" {
8525 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008526 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008527
Paul Duffin55607122021-03-30 23:32:51 +01008528 result := android.GroupFixturePreparers(
8529 cc.PrepareForTestWithCcDefaultModules,
8530 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008531 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008532 java.PrepareForTestWithJavaSdkLibraryFiles,
8533 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008534 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008535 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008536 android.FixtureModifyMockFS(func(fs android.MockFS) {
8537 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8538 insert := ""
8539 for _, fragment := range fragments {
8540 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8541 }
8542 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8543 platform_bootclasspath {
8544 name: "platform-bootclasspath",
8545 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008546 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008547 %s
8548 ],
8549 }
8550 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008551 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008552 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008553 // Dexpreopt for boot jars requires the ART boot image profile.
8554 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8555 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008556 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008557 ).
8558 ExtendWithErrorHandler(errorHandler).
8559 RunTestWithBp(t, bp)
8560
8561 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008562}
8563
Paul Duffin5556c5f2022-06-09 17:32:21 +00008564func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008565 preparers := android.GroupFixturePreparers(
8566 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008567 prepareForTestWithBootclasspathFragment,
8568 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008569 PrepareForTestWithApexBuildComponents,
8570 ).
8571 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008572 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008573
8574 bpBase := `
8575 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008576 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008577 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008578 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008579 set: "myapex.apks",
8580 }
8581
8582 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008583 name: "com.mycompany.android.art",
8584 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008585 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008586 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008587 set: "company-myapex.apks",
8588 }
8589
8590 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008591 name: "art-bootclasspath-fragment",
8592 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008593 hidden_api: {
8594 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8595 metadata: "my-bootclasspath-fragment/metadata.csv",
8596 index: "my-bootclasspath-fragment/index.csv",
8597 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8598 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8599 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008600 %s
8601 }
8602 `
8603
8604 t.Run("java_import", func(t *testing.T) {
8605 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8606 java_import {
8607 name: "libfoo",
8608 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008609 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008610 }
8611 `)
8612 })
8613
8614 t.Run("java_sdk_library_import", func(t *testing.T) {
8615 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8616 java_sdk_library_import {
8617 name: "libfoo",
8618 public: {
8619 jars: ["libbar.jar"],
8620 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008621 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008622 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008623 }
8624 `)
8625 })
8626
8627 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8628 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8629 image_name: "art",
8630 contents: ["libfoo"],
8631 `)+`
8632 java_sdk_library_import {
8633 name: "libfoo",
8634 public: {
8635 jars: ["libbar.jar"],
8636 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008637 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008638 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008639 }
8640 `)
8641 })
8642}
8643
Paul Duffin5556c5f2022-06-09 17:32:21 +00008644func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8645 preparers := android.GroupFixturePreparers(
8646 java.PrepareForTestWithJavaDefaultModules,
8647 PrepareForTestWithApexBuildComponents,
8648 )
8649
Spandan Das59a4a2b2024-01-09 21:35:56 +00008650 errCtx := moduleErrorfTestCtx{}
8651
Paul Duffin5556c5f2022-06-09 17:32:21 +00008652 bpBase := `
8653 apex_set {
8654 name: "com.android.myapex",
8655 installable: true,
8656 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8657 set: "myapex.apks",
8658 }
8659
8660 apex_set {
8661 name: "com.android.myapex_compressed",
8662 apex_name: "com.android.myapex",
8663 installable: true,
8664 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8665 set: "myapex_compressed.apks",
8666 }
8667
8668 prebuilt_bootclasspath_fragment {
8669 name: "my-bootclasspath-fragment",
8670 apex_available: [
8671 "com.android.myapex",
8672 "com.android.myapex_compressed",
8673 ],
8674 hidden_api: {
8675 annotation_flags: "annotation-flags.csv",
8676 metadata: "metadata.csv",
8677 index: "index.csv",
8678 signature_patterns: "signature_patterns.csv",
8679 },
8680 %s
8681 }
8682 `
8683
8684 t.Run("java_import", func(t *testing.T) {
8685 result := preparers.RunTestWithBp(t,
8686 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8687 java_import {
8688 name: "libfoo",
8689 jars: ["libfoo.jar"],
8690 apex_available: [
8691 "com.android.myapex",
8692 "com.android.myapex_compressed",
8693 ],
8694 }
8695 `)
8696
8697 module := result.Module("libfoo", "android_common_com.android.myapex")
8698 usesLibraryDep := module.(java.UsesLibraryDependency)
8699 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008700 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008701 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008702 })
8703
8704 t.Run("java_sdk_library_import", func(t *testing.T) {
8705 result := preparers.RunTestWithBp(t,
8706 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8707 java_sdk_library_import {
8708 name: "libfoo",
8709 public: {
8710 jars: ["libbar.jar"],
8711 },
8712 apex_available: [
8713 "com.android.myapex",
8714 "com.android.myapex_compressed",
8715 ],
8716 compile_dex: true,
8717 }
8718 `)
8719
8720 module := result.Module("libfoo", "android_common_com.android.myapex")
8721 usesLibraryDep := module.(java.UsesLibraryDependency)
8722 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008723 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008724 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008725 })
8726
8727 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8728 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8729 image_name: "art",
8730 contents: ["libfoo"],
8731 `)+`
8732 java_sdk_library_import {
8733 name: "libfoo",
8734 public: {
8735 jars: ["libbar.jar"],
8736 },
8737 apex_available: [
8738 "com.android.myapex",
8739 "com.android.myapex_compressed",
8740 ],
8741 compile_dex: true,
8742 }
8743 `)
8744 })
8745}
8746
Jooyung Han548640b2020-04-27 12:10:30 +09008747func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8748 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8749 apex {
8750 name: "myapex",
8751 key: "myapex.key",
8752 updatable: true,
8753 }
8754
8755 apex_key {
8756 name: "myapex.key",
8757 public_key: "testkey.avbpubkey",
8758 private_key: "testkey.pem",
8759 }
8760 `)
8761}
8762
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008763func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8764 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8765 apex {
8766 name: "myapex",
8767 key: "myapex.key",
8768 }
8769
8770 apex_key {
8771 name: "myapex.key",
8772 public_key: "testkey.avbpubkey",
8773 private_key: "testkey.pem",
8774 }
8775 `)
8776}
8777
Jooyung Handfc864c2023-03-20 18:19:07 +09008778func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8779 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008780 apex {
8781 name: "myapex",
8782 key: "myapex.key",
8783 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008784 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008785 soc_specific: true,
8786 }
8787
8788 apex_key {
8789 name: "myapex.key",
8790 public_key: "testkey.avbpubkey",
8791 private_key: "testkey.pem",
8792 }
8793 `)
8794}
8795
Jooyung Han02873da2023-03-22 17:41:03 +09008796func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8797 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8798 apex {
8799 name: "myapex",
8800 key: "myapex.key",
8801 updatable: false,
8802 min_sdk_version: "29",
8803 use_vndk_as_stable: true,
8804 vendor: true,
8805 }
8806
8807 apex_key {
8808 name: "myapex.key",
8809 public_key: "testkey.avbpubkey",
8810 private_key: "testkey.pem",
8811 }
8812 `)
8813}
8814
Jooyung Handfc864c2023-03-20 18:19:07 +09008815func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8816 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8817 apex {
8818 name: "myapex",
8819 key: "myapex.key",
8820 updatable: false,
8821 use_vndk_as_stable: true,
8822 }
8823
8824 apex_key {
8825 name: "myapex.key",
8826 public_key: "testkey.avbpubkey",
8827 private_key: "testkey.pem",
8828 }
8829 `)
8830}
8831
satayevb98371c2021-06-15 16:49:50 +01008832func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8833 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8834 apex {
8835 name: "myapex",
8836 key: "myapex.key",
8837 systemserverclasspath_fragments: [
8838 "mysystemserverclasspathfragment",
8839 ],
8840 min_sdk_version: "29",
8841 updatable: true,
8842 }
8843
8844 apex_key {
8845 name: "myapex.key",
8846 public_key: "testkey.avbpubkey",
8847 private_key: "testkey.pem",
8848 }
8849
8850 java_library {
8851 name: "foo",
8852 srcs: ["b.java"],
8853 min_sdk_version: "29",
8854 installable: true,
8855 apex_available: [
8856 "myapex",
8857 ],
8858 }
8859
8860 systemserverclasspath_fragment {
8861 name: "mysystemserverclasspathfragment",
8862 generate_classpaths_proto: false,
8863 contents: [
8864 "foo",
8865 ],
8866 apex_available: [
8867 "myapex",
8868 ],
8869 }
satayevabcd5972021-08-06 17:49:46 +01008870 `,
8871 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8872 )
satayevb98371c2021-06-15 16:49:50 +01008873}
8874
Paul Duffin064b70c2020-11-02 17:32:38 +00008875func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008876 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008877 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008878 fragment := java.ApexVariantReference{
8879 Apex: proptools.StringPtr("myapex"),
8880 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8881 }
8882
Paul Duffin064b70c2020-11-02 17:32:38 +00008883 testDexpreoptWithApexes(t, `
8884 prebuilt_apex {
8885 name: "myapex" ,
8886 arch: {
8887 arm64: {
8888 src: "myapex-arm64.apex",
8889 },
8890 arm: {
8891 src: "myapex-arm.apex",
8892 },
8893 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008894 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8895 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008896
Paul Duffin89f570a2021-06-16 01:42:33 +01008897 prebuilt_bootclasspath_fragment {
8898 name: "my-bootclasspath-fragment",
8899 contents: ["libfoo"],
8900 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008901 hidden_api: {
8902 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8903 metadata: "my-bootclasspath-fragment/metadata.csv",
8904 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008905 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8906 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8907 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008908 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008909 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008910
Paul Duffin89f570a2021-06-16 01:42:33 +01008911 java_import {
8912 name: "libfoo",
8913 jars: ["libfoo.jar"],
8914 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008915 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008916 }
8917 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008918 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008919}
8920
Spandan Dasf14e2542021-11-12 00:01:37 +00008921func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008922 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008923 bp += `
8924 apex_key {
8925 name: "myapex.key",
8926 public_key: "testkey.avbpubkey",
8927 private_key: "testkey.pem",
8928 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008929 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008930 "lib1/src/A.java": nil,
8931 "lib2/src/B.java": nil,
8932 "system/sepolicy/apex/myapex-file_contexts": nil,
8933 }
8934
Paul Duffin45338f02021-03-30 23:07:52 +01008935 errorHandler := android.FixtureExpectsNoErrors
8936 if errmsg != "" {
8937 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008938 }
Colin Crossae8600b2020-10-29 17:09:13 -07008939
Paul Duffin45338f02021-03-30 23:07:52 +01008940 android.GroupFixturePreparers(
8941 android.PrepareForTestWithAndroidBuildComponents,
8942 java.PrepareForTestWithJavaBuildComponents,
8943 PrepareForTestWithApexBuildComponents,
8944 android.PrepareForTestWithNeverallowRules(rules),
8945 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008946 apexBootJars := make([]string, 0, len(bootJars))
8947 for _, apexBootJar := range bootJars {
8948 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008949 }
satayevd604b212021-07-21 14:23:52 +01008950 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008951 }),
8952 fs.AddToFixture(),
8953 ).
8954 ExtendWithErrorHandler(errorHandler).
8955 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008956}
8957
8958func TestApexPermittedPackagesRules(t *testing.T) {
8959 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008960 name string
8961 expectedError string
8962 bp string
8963 bootJars []string
8964 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008965 }{
8966
8967 {
8968 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8969 expectedError: "",
8970 bp: `
8971 java_library {
8972 name: "bcp_lib1",
8973 srcs: ["lib1/src/*.java"],
8974 permitted_packages: ["foo.bar"],
8975 apex_available: ["myapex"],
8976 sdk_version: "none",
8977 system_modules: "none",
8978 }
8979 java_library {
8980 name: "nonbcp_lib2",
8981 srcs: ["lib2/src/*.java"],
8982 apex_available: ["myapex"],
8983 permitted_packages: ["a.b"],
8984 sdk_version: "none",
8985 system_modules: "none",
8986 }
8987 apex {
8988 name: "myapex",
8989 key: "myapex.key",
8990 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008991 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008992 }`,
8993 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008994 bcpPermittedPackages: map[string][]string{
8995 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008996 "foo.bar",
8997 },
8998 },
8999 },
9000 {
Anton Hanssone1b18362021-12-23 15:05:38 +00009001 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00009002 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 +01009003 bp: `
9004 java_library {
9005 name: "bcp_lib1",
9006 srcs: ["lib1/src/*.java"],
9007 apex_available: ["myapex"],
9008 permitted_packages: ["foo.bar"],
9009 sdk_version: "none",
9010 system_modules: "none",
9011 }
9012 java_library {
9013 name: "bcp_lib2",
9014 srcs: ["lib2/src/*.java"],
9015 apex_available: ["myapex"],
9016 permitted_packages: ["foo.bar", "bar.baz"],
9017 sdk_version: "none",
9018 system_modules: "none",
9019 }
9020 apex {
9021 name: "myapex",
9022 key: "myapex.key",
9023 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009024 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01009025 }
9026 `,
9027 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00009028 bcpPermittedPackages: map[string][]string{
9029 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01009030 "foo.bar",
9031 },
Spandan Dasf14e2542021-11-12 00:01:37 +00009032 "bcp_lib2": []string{
9033 "foo.bar",
9034 },
9035 },
9036 },
9037 {
9038 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
9039 expectedError: "",
9040 bp: `
9041 java_library {
9042 name: "bcp_lib_restricted",
9043 srcs: ["lib1/src/*.java"],
9044 apex_available: ["myapex"],
9045 permitted_packages: ["foo.bar"],
9046 sdk_version: "none",
9047 min_sdk_version: "29",
9048 system_modules: "none",
9049 }
9050 java_library {
9051 name: "bcp_lib_unrestricted",
9052 srcs: ["lib2/src/*.java"],
9053 apex_available: ["myapex"],
9054 permitted_packages: ["foo.bar", "bar.baz"],
9055 sdk_version: "none",
9056 min_sdk_version: "29",
9057 system_modules: "none",
9058 }
9059 apex {
9060 name: "myapex",
9061 key: "myapex.key",
9062 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
9063 updatable: true,
9064 min_sdk_version: "29",
9065 }
9066 `,
9067 bootJars: []string{"bcp_lib1", "bcp_lib2"},
9068 bcpPermittedPackages: map[string][]string{
9069 "bcp_lib1_non_updateable": []string{
9070 "foo.bar",
9071 },
9072 // 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 +01009073 },
9074 },
9075 }
9076 for _, tc := range testcases {
9077 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009078 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9079 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009080 })
9081 }
9082}
9083
Jiyong Park62304bb2020-04-13 16:19:48 +09009084func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009085 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009086 apex {
9087 name: "myapex",
9088 key: "myapex.key",
9089 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009090 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009091 }
9092
9093 apex_key {
9094 name: "myapex.key",
9095 public_key: "testkey.avbpubkey",
9096 private_key: "testkey.pem",
9097 }
9098
9099 cc_library {
9100 name: "mylib",
9101 srcs: ["mylib.cpp"],
9102 system_shared_libs: [],
9103 stl: "none",
9104 stubs: {
9105 versions: ["1"],
9106 },
9107 apex_available: ["myapex"],
9108 }
9109
9110 cc_library {
9111 name: "myprivlib",
9112 srcs: ["mylib.cpp"],
9113 system_shared_libs: [],
9114 stl: "none",
9115 apex_available: ["myapex"],
9116 }
9117
9118
9119 cc_test {
9120 name: "mytest",
9121 gtest: false,
9122 srcs: ["mylib.cpp"],
9123 system_shared_libs: [],
9124 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009125 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009126 test_for: ["myapex"]
9127 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009128
9129 cc_library {
9130 name: "mytestlib",
9131 srcs: ["mylib.cpp"],
9132 system_shared_libs: [],
9133 shared_libs: ["mylib", "myprivlib"],
9134 stl: "none",
9135 test_for: ["myapex"],
9136 }
9137
9138 cc_benchmark {
9139 name: "mybench",
9140 srcs: ["mylib.cpp"],
9141 system_shared_libs: [],
9142 shared_libs: ["mylib", "myprivlib"],
9143 stl: "none",
9144 test_for: ["myapex"],
9145 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009146 `)
9147
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009148 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009149 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009150 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9151 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9152 }
9153
9154 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009155 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009156 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9157 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9158 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9159}
Jiyong Park46a512f2020-12-04 18:02:13 +09009160
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009161func TestIndirectTestFor(t *testing.T) {
9162 ctx := testApex(t, `
9163 apex {
9164 name: "myapex",
9165 key: "myapex.key",
9166 native_shared_libs: ["mylib", "myprivlib"],
9167 updatable: false,
9168 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009169
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009170 apex_key {
9171 name: "myapex.key",
9172 public_key: "testkey.avbpubkey",
9173 private_key: "testkey.pem",
9174 }
9175
9176 cc_library {
9177 name: "mylib",
9178 srcs: ["mylib.cpp"],
9179 system_shared_libs: [],
9180 stl: "none",
9181 stubs: {
9182 versions: ["1"],
9183 },
9184 apex_available: ["myapex"],
9185 }
9186
9187 cc_library {
9188 name: "myprivlib",
9189 srcs: ["mylib.cpp"],
9190 system_shared_libs: [],
9191 stl: "none",
9192 shared_libs: ["mylib"],
9193 apex_available: ["myapex"],
9194 }
9195
9196 cc_library {
9197 name: "mytestlib",
9198 srcs: ["mylib.cpp"],
9199 system_shared_libs: [],
9200 shared_libs: ["myprivlib"],
9201 stl: "none",
9202 test_for: ["myapex"],
9203 }
9204 `)
9205
9206 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009207 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009208 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9209 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9210 }
9211
9212 // The platform variant of mytestlib links to the platform variant of the
9213 // internal myprivlib.
9214 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9215
9216 // The platform variant of myprivlib links to the platform variant of mylib
9217 // and bypasses its stubs.
9218 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 +09009219}
9220
Martin Stjernholmec009002021-03-27 15:18:31 +00009221func TestTestForForLibInOtherApex(t *testing.T) {
9222 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9223 _ = testApex(t, `
9224 apex {
9225 name: "com.android.art",
9226 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009227 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009228 updatable: false,
9229 }
9230
9231 apex {
9232 name: "com.android.art.debug",
9233 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009234 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009235 updatable: false,
9236 }
9237
9238 apex_key {
9239 name: "myapex.key",
9240 public_key: "testkey.avbpubkey",
9241 private_key: "testkey.pem",
9242 }
9243
9244 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009245 name: "libnativebridge",
9246 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009247 system_shared_libs: [],
9248 stl: "none",
9249 stubs: {
9250 versions: ["1"],
9251 },
9252 apex_available: ["com.android.art", "com.android.art.debug"],
9253 }
9254
9255 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009256 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009257 srcs: ["mylib.cpp"],
9258 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009259 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009260 stl: "none",
9261 apex_available: ["com.android.art.debug"],
9262 test_for: ["com.android.art"],
9263 }
9264 `,
9265 android.MockFS{
9266 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9267 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9268 }.AddToFixture())
9269}
9270
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009271// TODO(jungjw): Move this to proptools
9272func intPtr(i int) *int {
9273 return &i
9274}
9275
9276func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009277 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009278 apex_set {
9279 name: "myapex",
9280 set: "myapex.apks",
9281 filename: "foo_v2.apex",
9282 overrides: ["foo"],
9283 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009284 `,
9285 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9286 variables.Platform_sdk_version = intPtr(30)
9287 }),
9288 android.FixtureModifyConfig(func(config android.Config) {
9289 config.Targets[android.Android] = []android.Target{
9290 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9291 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9292 }
9293 }),
9294 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009295
Spandan Das3576e762024-01-03 18:57:03 +00009296 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009297
9298 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009299 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009300 actual := extractedApex.Args["abis"]
9301 expected := "ARMEABI_V7A,ARM64_V8A"
9302 if actual != expected {
9303 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9304 }
9305 actual = extractedApex.Args["sdk-version"]
9306 expected = "30"
9307 if actual != expected {
9308 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9309 }
9310
Paul Duffin6717d882021-06-15 19:09:41 +01009311 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009312 a := m.Module().(*ApexSet)
9313 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009314 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009315 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9316 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9317 }
9318}
9319
Anton Hansson805e0a52022-11-25 14:06:46 +00009320func TestApexSet_NativeBridge(t *testing.T) {
9321 ctx := testApex(t, `
9322 apex_set {
9323 name: "myapex",
9324 set: "myapex.apks",
9325 filename: "foo_v2.apex",
9326 overrides: ["foo"],
9327 }
9328 `,
9329 android.FixtureModifyConfig(func(config android.Config) {
9330 config.Targets[android.Android] = []android.Target{
9331 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9332 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9333 }
9334 }),
9335 )
9336
Spandan Das3576e762024-01-03 18:57:03 +00009337 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009338
9339 // Check extract_apks tool parameters. No native bridge arch expected
9340 extractedApex := m.Output("extracted/myapex.apks")
9341 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9342}
9343
Jiyong Park7d95a512020-05-10 15:16:24 +09009344func TestNoStaticLinkingToStubsLib(t *testing.T) {
9345 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9346 apex {
9347 name: "myapex",
9348 key: "myapex.key",
9349 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009350 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009351 }
9352
9353 apex_key {
9354 name: "myapex.key",
9355 public_key: "testkey.avbpubkey",
9356 private_key: "testkey.pem",
9357 }
9358
9359 cc_library {
9360 name: "mylib",
9361 srcs: ["mylib.cpp"],
9362 static_libs: ["otherlib"],
9363 system_shared_libs: [],
9364 stl: "none",
9365 apex_available: [ "myapex" ],
9366 }
9367
9368 cc_library {
9369 name: "otherlib",
9370 srcs: ["mylib.cpp"],
9371 system_shared_libs: [],
9372 stl: "none",
9373 stubs: {
9374 versions: ["1", "2", "3"],
9375 },
9376 apex_available: [ "myapex" ],
9377 }
9378 `)
9379}
9380
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009381func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009382 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009383 apex {
9384 name: "myapex",
9385 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009386 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009387 custom_sign_tool: "sign_myapex",
9388 }
9389
9390 apex_key {
9391 name: "myapex.key",
9392 public_key: "testkey.avbpubkey",
9393 private_key: "testkey.pem",
9394 }
9395 `)
9396
Jooyung Han286957d2023-10-30 16:17:56 +09009397 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009398 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009399 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 +09009400}
9401
9402func TestApexKeysTxtOverrides(t *testing.T) {
9403 ctx := testApex(t, `
9404 apex {
9405 name: "myapex",
9406 key: "myapex.key",
9407 updatable: false,
9408 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009409 }
9410
9411 apex_key {
9412 name: "myapex.key",
9413 public_key: "testkey.avbpubkey",
9414 private_key: "testkey.pem",
9415 }
9416
9417 prebuilt_apex {
9418 name: "myapex",
9419 prefer: true,
9420 arch: {
9421 arm64: {
9422 src: "myapex-arm64.apex",
9423 },
9424 arm: {
9425 src: "myapex-arm.apex",
9426 },
9427 },
9428 }
9429
9430 apex_set {
9431 name: "myapex_set",
9432 set: "myapex.apks",
9433 filename: "myapex_set.apex",
9434 overrides: ["myapex"],
9435 }
9436 `)
9437
Colin Crossf61d03d2023-11-02 16:56:39 -07009438 content := android.ContentFromFileRuleForTests(t, ctx,
9439 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009440 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 -07009441 content = android.ContentFromFileRuleForTests(t, ctx,
9442 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009443 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 +09009444}
9445
Jooyung Han938b5932020-06-20 12:47:47 +09009446func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009447 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009448 apex {
9449 name: "myapex",
9450 key: "myapex.key",
9451 apps: ["app"],
9452 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009453 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009454 }
9455
9456 apex_key {
9457 name: "myapex.key",
9458 public_key: "testkey.avbpubkey",
9459 private_key: "testkey.pem",
9460 }
9461
9462 android_app {
9463 name: "app",
9464 srcs: ["foo/bar/MyClass.java"],
9465 package_name: "foo",
9466 sdk_version: "none",
9467 system_modules: "none",
9468 apex_available: [ "myapex" ],
9469 }
9470 `, withFiles(map[string][]byte{
9471 "sub/Android.bp": []byte(`
9472 override_apex {
9473 name: "override_myapex",
9474 base: "myapex",
9475 apps: ["override_app"],
9476 allowed_files: ":allowed",
9477 }
9478 // Overridable "path" property should be referenced indirectly
9479 filegroup {
9480 name: "allowed",
9481 srcs: ["allowed.txt"],
9482 }
9483 override_android_app {
9484 name: "override_app",
9485 base: "app",
9486 package_name: "bar",
9487 }
9488 `),
9489 }))
9490
Jooyung Hana0503a52023-08-23 13:12:50 +09009491 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009492 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9493 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9494 }
9495
Jooyung Hana0503a52023-08-23 13:12:50 +09009496 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009497 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9498 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9499 }
9500}
9501
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009502func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009503 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009504 apex {
9505 name: "myapex",
9506 key: "myapex.key",
9507 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009508 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009509 }
9510
9511 apex_key {
9512 name: "myapex.key",
9513 public_key: "testkey.avbpubkey",
9514 private_key: "testkey.pem",
9515 }
9516
9517 cc_library {
9518 name: "mylib",
9519 srcs: ["mylib.cpp"],
9520 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009521 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009522 },
9523 apex_available: ["myapex"],
9524 }
9525
9526 cc_prebuilt_library_shared {
9527 name: "mylib",
9528 prefer: false,
9529 srcs: ["prebuilt.so"],
9530 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009531 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009532 },
9533 apex_available: ["myapex"],
9534 }
9535 `)
9536}
9537
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009538func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009539 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009540 apex {
9541 name: "myapex",
9542 key: "myapex.key",
9543 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009544 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009545 }
9546 apex_key {
9547 name: "myapex.key",
9548 public_key: "testkey.avbpubkey",
9549 private_key: "testkey.pem",
9550 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009551 `,
9552 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9553 variables.CompressedApex = proptools.BoolPtr(true)
9554 }),
9555 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009556
Jooyung Hana0503a52023-08-23 13:12:50 +09009557 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009558 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9559
Jooyung Hana0503a52023-08-23 13:12:50 +09009560 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009561 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9562
9563 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009564 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009565 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9566
9567 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009568 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009569 var builder strings.Builder
9570 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9571 androidMk := builder.String()
9572 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9573}
9574
Martin Stjernholm2856c662020-12-02 15:03:42 +00009575func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009576 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009577 apex {
9578 name: "myapex",
9579 key: "myapex.key",
9580 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009581 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009582 }
9583
9584 apex_key {
9585 name: "myapex.key",
9586 public_key: "testkey.avbpubkey",
9587 private_key: "testkey.pem",
9588 }
9589
9590 cc_library {
9591 name: "mylib",
9592 srcs: ["mylib.cpp"],
9593 apex_available: ["myapex"],
9594 shared_libs: ["otherlib"],
9595 system_shared_libs: [],
9596 }
9597
9598 cc_library {
9599 name: "otherlib",
9600 srcs: ["mylib.cpp"],
9601 stubs: {
9602 versions: ["current"],
9603 },
9604 }
9605
9606 cc_prebuilt_library_shared {
9607 name: "otherlib",
9608 prefer: true,
9609 srcs: ["prebuilt.so"],
9610 stubs: {
9611 versions: ["current"],
9612 },
9613 }
9614 `)
9615
Jooyung Hana0503a52023-08-23 13:12:50 +09009616 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009617 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009618 var builder strings.Builder
9619 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9620 androidMk := builder.String()
9621
9622 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9623 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009624 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009625}
9626
Jiyong Parke3867542020-12-03 17:28:25 +09009627func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009628 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009629 apex {
9630 name: "myapex",
9631 key: "myapex.key",
9632 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009633 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009634 }
9635
9636 apex_key {
9637 name: "myapex.key",
9638 public_key: "testkey.avbpubkey",
9639 private_key: "testkey.pem",
9640 }
9641
9642 cc_library {
9643 name: "mylib",
9644 srcs: ["mylib.cpp"],
9645 system_shared_libs: [],
9646 stl: "none",
9647 apex_available: ["myapex"],
9648 shared_libs: ["mylib2"],
9649 target: {
9650 apex: {
9651 exclude_shared_libs: ["mylib2"],
9652 },
9653 },
9654 }
9655
9656 cc_library {
9657 name: "mylib2",
9658 srcs: ["mylib.cpp"],
9659 system_shared_libs: [],
9660 stl: "none",
9661 }
9662 `)
9663
9664 // Check if mylib is linked to mylib2 for the non-apex target
9665 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9666 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9667
9668 // Make sure that the link doesn't occur for the apex target
9669 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9670 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9671
9672 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009673 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009674 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9675}
9676
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009677func TestPrebuiltStubLibDep(t *testing.T) {
9678 bpBase := `
9679 apex {
9680 name: "myapex",
9681 key: "myapex.key",
9682 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009683 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009684 }
9685 apex_key {
9686 name: "myapex.key",
9687 public_key: "testkey.avbpubkey",
9688 private_key: "testkey.pem",
9689 }
9690 cc_library {
9691 name: "mylib",
9692 srcs: ["mylib.cpp"],
9693 apex_available: ["myapex"],
9694 shared_libs: ["stublib"],
9695 system_shared_libs: [],
9696 }
9697 apex {
9698 name: "otherapex",
9699 enabled: %s,
9700 key: "myapex.key",
9701 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009702 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009703 }
9704 `
9705
9706 stublibSourceBp := `
9707 cc_library {
9708 name: "stublib",
9709 srcs: ["mylib.cpp"],
9710 apex_available: ["otherapex"],
9711 system_shared_libs: [],
9712 stl: "none",
9713 stubs: {
9714 versions: ["1"],
9715 },
9716 }
9717 `
9718
9719 stublibPrebuiltBp := `
9720 cc_prebuilt_library_shared {
9721 name: "stublib",
9722 srcs: ["prebuilt.so"],
9723 apex_available: ["otherapex"],
9724 stubs: {
9725 versions: ["1"],
9726 },
9727 %s
9728 }
9729 `
9730
9731 tests := []struct {
9732 name string
9733 stublibBp string
9734 usePrebuilt bool
9735 modNames []string // Modules to collect AndroidMkEntries for
9736 otherApexEnabled []string
9737 }{
9738 {
9739 name: "only_source",
9740 stublibBp: stublibSourceBp,
9741 usePrebuilt: false,
9742 modNames: []string{"stublib"},
9743 otherApexEnabled: []string{"true", "false"},
9744 },
9745 {
9746 name: "source_preferred",
9747 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9748 usePrebuilt: false,
9749 modNames: []string{"stublib", "prebuilt_stublib"},
9750 otherApexEnabled: []string{"true", "false"},
9751 },
9752 {
9753 name: "prebuilt_preferred",
9754 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9755 usePrebuilt: true,
9756 modNames: []string{"stublib", "prebuilt_stublib"},
9757 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9758 },
9759 {
9760 name: "only_prebuilt",
9761 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9762 usePrebuilt: true,
9763 modNames: []string{"stublib"},
9764 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9765 },
9766 }
9767
9768 for _, test := range tests {
9769 t.Run(test.name, func(t *testing.T) {
9770 for _, otherApexEnabled := range test.otherApexEnabled {
9771 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009772 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009773
9774 type modAndMkEntries struct {
9775 mod *cc.Module
9776 mkEntries android.AndroidMkEntries
9777 }
9778 entries := []*modAndMkEntries{}
9779
9780 // Gather shared lib modules that are installable
9781 for _, modName := range test.modNames {
9782 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9783 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9784 continue
9785 }
9786 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009787 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009788 continue
9789 }
Colin Crossaa255532020-07-03 13:18:24 -07009790 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009791 if ent.Disabled {
9792 continue
9793 }
9794 entries = append(entries, &modAndMkEntries{
9795 mod: mod,
9796 mkEntries: ent,
9797 })
9798 }
9799 }
9800 }
9801
9802 var entry *modAndMkEntries = nil
9803 for _, ent := range entries {
9804 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9805 if entry != nil {
9806 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9807 } else {
9808 entry = ent
9809 }
9810 }
9811 }
9812
9813 if entry == nil {
9814 t.Errorf("AndroidMk entry for \"stublib\" missing")
9815 } else {
9816 isPrebuilt := entry.mod.Prebuilt() != nil
9817 if isPrebuilt != test.usePrebuilt {
9818 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9819 }
9820 if !entry.mod.IsStubs() {
9821 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9822 }
9823 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9824 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9825 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009826 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009827 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009828 if !android.InList(expected, cflags) {
9829 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9830 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009831 }
9832 })
9833 }
9834 })
9835 }
9836}
9837
Colin Crossc33e5212021-05-25 18:16:02 -07009838func TestApexJavaCoverage(t *testing.T) {
9839 bp := `
9840 apex {
9841 name: "myapex",
9842 key: "myapex.key",
9843 java_libs: ["mylib"],
9844 bootclasspath_fragments: ["mybootclasspathfragment"],
9845 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9846 updatable: false,
9847 }
9848
9849 apex_key {
9850 name: "myapex.key",
9851 public_key: "testkey.avbpubkey",
9852 private_key: "testkey.pem",
9853 }
9854
9855 java_library {
9856 name: "mylib",
9857 srcs: ["mylib.java"],
9858 apex_available: ["myapex"],
9859 compile_dex: true,
9860 }
9861
9862 bootclasspath_fragment {
9863 name: "mybootclasspathfragment",
9864 contents: ["mybootclasspathlib"],
9865 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009866 hidden_api: {
9867 split_packages: ["*"],
9868 },
Colin Crossc33e5212021-05-25 18:16:02 -07009869 }
9870
9871 java_library {
9872 name: "mybootclasspathlib",
9873 srcs: ["mybootclasspathlib.java"],
9874 apex_available: ["myapex"],
9875 compile_dex: true,
9876 }
9877
9878 systemserverclasspath_fragment {
9879 name: "mysystemserverclasspathfragment",
9880 contents: ["mysystemserverclasspathlib"],
9881 apex_available: ["myapex"],
9882 }
9883
9884 java_library {
9885 name: "mysystemserverclasspathlib",
9886 srcs: ["mysystemserverclasspathlib.java"],
9887 apex_available: ["myapex"],
9888 compile_dex: true,
9889 }
9890 `
9891
9892 result := android.GroupFixturePreparers(
9893 PrepareForTestWithApexBuildComponents,
9894 prepareForTestWithMyapex,
9895 java.PrepareForTestWithJavaDefaultModules,
9896 android.PrepareForTestWithAndroidBuildComponents,
9897 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009898 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9899 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009900 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009901 ).RunTest(t)
9902
9903 // Make sure jacoco ran on both mylib and mybootclasspathlib
9904 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9905 t.Errorf("Failed to find jacoco rule for mylib")
9906 }
9907 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9908 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9909 }
9910 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9911 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9912 }
9913}
9914
Jiyong Park192600a2021-08-03 07:52:17 +00009915func TestProhibitStaticExecutable(t *testing.T) {
9916 testApexError(t, `executable mybin is static`, `
9917 apex {
9918 name: "myapex",
9919 key: "myapex.key",
9920 binaries: ["mybin"],
9921 min_sdk_version: "29",
9922 }
9923
9924 apex_key {
9925 name: "myapex.key",
9926 public_key: "testkey.avbpubkey",
9927 private_key: "testkey.pem",
9928 }
9929
9930 cc_binary {
9931 name: "mybin",
9932 srcs: ["mylib.cpp"],
9933 relative_install_path: "foo/bar",
9934 static_executable: true,
9935 system_shared_libs: [],
9936 stl: "none",
9937 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009938 min_sdk_version: "29",
9939 }
9940 `)
9941
9942 testApexError(t, `executable mybin.rust is static`, `
9943 apex {
9944 name: "myapex",
9945 key: "myapex.key",
9946 binaries: ["mybin.rust"],
9947 min_sdk_version: "29",
9948 }
9949
9950 apex_key {
9951 name: "myapex.key",
9952 public_key: "testkey.avbpubkey",
9953 private_key: "testkey.pem",
9954 }
9955
9956 rust_binary {
9957 name: "mybin.rust",
9958 srcs: ["foo.rs"],
9959 static_executable: true,
9960 apex_available: ["myapex"],
9961 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009962 }
9963 `)
9964}
9965
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009966func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9967 ctx := testApex(t, `
9968 apex {
9969 name: "myapex",
9970 key: "myapex.key",
9971 updatable: false,
9972 java_libs: ["foo"],
9973 }
9974
9975 apex_key {
9976 name: "myapex.key",
9977 public_key: "testkey.avbpubkey",
9978 private_key: "testkey.pem",
9979 }
9980
9981 java_library {
9982 name: "foo",
9983 srcs: ["foo.java"],
9984 apex_available: ["myapex"],
9985 installable: true,
9986 }
9987 `,
9988 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9989 )
9990
Jooyung Hana0503a52023-08-23 13:12:50 +09009991 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009992 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9993 var builder strings.Builder
9994 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9995 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009996 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 +00009997}
9998
9999func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
10000 ctx := testApex(t, `
10001 prebuilt_apex {
10002 name: "myapex",
10003 arch: {
10004 arm64: {
10005 src: "myapex-arm64.apex",
10006 },
10007 arm: {
10008 src: "myapex-arm.apex",
10009 },
10010 },
10011 exported_java_libs: ["foo"],
10012 }
10013
10014 java_import {
10015 name: "foo",
10016 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +000010017 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +000010018 }
10019 `,
10020 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
10021 )
10022
10023 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
10024 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
10025 mainModuleEntries := entriesList[0]
10026 android.AssertArrayString(t,
10027 "LOCAL_REQUIRED_MODULES",
10028 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
10029 []string{
10030 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
10031 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
10032 })
10033}
10034
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010035func TestAndroidMk_RequiredModules(t *testing.T) {
10036 ctx := testApex(t, `
10037 apex {
10038 name: "myapex",
10039 key: "myapex.key",
10040 updatable: false,
10041 java_libs: ["foo"],
10042 required: ["otherapex"],
10043 }
10044
10045 apex {
10046 name: "otherapex",
10047 key: "myapex.key",
10048 updatable: false,
10049 java_libs: ["foo"],
10050 required: ["otherapex"],
10051 }
10052
10053 apex_key {
10054 name: "myapex.key",
10055 public_key: "testkey.avbpubkey",
10056 private_key: "testkey.pem",
10057 }
10058
10059 java_library {
10060 name: "foo",
10061 srcs: ["foo.java"],
10062 apex_available: ["myapex", "otherapex"],
10063 installable: true,
10064 }
10065 `)
10066
Jooyung Hana0503a52023-08-23 13:12:50 +090010067 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010068 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10069 var builder strings.Builder
10070 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10071 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010072 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010073}
10074
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010075func TestAndroidMk_RequiredDeps(t *testing.T) {
10076 ctx := testApex(t, `
10077 apex {
10078 name: "myapex",
10079 key: "myapex.key",
10080 updatable: false,
10081 }
10082
10083 apex_key {
10084 name: "myapex.key",
10085 public_key: "testkey.avbpubkey",
10086 private_key: "testkey.pem",
10087 }
10088 `)
10089
Jooyung Hana0503a52023-08-23 13:12:50 +090010090 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010091 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010092 data := android.AndroidMkDataForTest(t, ctx, bundle)
10093 var builder strings.Builder
10094 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10095 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010096 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010097}
10098
Jooyung Hana6d36672022-02-24 13:58:07 +090010099func TestApexOutputFileProducer(t *testing.T) {
10100 for _, tc := range []struct {
10101 name string
10102 ref string
10103 expected_data []string
10104 }{
10105 {
10106 name: "test_using_output",
10107 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010108 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010109 },
10110 {
10111 name: "test_using_apex",
10112 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010113 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010114 },
10115 } {
10116 t.Run(tc.name, func(t *testing.T) {
10117 ctx := testApex(t, `
10118 apex {
10119 name: "myapex",
10120 key: "myapex.key",
10121 compressible: true,
10122 updatable: false,
10123 }
10124
10125 apex_key {
10126 name: "myapex.key",
10127 public_key: "testkey.avbpubkey",
10128 private_key: "testkey.pem",
10129 }
10130
10131 java_test {
10132 name: "`+tc.name+`",
10133 srcs: ["a.java"],
10134 data: ["`+tc.ref+`"],
10135 }
10136 `,
10137 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10138 variables.CompressedApex = proptools.BoolPtr(true)
10139 }))
10140 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10141 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10142 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10143 })
10144 }
10145}
10146
satayev758968a2021-12-06 11:42:40 +000010147func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10148 preparer := android.GroupFixturePreparers(
10149 PrepareForTestWithApexBuildComponents,
10150 prepareForTestWithMyapex,
10151 java.PrepareForTestWithJavaSdkLibraryFiles,
10152 java.PrepareForTestWithJavaDefaultModules,
10153 android.PrepareForTestWithAndroidBuildComponents,
10154 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10155 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10156 )
10157
10158 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10159 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10160 preparer.RunTestWithBp(t, `
10161 apex {
10162 name: "myapex",
10163 key: "myapex.key",
10164 bootclasspath_fragments: ["mybootclasspathfragment"],
10165 min_sdk_version: "30",
10166 updatable: false,
10167 }
10168
10169 apex_key {
10170 name: "myapex.key",
10171 public_key: "testkey.avbpubkey",
10172 private_key: "testkey.pem",
10173 }
10174
10175 bootclasspath_fragment {
10176 name: "mybootclasspathfragment",
10177 contents: ["mybootclasspathlib"],
10178 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010179 hidden_api: {
10180 split_packages: ["*"],
10181 },
satayev758968a2021-12-06 11:42:40 +000010182 }
10183
10184 java_sdk_library {
10185 name: "mybootclasspathlib",
10186 srcs: ["mybootclasspathlib.java"],
10187 apex_available: ["myapex"],
10188 compile_dex: true,
10189 unsafe_ignore_missing_latest_api: true,
10190 min_sdk_version: "31",
10191 static_libs: ["util"],
10192 }
10193
10194 java_library {
10195 name: "util",
10196 srcs: ["a.java"],
10197 apex_available: ["myapex"],
10198 min_sdk_version: "31",
10199 static_libs: ["another_util"],
10200 }
10201
10202 java_library {
10203 name: "another_util",
10204 srcs: ["a.java"],
10205 min_sdk_version: "31",
10206 apex_available: ["myapex"],
10207 }
10208 `)
10209 })
10210
10211 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10212 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10213 preparer.RunTestWithBp(t, `
10214 apex {
10215 name: "myapex",
10216 key: "myapex.key",
10217 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10218 min_sdk_version: "30",
10219 updatable: false,
10220 }
10221
10222 apex_key {
10223 name: "myapex.key",
10224 public_key: "testkey.avbpubkey",
10225 private_key: "testkey.pem",
10226 }
10227
10228 systemserverclasspath_fragment {
10229 name: "mysystemserverclasspathfragment",
10230 contents: ["mysystemserverclasspathlib"],
10231 apex_available: ["myapex"],
10232 }
10233
10234 java_sdk_library {
10235 name: "mysystemserverclasspathlib",
10236 srcs: ["mysystemserverclasspathlib.java"],
10237 apex_available: ["myapex"],
10238 compile_dex: true,
10239 min_sdk_version: "32",
10240 unsafe_ignore_missing_latest_api: true,
10241 static_libs: ["util"],
10242 }
10243
10244 java_library {
10245 name: "util",
10246 srcs: ["a.java"],
10247 apex_available: ["myapex"],
10248 min_sdk_version: "31",
10249 static_libs: ["another_util"],
10250 }
10251
10252 java_library {
10253 name: "another_util",
10254 srcs: ["a.java"],
10255 min_sdk_version: "31",
10256 apex_available: ["myapex"],
10257 }
10258 `)
10259 })
10260
10261 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10262 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10263 RunTestWithBp(t, `
10264 apex {
10265 name: "myapex",
10266 key: "myapex.key",
10267 bootclasspath_fragments: ["mybootclasspathfragment"],
10268 min_sdk_version: "30",
10269 updatable: false,
10270 }
10271
10272 apex_key {
10273 name: "myapex.key",
10274 public_key: "testkey.avbpubkey",
10275 private_key: "testkey.pem",
10276 }
10277
10278 bootclasspath_fragment {
10279 name: "mybootclasspathfragment",
10280 contents: ["mybootclasspathlib"],
10281 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010282 hidden_api: {
10283 split_packages: ["*"],
10284 },
satayev758968a2021-12-06 11:42:40 +000010285 }
10286
10287 java_sdk_library {
10288 name: "mybootclasspathlib",
10289 srcs: ["mybootclasspathlib.java"],
10290 apex_available: ["myapex"],
10291 compile_dex: true,
10292 unsafe_ignore_missing_latest_api: true,
10293 }
10294 `)
10295 })
10296
10297 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10298 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10299 RunTestWithBp(t, `
10300 apex {
10301 name: "myapex",
10302 key: "myapex.key",
10303 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10304 min_sdk_version: "30",
10305 updatable: false,
10306 }
10307
10308 apex_key {
10309 name: "myapex.key",
10310 public_key: "testkey.avbpubkey",
10311 private_key: "testkey.pem",
10312 }
10313
10314 systemserverclasspath_fragment {
10315 name: "mysystemserverclasspathfragment",
10316 contents: ["mysystemserverclasspathlib"],
10317 apex_available: ["myapex"],
10318 }
10319
10320 java_sdk_library {
10321 name: "mysystemserverclasspathlib",
10322 srcs: ["mysystemserverclasspathlib.java"],
10323 apex_available: ["myapex"],
10324 compile_dex: true,
10325 unsafe_ignore_missing_latest_api: true,
10326 }
10327 `)
10328 })
10329}
10330
Jiakai Zhang6decef92022-01-12 17:56:19 +000010331// Verifies that the APEX depends on all the Make modules in the list.
10332func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10333 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10334 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010335 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010336 }
10337}
10338
10339// Verifies that the APEX does not depend on any of the Make modules in the list.
10340func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10341 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10342 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010343 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010344 }
10345}
10346
Cole Faust1021ccd2023-02-26 21:15:25 -080010347// TODO(b/193460475): Re-enable this test
10348//func TestApexStrictUpdtabilityLint(t *testing.T) {
10349// bpTemplate := `
10350// apex {
10351// name: "myapex",
10352// key: "myapex.key",
10353// java_libs: ["myjavalib"],
10354// updatable: %v,
10355// min_sdk_version: "29",
10356// }
10357// apex_key {
10358// name: "myapex.key",
10359// }
10360// java_library {
10361// name: "myjavalib",
10362// srcs: ["MyClass.java"],
10363// apex_available: [ "myapex" ],
10364// lint: {
10365// strict_updatability_linting: %v,
10366// },
10367// sdk_version: "current",
10368// min_sdk_version: "29",
10369// }
10370// `
10371// fs := android.MockFS{
10372// "lint-baseline.xml": nil,
10373// }
10374//
10375// testCases := []struct {
10376// testCaseName string
10377// apexUpdatable bool
10378// javaStrictUpdtabilityLint bool
10379// lintFileExists bool
10380// disallowedFlagExpected bool
10381// }{
10382// {
10383// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10384// apexUpdatable: true,
10385// javaStrictUpdtabilityLint: true,
10386// lintFileExists: false,
10387// disallowedFlagExpected: false,
10388// },
10389// {
10390// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10391// apexUpdatable: false,
10392// javaStrictUpdtabilityLint: false,
10393// lintFileExists: true,
10394// disallowedFlagExpected: false,
10395// },
10396// {
10397// testCaseName: "non-updatable apex respects strict updatability of javalib",
10398// apexUpdatable: false,
10399// javaStrictUpdtabilityLint: true,
10400// lintFileExists: true,
10401// disallowedFlagExpected: true,
10402// },
10403// {
10404// testCaseName: "updatable apex sets strict updatability of javalib to true",
10405// apexUpdatable: true,
10406// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10407// lintFileExists: true,
10408// disallowedFlagExpected: true,
10409// },
10410// }
10411//
10412// for _, testCase := range testCases {
10413// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10414// fixtures := []android.FixturePreparer{}
10415// if testCase.lintFileExists {
10416// fixtures = append(fixtures, fs.AddToFixture())
10417// }
10418//
10419// result := testApex(t, bp, fixtures...)
10420// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10421// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10422// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10423//
10424// if disallowedFlagActual != testCase.disallowedFlagExpected {
10425// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10426// }
10427// }
10428//}
10429//
10430//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10431// bp := `
10432// apex {
10433// name: "myapex",
10434// key: "myapex.key",
10435// java_libs: ["myjavalib"],
10436// updatable: true,
10437// min_sdk_version: "29",
10438// }
10439// apex_key {
10440// name: "myapex.key",
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// }
10449// `
10450//
10451// testCases := []struct {
10452// testCaseName string
10453// moduleDirectory string
10454// disallowedFlagExpected bool
10455// }{
10456// {
10457// testCaseName: "lintable module defined outside libcore",
10458// moduleDirectory: "",
10459// disallowedFlagExpected: true,
10460// },
10461// {
10462// testCaseName: "lintable module defined in libcore root directory",
10463// moduleDirectory: "libcore/",
10464// disallowedFlagExpected: false,
10465// },
10466// {
10467// testCaseName: "lintable module defined in libcore child directory",
10468// moduleDirectory: "libcore/childdir/",
10469// disallowedFlagExpected: true,
10470// },
10471// }
10472//
10473// for _, testCase := range testCases {
10474// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10475// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10476// result := testApex(t, "", lintFileCreator, bpFileCreator)
10477// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10478// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10479// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10480// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10481//
10482// if disallowedFlagActual != testCase.disallowedFlagExpected {
10483// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10484// }
10485// }
10486//}
10487//
10488//// checks transtive deps of an apex coming from bootclasspath_fragment
10489//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10490// bp := `
10491// apex {
10492// name: "myapex",
10493// key: "myapex.key",
10494// bootclasspath_fragments: ["mybootclasspathfragment"],
10495// updatable: true,
10496// min_sdk_version: "29",
10497// }
10498// apex_key {
10499// name: "myapex.key",
10500// }
10501// bootclasspath_fragment {
10502// name: "mybootclasspathfragment",
10503// contents: ["myjavalib"],
10504// apex_available: ["myapex"],
10505// hidden_api: {
10506// split_packages: ["*"],
10507// },
10508// }
10509// java_library {
10510// name: "myjavalib",
10511// srcs: ["MyClass.java"],
10512// apex_available: [ "myapex" ],
10513// sdk_version: "current",
10514// min_sdk_version: "29",
10515// compile_dex: true,
10516// }
10517// `
10518// fs := android.MockFS{
10519// "lint-baseline.xml": nil,
10520// }
10521//
10522// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10523// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10524// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10525// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10526// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10527// }
10528//}
Spandan Das66773252022-01-15 00:23:18 +000010529
Spandan Das42e89502022-05-06 22:12:55 +000010530// updatable apexes should propagate updatable=true to its apps
10531func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10532 bp := `
10533 apex {
10534 name: "myapex",
10535 key: "myapex.key",
10536 updatable: %v,
10537 apps: [
10538 "myapp",
10539 ],
10540 min_sdk_version: "30",
10541 }
10542 apex_key {
10543 name: "myapex.key",
10544 }
10545 android_app {
10546 name: "myapp",
10547 updatable: %v,
10548 apex_available: [
10549 "myapex",
10550 ],
10551 sdk_version: "current",
10552 min_sdk_version: "30",
10553 }
10554 `
10555 testCases := []struct {
10556 name string
10557 apex_is_updatable_bp bool
10558 app_is_updatable_bp bool
10559 app_is_updatable_expected bool
10560 }{
10561 {
10562 name: "Non-updatable apex respects updatable property of non-updatable app",
10563 apex_is_updatable_bp: false,
10564 app_is_updatable_bp: false,
10565 app_is_updatable_expected: false,
10566 },
10567 {
10568 name: "Non-updatable apex respects updatable property of updatable app",
10569 apex_is_updatable_bp: false,
10570 app_is_updatable_bp: true,
10571 app_is_updatable_expected: true,
10572 },
10573 {
10574 name: "Updatable apex respects updatable property of updatable app",
10575 apex_is_updatable_bp: true,
10576 app_is_updatable_bp: true,
10577 app_is_updatable_expected: true,
10578 },
10579 {
10580 name: "Updatable apex sets updatable=true on non-updatable app",
10581 apex_is_updatable_bp: true,
10582 app_is_updatable_bp: false,
10583 app_is_updatable_expected: true,
10584 },
10585 }
10586 for _, testCase := range testCases {
10587 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10588 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10589 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10590 }
10591}
10592
Kiyoung Kim487689e2022-07-26 09:48:22 +090010593func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10594 bp := `
10595 apex {
10596 name: "myapex",
10597 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010598 native_shared_libs: ["libbaz"],
10599 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010600 min_sdk_version: "29",
10601 }
10602 apex_key {
10603 name: "myapex.key",
10604 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010605 cc_binary {
10606 name: "binfoo",
10607 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010608 apex_available: ["myapex"],
10609 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010610 recovery_available: false,
10611 }
10612 cc_library {
10613 name: "libbar",
10614 srcs: ["libbar.cc"],
10615 stubs: {
10616 symbol_file: "libbar.map.txt",
10617 versions: [
10618 "29",
10619 ],
10620 },
10621 }
10622 cc_library {
10623 name: "libbaz",
10624 srcs: ["libbaz.cc"],
10625 apex_available: ["myapex"],
10626 min_sdk_version: "29",
10627 stubs: {
10628 symbol_file: "libbaz.map.txt",
10629 versions: [
10630 "29",
10631 ],
10632 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010633 }
10634 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010635 name: "libbar",
10636 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010637 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010638 variants: ["apex.29"],
10639 }
10640 cc_api_variant {
10641 name: "libbar",
10642 variant: "apex",
10643 version: "29",
10644 src: "libbar_apex_29.so",
10645 }
10646 cc_api_library {
10647 name: "libbaz",
10648 src: "libbaz_stub.so",
10649 min_sdk_version: "29",
10650 variants: ["apex.29"],
10651 }
10652 cc_api_variant {
10653 name: "libbaz",
10654 variant: "apex",
10655 version: "29",
10656 src: "libbaz_apex_29.so",
10657 }
10658 cc_api_library {
10659 name: "libqux",
10660 src: "libqux_stub.so",
10661 min_sdk_version: "29",
10662 variants: ["apex.29"],
10663 }
10664 cc_api_variant {
10665 name: "libqux",
10666 variant: "apex",
10667 version: "29",
10668 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010669 }
10670 api_imports {
10671 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010672 apex_shared_libs: [
10673 "libbar",
10674 "libbaz",
10675 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010676 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010677 }
10678 `
10679 result := testApex(t, bp)
10680
10681 hasDep := func(m android.Module, wantDep android.Module) bool {
10682 t.Helper()
10683 var found bool
10684 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10685 if dep == wantDep {
10686 found = true
10687 }
10688 })
10689 return found
10690 }
10691
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010692 // Library defines stubs and cc_api_library should be used with cc_api_library
10693 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10694 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10695 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010696
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010697 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10698 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010699
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010700 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10701 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10702 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10703 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10704
10705 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10706 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10707 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10708 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10709 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10710
10711 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10712 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10713 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10714
10715 // cc_api_library defined without original library should be linked with cc_api_library
10716 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10717 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10718 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10719}
10720
10721func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10722 bp := `
10723 apex {
10724 name: "myapex",
10725 key: "myapex.key",
10726 native_shared_libs: ["libbar"],
10727 min_sdk_version: "29",
10728 }
10729 apex_key {
10730 name: "myapex.key",
10731 }
10732 cc_binary {
10733 name: "binfoo",
10734 shared_libs: ["libbar"],
10735 recovery_available: false,
10736 }
10737 cc_library {
10738 name: "libbar",
10739 srcs: ["libbar.cc"],
10740 apex_available: ["myapex"],
10741 min_sdk_version: "29",
10742 stubs: {
10743 symbol_file: "libbar.map.txt",
10744 versions: [
10745 "29",
10746 ],
10747 },
10748 }
10749 cc_api_library {
10750 name: "libbar",
10751 src: "libbar_stub.so",
10752 variants: ["apex.29"],
10753 }
10754 cc_api_variant {
10755 name: "libbar",
10756 variant: "apex",
10757 version: "29",
10758 src: "libbar_apex_29.so",
10759 }
10760 api_imports {
10761 name: "api_imports",
10762 apex_shared_libs: [
10763 "libbar",
10764 ],
10765 }
10766 `
10767
10768 result := testApex(t, bp)
10769
10770 hasDep := func(m android.Module, wantDep android.Module) bool {
10771 t.Helper()
10772 var found bool
10773 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10774 if dep == wantDep {
10775 found = true
10776 }
10777 })
10778 return found
10779 }
10780
10781 // Library defines stubs and cc_api_library should be used with cc_api_library
10782 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10783 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10784 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10785
10786 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10787 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10788
10789 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10790 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10791 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10792 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010793}
Dennis Shend4f5d932023-01-31 20:27:21 +000010794
10795func TestTrimmedApex(t *testing.T) {
10796 bp := `
10797 apex {
10798 name: "myapex",
10799 key: "myapex.key",
10800 native_shared_libs: ["libfoo","libbaz"],
10801 min_sdk_version: "29",
10802 trim_against: "mydcla",
10803 }
10804 apex {
10805 name: "mydcla",
10806 key: "myapex.key",
10807 native_shared_libs: ["libfoo","libbar"],
10808 min_sdk_version: "29",
10809 file_contexts: ":myapex-file_contexts",
10810 dynamic_common_lib_apex: true,
10811 }
10812 apex_key {
10813 name: "myapex.key",
10814 }
10815 cc_library {
10816 name: "libfoo",
10817 shared_libs: ["libc"],
10818 apex_available: ["myapex","mydcla"],
10819 min_sdk_version: "29",
10820 }
10821 cc_library {
10822 name: "libbar",
10823 shared_libs: ["libc"],
10824 apex_available: ["myapex","mydcla"],
10825 min_sdk_version: "29",
10826 }
10827 cc_library {
10828 name: "libbaz",
10829 shared_libs: ["libc"],
10830 apex_available: ["myapex","mydcla"],
10831 min_sdk_version: "29",
10832 }
10833 cc_api_library {
10834 name: "libc",
10835 src: "libc.so",
10836 min_sdk_version: "29",
10837 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010838 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010839 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010840 }
10841 api_imports {
10842 name: "api_imports",
10843 shared_libs: [
10844 "libc",
10845 ],
10846 header_libs: [],
10847 }
10848 `
10849 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010850 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010851 apexRule := module.MaybeRule("apexRule")
10852 if apexRule.Rule == nil {
10853 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10854 }
10855
10856 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010857 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010858 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10859 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10860 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10861 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10862}
Jingwen Chendea7a642023-03-28 11:30:50 +000010863
10864func TestCannedFsConfig(t *testing.T) {
10865 ctx := testApex(t, `
10866 apex {
10867 name: "myapex",
10868 key: "myapex.key",
10869 updatable: false,
10870 }
10871
10872 apex_key {
10873 name: "myapex.key",
10874 public_key: "testkey.avbpubkey",
10875 private_key: "testkey.pem",
10876 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010877 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010878 generateFsRule := mod.Rule("generateFsConfig")
10879 cmd := generateFsRule.RuleParams.Command
10880
10881 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10882}
10883
10884func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10885 ctx := testApex(t, `
10886 apex {
10887 name: "myapex",
10888 key: "myapex.key",
10889 canned_fs_config: "my_config",
10890 updatable: false,
10891 }
10892
10893 apex_key {
10894 name: "myapex.key",
10895 public_key: "testkey.avbpubkey",
10896 private_key: "testkey.pem",
10897 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010898 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010899 generateFsRule := mod.Rule("generateFsConfig")
10900 cmd := generateFsRule.RuleParams.Command
10901
10902 // Ensure that canned_fs_config has "cat my_config" at the end
10903 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10904}
Spandan Das20fce2d2023-04-12 17:21:39 +000010905
10906func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10907 testCases := []struct {
10908 desc string
10909 hasStubs bool
10910 apexAvailable string
10911 expectedError string
10912 }{
10913 {
10914 desc: "non-stub library can have multiple apex_available",
10915 hasStubs: false,
10916 apexAvailable: `["myapex", "otherapex"]`,
10917 },
10918 {
10919 desc: "stub library should not be available to anyapex",
10920 hasStubs: true,
10921 apexAvailable: `["//apex_available:anyapex"]`,
10922 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10923 },
10924 {
10925 desc: "stub library should not be available to multiple apexes",
10926 hasStubs: true,
10927 apexAvailable: `["myapex", "otherapex"]`,
10928 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10929 },
10930 {
10931 desc: "stub library can be available to a core apex and a test apex",
10932 hasStubs: true,
10933 apexAvailable: `["myapex", "test_myapex"]`,
10934 },
10935 }
10936 bpTemplate := `
10937 cc_library {
10938 name: "libfoo",
10939 %v
10940 apex_available: %v,
10941 }
10942 apex {
10943 name: "myapex",
10944 key: "apex.key",
10945 updatable: false,
10946 native_shared_libs: ["libfoo"],
10947 }
10948 apex {
10949 name: "otherapex",
10950 key: "apex.key",
10951 updatable: false,
10952 }
10953 apex_test {
10954 name: "test_myapex",
10955 key: "apex.key",
10956 updatable: false,
10957 native_shared_libs: ["libfoo"],
10958 }
10959 apex_key {
10960 name: "apex.key",
10961 }
10962 `
10963 for _, tc := range testCases {
10964 stubs := ""
10965 if tc.hasStubs {
10966 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10967 }
10968 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10969 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10970 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10971 })
10972 if tc.expectedError == "" {
10973 testApex(t, bp, mockFsFixturePreparer)
10974 } else {
10975 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10976 }
10977 }
10978}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010979
10980func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10981 context := android.GroupFixturePreparers(
10982 android.PrepareForIntegrationTestWithAndroid,
10983 cc.PrepareForIntegrationTestWithCc,
10984 PrepareForTestWithApexBuildComponents,
10985 prepareForTestWithMyapex,
10986 filesystem.PrepareForTestWithFilesystemBuildComponents,
10987 )
10988 result := context.RunTestWithBp(t, `
10989 android_system_image {
10990 name: "myfilesystem",
10991 deps: [
10992 "libfoo",
10993 ],
10994 linker_config_src: "linker.config.json",
10995 }
10996
10997 cc_library {
10998 name: "libfoo",
10999 shared_libs: [
11000 "libbar",
11001 ],
11002 stl: "none",
11003 }
11004
11005 cc_library {
11006 name: "libbar",
11007 stl: "none",
11008 apex_available: ["myapex"],
11009 }
11010
11011 apex {
11012 name: "myapex",
11013 native_shared_libs: ["libbar"],
11014 key: "myapex.key",
11015 updatable: false,
11016 }
11017
11018 apex_key {
11019 name: "myapex.key",
11020 public_key: "testkey.avbpubkey",
11021 private_key: "testkey.pem",
11022 }
11023 `)
11024
11025 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
11026 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
11027 inputs.Strings(),
11028 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
11029}
Yu Liueae7b362023-11-16 17:05:47 -080011030
11031var apex_default_bp = `
11032 apex_key {
11033 name: "myapex.key",
11034 public_key: "testkey.avbpubkey",
11035 private_key: "testkey.pem",
11036 }
11037
11038 filegroup {
11039 name: "myapex.manifest",
11040 srcs: ["apex_manifest.json"],
11041 }
11042
11043 filegroup {
11044 name: "myapex.androidmanifest",
11045 srcs: ["AndroidManifest.xml"],
11046 }
11047`
11048
11049func TestAconfigFilesJavaDeps(t *testing.T) {
11050 ctx := testApex(t, apex_default_bp+`
11051 apex {
11052 name: "myapex",
11053 manifest: ":myapex.manifest",
11054 androidManifest: ":myapex.androidmanifest",
11055 key: "myapex.key",
11056 java_libs: [
11057 "my_java_library_foo",
11058 "my_java_library_bar",
11059 ],
11060 updatable: false,
11061 }
11062
11063 java_library {
11064 name: "my_java_library_foo",
11065 srcs: ["foo/bar/MyClass.java"],
11066 sdk_version: "none",
11067 system_modules: "none",
11068 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011069 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011070 "myapex",
11071 ],
11072 }
11073
11074 java_library {
11075 name: "my_java_library_bar",
11076 srcs: ["foo/bar/MyClass.java"],
11077 sdk_version: "none",
11078 system_modules: "none",
11079 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011080 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011081 "myapex",
11082 ],
11083 }
11084
11085 aconfig_declarations {
11086 name: "my_aconfig_declarations_foo",
11087 package: "com.example.package",
11088 container: "myapex",
11089 srcs: ["foo.aconfig"],
11090 }
11091
11092 java_aconfig_library {
11093 name: "my_java_aconfig_library_foo",
11094 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011095 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011096 "myapex",
11097 ],
11098 }
11099
11100 aconfig_declarations {
11101 name: "my_aconfig_declarations_bar",
11102 package: "com.example.package",
11103 container: "myapex",
11104 srcs: ["bar.aconfig"],
11105 }
11106
11107 java_aconfig_library {
11108 name: "my_java_aconfig_library_bar",
11109 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011110 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011111 "myapex",
11112 ],
11113 }
11114 `)
11115
11116 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11117 s := mod.Rule("apexRule").Args["copy_commands"]
11118 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011119 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080011120 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11121 }
11122
Yu Liuab31c822024-02-28 22:21:31 +000011123 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11124 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
11125 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
11126 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080011127
Yu Liubba555e2024-02-17 00:36:42 +000011128 inputs := []string{
11129 "my_aconfig_declarations_foo/intermediate.pb",
11130 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080011131 }
Yu Liubba555e2024-02-17 00:36:42 +000011132 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11133 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11134 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11135 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080011136}
11137
11138func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11139 ctx := testApex(t, apex_default_bp+`
11140 apex {
11141 name: "myapex",
11142 manifest: ":myapex.manifest",
11143 androidManifest: ":myapex.androidmanifest",
11144 key: "myapex.key",
11145 java_libs: [
11146 "my_java_library_foo",
11147 ],
11148 native_shared_libs: [
11149 "my_cc_library_bar",
11150 ],
11151 binaries: [
11152 "my_cc_binary_baz",
11153 ],
11154 updatable: false,
11155 }
11156
11157 java_library {
11158 name: "my_java_library_foo",
11159 srcs: ["foo/bar/MyClass.java"],
11160 sdk_version: "none",
11161 system_modules: "none",
11162 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011163 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011164 "myapex",
11165 ],
11166 }
11167
11168 cc_library {
11169 name: "my_cc_library_bar",
11170 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011171 static_libs: [
11172 "my_cc_aconfig_library_bar",
11173 "my_cc_aconfig_library_baz",
11174 ],
Yu Liueae7b362023-11-16 17:05:47 -080011175 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011176 "myapex",
11177 ],
11178 }
11179
11180 cc_binary {
11181 name: "my_cc_binary_baz",
11182 srcs: ["foo/bar/MyClass.cc"],
11183 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011184 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011185 "myapex",
11186 ],
11187 }
11188
11189 aconfig_declarations {
11190 name: "my_aconfig_declarations_foo",
11191 package: "com.example.package",
11192 container: "myapex",
11193 srcs: ["foo.aconfig"],
11194 }
11195
11196 java_aconfig_library {
11197 name: "my_java_aconfig_library_foo",
11198 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011199 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011200 "myapex",
11201 ],
11202 }
11203
11204 aconfig_declarations {
11205 name: "my_aconfig_declarations_bar",
11206 package: "com.example.package",
11207 container: "myapex",
11208 srcs: ["bar.aconfig"],
11209 }
11210
11211 cc_aconfig_library {
11212 name: "my_cc_aconfig_library_bar",
11213 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011214 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011215 "myapex",
11216 ],
11217 }
11218
11219 aconfig_declarations {
11220 name: "my_aconfig_declarations_baz",
11221 package: "com.example.package",
11222 container: "myapex",
11223 srcs: ["baz.aconfig"],
11224 }
11225
11226 cc_aconfig_library {
11227 name: "my_cc_aconfig_library_baz",
11228 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011229 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011230 "myapex",
11231 ],
11232 }
11233
11234 cc_library {
11235 name: "server_configurable_flags",
11236 srcs: ["server_configurable_flags.cc"],
11237 }
11238 `)
11239
11240 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11241 s := mod.Rule("apexRule").Args["copy_commands"]
11242 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011243 if len(copyCmds) != 12 {
11244 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080011245 }
11246
Yu Liuab31c822024-02-28 22:21:31 +000011247 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11248 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
11249 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
11250 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080011251
Yu Liubba555e2024-02-17 00:36:42 +000011252 inputs := []string{
11253 "my_aconfig_declarations_foo/intermediate.pb",
11254 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
11255 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080011256 }
Yu Liubba555e2024-02-17 00:36:42 +000011257 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11258 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11259 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11260 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080011261}
11262
Yu Liucec0e412023-11-30 16:45:50 -080011263func TestAconfigFilesRustDeps(t *testing.T) {
11264 ctx := testApex(t, apex_default_bp+`
11265 apex {
11266 name: "myapex",
11267 manifest: ":myapex.manifest",
11268 androidManifest: ":myapex.androidmanifest",
11269 key: "myapex.key",
11270 native_shared_libs: [
11271 "libmy_rust_library",
11272 ],
11273 binaries: [
11274 "my_rust_binary",
11275 ],
11276 rust_dyn_libs: [
11277 "libmy_rust_dylib",
11278 ],
11279 updatable: false,
11280 }
11281
11282 rust_library {
11283 name: "libflags_rust", // test mock
11284 crate_name: "flags_rust",
11285 srcs: ["lib.rs"],
11286 apex_available: [
11287 "myapex",
11288 ],
11289 }
11290
11291 rust_library {
11292 name: "liblazy_static", // test mock
11293 crate_name: "lazy_static",
11294 srcs: ["src/lib.rs"],
11295 apex_available: [
11296 "myapex",
11297 ],
11298 }
11299
11300 rust_ffi_shared {
11301 name: "libmy_rust_library",
11302 srcs: ["src/lib.rs"],
11303 rustlibs: ["libmy_rust_aconfig_library_foo"],
11304 crate_name: "my_rust_library",
11305 apex_available: [
11306 "myapex",
11307 ],
11308 }
11309
11310 rust_library_dylib {
11311 name: "libmy_rust_dylib",
11312 srcs: ["foo/bar/MyClass.rs"],
11313 rustlibs: ["libmy_rust_aconfig_library_bar"],
11314 crate_name: "my_rust_dylib",
11315 apex_available: [
11316 "myapex",
11317 ],
11318 }
11319
11320 rust_binary {
11321 name: "my_rust_binary",
11322 srcs: ["foo/bar/MyClass.rs"],
11323 rustlibs: [
11324 "libmy_rust_aconfig_library_baz",
11325 "libmy_rust_dylib",
11326 ],
11327 apex_available: [
11328 "myapex",
11329 ],
11330 }
11331
11332 aconfig_declarations {
11333 name: "my_aconfig_declarations_foo",
11334 package: "com.example.package",
11335 container: "myapex",
11336 srcs: ["foo.aconfig"],
11337 }
11338
11339 aconfig_declarations {
11340 name: "my_aconfig_declarations_bar",
11341 package: "com.example.package",
11342 container: "myapex",
11343 srcs: ["bar.aconfig"],
11344 }
11345
11346 aconfig_declarations {
11347 name: "my_aconfig_declarations_baz",
11348 package: "com.example.package",
11349 container: "myapex",
11350 srcs: ["baz.aconfig"],
11351 }
11352
11353 rust_aconfig_library {
11354 name: "libmy_rust_aconfig_library_foo",
11355 aconfig_declarations: "my_aconfig_declarations_foo",
11356 crate_name: "my_rust_aconfig_library_foo",
11357 apex_available: [
11358 "myapex",
11359 ],
11360 }
11361
11362 rust_aconfig_library {
11363 name: "libmy_rust_aconfig_library_bar",
11364 aconfig_declarations: "my_aconfig_declarations_bar",
11365 crate_name: "my_rust_aconfig_library_bar",
11366 apex_available: [
11367 "myapex",
11368 ],
11369 }
11370
11371 rust_aconfig_library {
11372 name: "libmy_rust_aconfig_library_baz",
11373 aconfig_declarations: "my_aconfig_declarations_baz",
11374 crate_name: "my_rust_aconfig_library_baz",
11375 apex_available: [
11376 "myapex",
11377 ],
11378 }
11379 `)
11380
11381 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11382 s := mod.Rule("apexRule").Args["copy_commands"]
11383 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011384 if len(copyCmds) != 26 {
11385 t.Fatalf("Expected 26 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011386 }
11387
Yu Liuab31c822024-02-28 22:21:31 +000011388 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11389 ensureMatches(t, copyCmds[23], "^cp -f .*/package.map .*/image.apex/etc$")
11390 ensureMatches(t, copyCmds[24], "^cp -f .*/flag.map .*/image.apex/etc$")
11391 ensureMatches(t, copyCmds[25], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011392
Yu Liubba555e2024-02-17 00:36:42 +000011393 inputs := []string{
11394 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011395 "my_aconfig_declarations_bar/intermediate.pb",
11396 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011397 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11398 }
11399 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11400 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11401 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11402 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11403}
11404
11405func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11406 aconfigRule := mod.Description(desc)
11407 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011408 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011409 if len(aconfigArgs) != len(inputs) {
11410 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011411 }
Yu Liucec0e412023-11-30 16:45:50 -080011412
Yu Liubba555e2024-02-17 00:36:42 +000011413 ensureEquals(t, container, aconfigRule.Args["container"])
11414 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11415
11416 buildParams := aconfigRule.BuildParams
11417 for _, input := range inputs {
11418 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11419 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011420 }
Yu Liubba555e2024-02-17 00:36:42 +000011421
11422 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011423}
11424
Yu Liueae7b362023-11-16 17:05:47 -080011425func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11426 ctx := testApex(t, apex_default_bp+`
11427 apex {
11428 name: "myapex",
11429 manifest: ":myapex.manifest",
11430 androidManifest: ":myapex.androidmanifest",
11431 key: "myapex.key",
11432 java_libs: [
11433 "my_java_library_foo",
11434 "other_java_library_bar",
11435 ],
11436 updatable: false,
11437 }
11438
11439 java_library {
11440 name: "my_java_library_foo",
11441 srcs: ["foo/bar/MyClass.java"],
11442 sdk_version: "none",
11443 system_modules: "none",
11444 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011445 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011446 "myapex",
11447 ],
11448 }
11449
11450 java_library {
11451 name: "other_java_library_bar",
11452 srcs: ["foo/bar/MyClass.java"],
11453 sdk_version: "none",
11454 system_modules: "none",
11455 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011456 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011457 "myapex",
11458 ],
11459 }
11460
11461 aconfig_declarations {
11462 name: "my_aconfig_declarations_foo",
11463 package: "com.example.package",
11464 container: "myapex",
11465 srcs: ["foo.aconfig"],
11466 }
11467
11468 java_aconfig_library {
11469 name: "my_java_aconfig_library_foo",
11470 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011471 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011472 "myapex",
11473 ],
11474 }
11475
11476 aconfig_declarations {
11477 name: "other_aconfig_declarations_bar",
11478 package: "com.example.package",
11479 container: "otherapex",
11480 srcs: ["bar.aconfig"],
11481 }
11482
11483 java_aconfig_library {
11484 name: "other_java_aconfig_library_bar",
11485 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011486 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011487 "myapex",
11488 ],
11489 }
11490 `)
11491
11492 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11493 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11494 s := " " + combineAconfigRule.Args["cache_files"]
11495 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11496 if len(aconfigArgs) != 1 {
11497 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11498 }
11499 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11500
11501 buildParams := combineAconfigRule.BuildParams
11502 if len(buildParams.Inputs) != 1 {
11503 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11504 }
11505 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11506 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11507}
11508
11509func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11510 ctx := testApex(t, apex_default_bp+`
11511 apex {
11512 name: "myapex",
11513 manifest: ":myapex.manifest",
11514 androidManifest: ":myapex.androidmanifest",
11515 key: "myapex.key",
11516 java_libs: [
11517 "my_java_library_foo",
11518 "my_java_library_bar",
11519 ],
11520 updatable: false,
11521 }
11522
11523 java_library {
11524 name: "my_java_library_foo",
11525 srcs: ["foo/bar/MyClass.java"],
11526 sdk_version: "none",
11527 system_modules: "none",
11528 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011529 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011530 "myapex",
11531 ],
11532 }
11533
11534 java_library {
11535 name: "my_java_library_bar",
11536 srcs: ["foo/bar/MyClass.java"],
11537 sdk_version: "none",
11538 system_modules: "none",
11539 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011540 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011541 "myapex",
11542 ],
11543 }
11544
11545 aconfig_declarations {
11546 name: "my_aconfig_declarations_foo",
11547 package: "com.example.package",
11548 container: "myapex",
11549 srcs: ["foo.aconfig"],
11550 }
11551
11552 java_aconfig_library {
11553 name: "my_java_aconfig_library_foo",
11554 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011555 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011556 "myapex",
11557 ],
11558 }
11559
11560 java_aconfig_library {
11561 name: "my_java_aconfig_library_bar",
11562 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011563 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011564 "myapex",
11565 ],
11566 }
11567 `)
11568
11569 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11570 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11571 s := " " + combineAconfigRule.Args["cache_files"]
11572 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11573 if len(aconfigArgs) != 1 {
11574 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11575 }
11576 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11577
11578 buildParams := combineAconfigRule.BuildParams
11579 if len(buildParams.Inputs) != 1 {
11580 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11581 }
11582 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11583 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11584}
Spandan Das5be63332023-12-13 00:06:32 +000011585
11586// Test that the boot jars come from the _selected_ apex prebuilt
11587// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11588func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11589 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11590 t.Helper()
11591 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11592 foundLibfooJar := false
11593 base := stem + ".jar"
11594 for _, output := range s.AllOutputs() {
11595 if filepath.Base(output) == base {
11596 foundLibfooJar = true
11597 buildRule := s.Output(output)
11598 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11599 }
11600 }
11601 if !foundLibfooJar {
11602 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11603 }
11604 }
11605
Spandan Das64c9e0c2023-12-20 20:13:34 +000011606 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11607 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11608 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11609 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11610 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11611 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)
11612 }
11613
11614 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11615 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11616 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11617 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11618 }
11619
Spandan Das5be63332023-12-13 00:06:32 +000011620 bp := `
11621 // Source APEX.
11622
11623 java_library {
11624 name: "framework-foo",
11625 srcs: ["foo.java"],
11626 installable: true,
11627 apex_available: [
11628 "com.android.foo",
11629 ],
11630 }
11631
11632 bootclasspath_fragment {
11633 name: "foo-bootclasspath-fragment",
11634 contents: ["framework-foo"],
11635 apex_available: [
11636 "com.android.foo",
11637 ],
11638 hidden_api: {
11639 split_packages: ["*"],
11640 },
11641 }
11642
11643 apex_key {
11644 name: "com.android.foo.key",
11645 public_key: "com.android.foo.avbpubkey",
11646 private_key: "com.android.foo.pem",
11647 }
11648
11649 apex {
11650 name: "com.android.foo",
11651 key: "com.android.foo.key",
11652 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11653 updatable: false,
11654 }
11655
11656 // Prebuilt APEX.
11657
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011658 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011659 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011660 public: {
11661 jars: ["foo.jar"],
11662 },
Spandan Das5be63332023-12-13 00:06:32 +000011663 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011664 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011665 }
11666
11667 prebuilt_bootclasspath_fragment {
11668 name: "foo-bootclasspath-fragment",
11669 contents: ["framework-foo"],
11670 hidden_api: {
11671 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11672 metadata: "my-bootclasspath-fragment/metadata.csv",
11673 index: "my-bootclasspath-fragment/index.csv",
11674 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11675 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11676 },
11677 apex_available: [
11678 "com.android.foo",
11679 ],
11680 }
11681
11682 prebuilt_apex {
11683 name: "com.android.foo",
11684 apex_name: "com.android.foo",
11685 src: "com.android.foo-arm.apex",
11686 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11687 }
11688
11689 // Another Prebuilt ART APEX
11690 prebuilt_apex {
11691 name: "com.android.foo.v2",
11692 apex_name: "com.android.foo", // Used to determine the API domain
11693 src: "com.android.foo-arm.apex",
11694 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11695 }
11696
11697 // APEX contribution modules
11698
11699 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011700 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011701 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011702 contents: ["com.android.foo"],
11703 }
11704
11705 apex_contributions {
11706 name: "foo.prebuilt.contributions",
11707 api_domain: "com.android.foo",
11708 contents: ["prebuilt_com.android.foo"],
11709 }
11710
11711 apex_contributions {
11712 name: "foo.prebuilt.v2.contributions",
11713 api_domain: "com.android.foo",
11714 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011715 }
11716 `
11717
11718 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011719 desc string
11720 selectedApexContributions string
11721 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011722 }{
11723 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011724 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11725 selectedApexContributions: "foo.source.contributions",
11726 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011727 },
11728 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011729 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11730 selectedApexContributions: "foo.prebuilt.contributions",
11731 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011732 },
11733 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011734 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11735 selectedApexContributions: "foo.prebuilt.v2.contributions",
11736 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011737 },
11738 }
11739
11740 fragment := java.ApexVariantReference{
11741 Apex: proptools.StringPtr("com.android.foo"),
11742 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11743 }
11744
11745 for _, tc := range testCases {
11746 preparer := android.GroupFixturePreparers(
11747 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11748 android.FixtureMergeMockFs(map[string][]byte{
11749 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11750 }),
11751 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11752 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011753 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011754 }
11755 }),
11756 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011757 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011758 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011759 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11760 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011761 }
11762}
Spandan Das3576e762024-01-03 18:57:03 +000011763
11764// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11765// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11766func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11767 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11768 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11769 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11770 // Variations are created based on apex_name
11771 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11772 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11773 }
11774 // for a mainline module family, check that only the flagged soong module is visible to make
11775 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11776 variation := func(moduleName string) string {
11777 ret := "android_common_com.android.foo"
11778 if moduleName == "com.google.android.foo" {
11779 ret = "android_common_com.google.android.foo_com.android.foo"
11780 }
11781 return ret
11782 }
11783
11784 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11785 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11786
11787 for _, hiddenModuleName := range hiddenModuleNames {
11788 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11789 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11790
11791 }
11792 }
11793
11794 bp := `
11795 apex_key {
11796 name: "com.android.foo.key",
11797 public_key: "com.android.foo.avbpubkey",
11798 private_key: "com.android.foo.pem",
11799 }
11800
11801 // AOSP source apex
11802 apex {
11803 name: "com.android.foo",
11804 key: "com.android.foo.key",
11805 updatable: false,
11806 }
11807
11808 // Google source apex
11809 override_apex {
11810 name: "com.google.android.foo",
11811 base: "com.android.foo",
11812 key: "com.android.foo.key",
11813 }
11814
11815 // Prebuilt Google APEX.
11816
11817 prebuilt_apex {
11818 name: "com.google.android.foo",
11819 apex_name: "com.android.foo",
11820 src: "com.android.foo-arm.apex",
11821 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11822 }
11823
11824 // Another Prebuilt Google APEX
11825 prebuilt_apex {
11826 name: "com.google.android.foo.v2",
11827 apex_name: "com.android.foo",
11828 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11829 src: "com.android.foo-arm.apex",
11830 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11831 }
11832
11833 // APEX contribution modules
11834
11835 apex_contributions {
11836 name: "foo.source.contributions",
11837 api_domain: "com.android.foo",
11838 contents: ["com.google.android.foo"],
11839 }
11840
11841 apex_contributions {
11842 name: "foo.prebuilt.contributions",
11843 api_domain: "com.android.foo",
11844 contents: ["prebuilt_com.google.android.foo"],
11845 }
11846
11847 apex_contributions {
11848 name: "foo.prebuilt.v2.contributions",
11849 api_domain: "com.android.foo",
11850 contents: ["prebuilt_com.google.android.foo.v2"],
11851 }
11852
11853 // This is an incompatible module because it selects multiple versions of the same mainline module
11854 apex_contributions {
11855 name: "foo.prebuilt.duplicate.contributions",
11856 api_domain: "com.android.foo",
11857 contents: [
11858 "prebuilt_com.google.android.foo",
11859 "prebuilt_com.google.android.foo.v2",
11860 ],
11861 }
11862 `
11863
11864 testCases := []struct {
11865 desc string
11866 selectedApexContributions string
11867 expectedVisibleModuleName string
11868 expectedHiddenModuleNames []string
11869 expectedError string
11870 }{
11871 {
11872 desc: "Source apex is selected, prebuilts should be hidden from make",
11873 selectedApexContributions: "foo.source.contributions",
11874 expectedVisibleModuleName: "com.google.android.foo",
11875 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11876 },
11877 {
11878 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11879 selectedApexContributions: "foo.prebuilt.contributions",
11880 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11881 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11882 },
11883 {
11884 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11885 selectedApexContributions: "foo.prebuilt.v2.contributions",
11886 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11887 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11888 },
11889 {
11890 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11891 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11892 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11893 },
11894 }
11895
11896 for _, tc := range testCases {
11897 preparer := android.GroupFixturePreparers(
11898 android.FixtureMergeMockFs(map[string][]byte{
11899 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11900 }),
11901 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11902 variables.BuildFlags = map[string]string{
11903 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11904 }
11905 }),
11906 )
11907 if tc.expectedError != "" {
11908 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11909 testApex(t, bp, preparer)
11910 return
11911 }
11912 ctx := testApex(t, bp, preparer)
11913
11914 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11915 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11916 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11917 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11918
11919 // Check that
11920 // 1. The contents of the selected apex_contributions are visible to make
11921 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11922 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11923 }
11924}