blob: 5cc50dd80d5bacec9859294b5848d4c17493b691 [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,
Jiyong Park04480cf2019-02-06 00:16:29 +09005049 }
5050
5051 apex_key {
5052 name: "myapex.key",
5053 public_key: "testkey.avbpubkey",
5054 private_key: "testkey.pem",
5055 }
5056
5057 sh_binary {
5058 name: "myscript",
5059 src: "mylib.cpp",
5060 filename: "myscript.sh",
5061 sub_dir: "script",
5062 }
5063 `)
5064
Jooyung Hana0503a52023-08-23 13:12:50 +09005065 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09005066 copyCmds := apexRule.Args["copy_commands"]
5067
5068 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
5069}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005070
Jooyung Han91df2082019-11-20 01:49:42 +09005071func TestApexInVariousPartition(t *testing.T) {
5072 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005073 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005074 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005075 {"", "system"},
5076 {"product_specific: true", "product"},
5077 {"soc_specific: true", "vendor"},
5078 {"proprietary: true", "vendor"},
5079 {"vendor: true", "vendor"},
5080 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005081 }
5082 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005083 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005084 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005085 apex {
5086 name: "myapex",
5087 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005088 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005089 `+tc.propName+`
5090 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005091
Jooyung Han91df2082019-11-20 01:49:42 +09005092 apex_key {
5093 name: "myapex.key",
5094 public_key: "testkey.avbpubkey",
5095 private_key: "testkey.pem",
5096 }
5097 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005098
Jooyung Hana0503a52023-08-23 13:12:50 +09005099 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005100 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005101 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005102 if actual != expected {
5103 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5104 }
Jooyung Han91df2082019-11-20 01:49:42 +09005105 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005106 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005107}
Jiyong Park67882562019-03-21 01:11:21 +09005108
Jooyung Han580eb4f2020-06-24 19:33:06 +09005109func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005110 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005111 apex {
5112 name: "myapex",
5113 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005114 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005115 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005116
Jooyung Han580eb4f2020-06-24 19:33:06 +09005117 apex_key {
5118 name: "myapex.key",
5119 public_key: "testkey.avbpubkey",
5120 private_key: "testkey.pem",
5121 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005122 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005123 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005124 rule := module.Output("file_contexts")
5125 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5126}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005127
Jooyung Han580eb4f2020-06-24 19:33:06 +09005128func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005129 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005130 apex {
5131 name: "myapex",
5132 key: "myapex.key",
5133 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005134 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005135 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005136
Jooyung Han580eb4f2020-06-24 19:33:06 +09005137 apex_key {
5138 name: "myapex.key",
5139 public_key: "testkey.avbpubkey",
5140 private_key: "testkey.pem",
5141 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005142 `, withFiles(map[string][]byte{
5143 "my_own_file_contexts": nil,
5144 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005145}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005146
Jooyung Han580eb4f2020-06-24 19:33:06 +09005147func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005148 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005149 apex {
5150 name: "myapex",
5151 key: "myapex.key",
5152 product_specific: true,
5153 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005154 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005155 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005156
Jooyung Han580eb4f2020-06-24 19:33:06 +09005157 apex_key {
5158 name: "myapex.key",
5159 public_key: "testkey.avbpubkey",
5160 private_key: "testkey.pem",
5161 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005162 `)
5163
Colin Cross1c460562021-02-16 17:55:47 -08005164 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005165 apex {
5166 name: "myapex",
5167 key: "myapex.key",
5168 product_specific: true,
5169 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005170 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005171 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005172
Jooyung Han580eb4f2020-06-24 19:33:06 +09005173 apex_key {
5174 name: "myapex.key",
5175 public_key: "testkey.avbpubkey",
5176 private_key: "testkey.pem",
5177 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005178 `, withFiles(map[string][]byte{
5179 "product_specific_file_contexts": nil,
5180 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005181 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005182 rule := module.Output("file_contexts")
5183 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5184}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005185
Jooyung Han580eb4f2020-06-24 19:33:06 +09005186func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005187 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005188 apex {
5189 name: "myapex",
5190 key: "myapex.key",
5191 product_specific: true,
5192 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005193 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005194 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005195
Jooyung Han580eb4f2020-06-24 19:33:06 +09005196 apex_key {
5197 name: "myapex.key",
5198 public_key: "testkey.avbpubkey",
5199 private_key: "testkey.pem",
5200 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005201
Jooyung Han580eb4f2020-06-24 19:33:06 +09005202 filegroup {
5203 name: "my-file-contexts",
5204 srcs: ["product_specific_file_contexts"],
5205 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005206 `, withFiles(map[string][]byte{
5207 "product_specific_file_contexts": nil,
5208 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005209 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005210 rule := module.Output("file_contexts")
5211 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005212}
5213
Jiyong Park67882562019-03-21 01:11:21 +09005214func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005215 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005216 apex_key {
5217 name: "myapex.key",
5218 public_key: ":my.avbpubkey",
5219 private_key: ":my.pem",
5220 product_specific: true,
5221 }
5222
5223 filegroup {
5224 name: "my.avbpubkey",
5225 srcs: ["testkey2.avbpubkey"],
5226 }
5227
5228 filegroup {
5229 name: "my.pem",
5230 srcs: ["testkey2.pem"],
5231 }
5232 `)
5233
5234 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5235 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005236 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005237 if actual_pubkey != expected_pubkey {
5238 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5239 }
5240 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005241 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005242 if actual_privkey != expected_privkey {
5243 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5244 }
5245}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005246
5247func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005248 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005249 prebuilt_apex {
5250 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005251 arch: {
5252 arm64: {
5253 src: "myapex-arm64.apex",
5254 },
5255 arm: {
5256 src: "myapex-arm.apex",
5257 },
5258 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005259 }
5260 `)
5261
Wei Li340ee8e2022-03-18 17:33:24 -07005262 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5263 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005264
Jiyong Parkc95714e2019-03-29 14:23:10 +09005265 expectedInput := "myapex-arm64.apex"
5266 if prebuilt.inputApex.String() != expectedInput {
5267 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5268 }
Wei Li340ee8e2022-03-18 17:33:24 -07005269 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5270 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5271 rule := testingModule.Rule("genProvenanceMetaData")
5272 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5273 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5274 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5275 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005276
5277 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5278 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005279}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005280
Paul Duffinc0609c62021-03-01 17:27:16 +00005281func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005282 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005283 prebuilt_apex {
5284 name: "myapex",
5285 }
5286 `)
5287}
5288
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005289func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005290 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005291 prebuilt_apex {
5292 name: "myapex",
5293 src: "myapex-arm.apex",
5294 filename: "notmyapex.apex",
5295 }
5296 `)
5297
Wei Li340ee8e2022-03-18 17:33:24 -07005298 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5299 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005300
5301 expected := "notmyapex.apex"
5302 if p.installFilename != expected {
5303 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5304 }
Wei Li340ee8e2022-03-18 17:33:24 -07005305 rule := testingModule.Rule("genProvenanceMetaData")
5306 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5307 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5308 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5309 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005310}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005311
Samiul Islam7c02e262021-09-08 17:48:28 +01005312func TestApexSetFilenameOverride(t *testing.T) {
5313 testApex(t, `
5314 apex_set {
5315 name: "com.company.android.myapex",
5316 apex_name: "com.android.myapex",
5317 set: "company-myapex.apks",
5318 filename: "com.company.android.myapex.apex"
5319 }
5320 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5321
5322 testApex(t, `
5323 apex_set {
5324 name: "com.company.android.myapex",
5325 apex_name: "com.android.myapex",
5326 set: "company-myapex.apks",
5327 filename: "com.company.android.myapex.capex"
5328 }
5329 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5330
5331 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5332 apex_set {
5333 name: "com.company.android.myapex",
5334 apex_name: "com.android.myapex",
5335 set: "company-myapex.apks",
5336 filename: "some-random-suffix"
5337 }
5338 `)
5339}
5340
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005341func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005342 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005343 prebuilt_apex {
5344 name: "myapex.prebuilt",
5345 src: "myapex-arm.apex",
5346 overrides: [
5347 "myapex",
5348 ],
5349 }
5350 `)
5351
Wei Li340ee8e2022-03-18 17:33:24 -07005352 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5353 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005354
5355 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005356 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005357 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005358 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005359 }
Wei Li340ee8e2022-03-18 17:33:24 -07005360 rule := testingModule.Rule("genProvenanceMetaData")
5361 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5362 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5363 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5364 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005365}
5366
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005367func TestPrebuiltApexName(t *testing.T) {
5368 testApex(t, `
5369 prebuilt_apex {
5370 name: "com.company.android.myapex",
5371 apex_name: "com.android.myapex",
5372 src: "company-myapex-arm.apex",
5373 }
5374 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5375
5376 testApex(t, `
5377 apex_set {
5378 name: "com.company.android.myapex",
5379 apex_name: "com.android.myapex",
5380 set: "company-myapex.apks",
5381 }
5382 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5383}
5384
5385func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5386 _ = android.GroupFixturePreparers(
5387 java.PrepareForTestWithJavaDefaultModules,
5388 PrepareForTestWithApexBuildComponents,
5389 android.FixtureWithRootAndroidBp(`
5390 platform_bootclasspath {
5391 name: "platform-bootclasspath",
5392 fragments: [
5393 {
5394 apex: "com.android.art",
5395 module: "art-bootclasspath-fragment",
5396 },
5397 ],
5398 }
5399
5400 prebuilt_apex {
5401 name: "com.company.android.art",
5402 apex_name: "com.android.art",
5403 src: "com.company.android.art-arm.apex",
5404 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5405 }
5406
5407 prebuilt_bootclasspath_fragment {
5408 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005409 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005410 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005411 hidden_api: {
5412 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5413 metadata: "my-bootclasspath-fragment/metadata.csv",
5414 index: "my-bootclasspath-fragment/index.csv",
5415 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5416 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5417 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005418 }
5419
5420 java_import {
5421 name: "core-oj",
5422 jars: ["prebuilt.jar"],
5423 }
5424 `),
5425 ).RunTest(t)
5426}
5427
Spandan Das59a4a2b2024-01-09 21:35:56 +00005428// A minimal context object for use with DexJarBuildPath
5429type moduleErrorfTestCtx struct {
5430}
5431
5432func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5433}
5434
Paul Duffin092153d2021-01-26 11:42:39 +00005435// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5436// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005437func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005438 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005439
Paul Duffin89886cb2021-02-05 16:44:03 +00005440 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005441 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005442 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005443 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005444 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005445 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005446 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005447 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005448 android.NormalizePathForTesting(dexJarBuildPath))
5449 }
5450
5451 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005452 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005453 // Make sure the import has been given the correct path to the dex jar.
5454 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5455 dexJarBuildPath := p.DexJarInstallPath()
5456 stem := android.RemoveOptionalPrebuiltPrefix(name)
5457 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5458 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5459 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005460 }
5461
Paul Duffin39853512021-02-26 11:09:39 +00005462 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005463 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005464 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005465 android.AssertArrayString(t, "Check if there is no source variant",
5466 []string{"android_common"},
5467 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005468 }
5469
5470 t.Run("prebuilt only", func(t *testing.T) {
5471 bp := `
5472 prebuilt_apex {
5473 name: "myapex",
5474 arch: {
5475 arm64: {
5476 src: "myapex-arm64.apex",
5477 },
5478 arm: {
5479 src: "myapex-arm.apex",
5480 },
5481 },
Paul Duffin39853512021-02-26 11:09:39 +00005482 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005483 }
5484
5485 java_import {
5486 name: "libfoo",
5487 jars: ["libfoo.jar"],
5488 }
Paul Duffin39853512021-02-26 11:09:39 +00005489
5490 java_sdk_library_import {
5491 name: "libbar",
5492 public: {
5493 jars: ["libbar.jar"],
5494 },
5495 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005496 `
5497
5498 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5499 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5500
Spandan Das3576e762024-01-03 18:57:03 +00005501 deapexerName := deapexerModuleName("prebuilt_myapex")
5502 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005503
Paul Duffinf6932af2021-02-26 18:21:56 +00005504 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005505 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005506 rule := deapexer.Rule("deapexer")
5507 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5508 t.Errorf("expected: %q, found: %q", expected, actual)
5509 }
5510
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005511 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005512 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005513 rule = prebuiltApex.Rule("android/soong/android.Cp")
5514 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5515 t.Errorf("expected: %q, found: %q", expected, actual)
5516 }
5517
Paul Duffin89886cb2021-02-05 16:44:03 +00005518 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005519 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005520
5521 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005522 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005523 })
5524
5525 t.Run("prebuilt with source preferred", func(t *testing.T) {
5526
5527 bp := `
5528 prebuilt_apex {
5529 name: "myapex",
5530 arch: {
5531 arm64: {
5532 src: "myapex-arm64.apex",
5533 },
5534 arm: {
5535 src: "myapex-arm.apex",
5536 },
5537 },
Paul Duffin39853512021-02-26 11:09:39 +00005538 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005539 }
5540
5541 java_import {
5542 name: "libfoo",
5543 jars: ["libfoo.jar"],
5544 }
5545
5546 java_library {
5547 name: "libfoo",
5548 }
Paul Duffin39853512021-02-26 11:09:39 +00005549
5550 java_sdk_library_import {
5551 name: "libbar",
5552 public: {
5553 jars: ["libbar.jar"],
5554 },
5555 }
5556
5557 java_sdk_library {
5558 name: "libbar",
5559 srcs: ["foo/bar/MyClass.java"],
5560 unsafe_ignore_missing_latest_api: true,
5561 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005562 `
5563
5564 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5565 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5566
Paul Duffin89886cb2021-02-05 16:44:03 +00005567 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005568 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005569 ensureNoSourceVariant(t, ctx, "libfoo")
5570
5571 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005572 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005573 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005574 })
5575
5576 t.Run("prebuilt preferred with source", func(t *testing.T) {
5577 bp := `
5578 prebuilt_apex {
5579 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005580 arch: {
5581 arm64: {
5582 src: "myapex-arm64.apex",
5583 },
5584 arm: {
5585 src: "myapex-arm.apex",
5586 },
5587 },
Paul Duffin39853512021-02-26 11:09:39 +00005588 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005589 }
5590
5591 java_import {
5592 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005593 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005594 jars: ["libfoo.jar"],
5595 }
5596
5597 java_library {
5598 name: "libfoo",
5599 }
Paul Duffin39853512021-02-26 11:09:39 +00005600
5601 java_sdk_library_import {
5602 name: "libbar",
5603 prefer: true,
5604 public: {
5605 jars: ["libbar.jar"],
5606 },
5607 }
5608
5609 java_sdk_library {
5610 name: "libbar",
5611 srcs: ["foo/bar/MyClass.java"],
5612 unsafe_ignore_missing_latest_api: true,
5613 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005614 `
5615
5616 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5617 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5618
Paul Duffin89886cb2021-02-05 16:44:03 +00005619 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005620 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005621 ensureNoSourceVariant(t, ctx, "libfoo")
5622
5623 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005624 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005625 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005626 })
5627}
5628
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005629func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005630 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005631 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005632 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5633 // is disabled.
5634 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5635 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005636
Paul Duffin37856732021-02-26 14:24:15 +00005637 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5638 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005639 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005640 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005641 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005643 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005644 foundLibfooJar = true
5645 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005646 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005647 }
5648 }
5649 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005650 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 +00005651 }
5652 }
5653
Paul Duffin40a3f652021-07-19 13:11:24 +01005654 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005655 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005656 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005657 var rule android.TestingBuildParams
5658
5659 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5660 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005661 }
5662
Paul Duffin40a3f652021-07-19 13:11:24 +01005663 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5664 t.Helper()
5665 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5666 var rule android.TestingBuildParams
5667
5668 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5669 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5670 }
5671
Paul Duffin89f570a2021-06-16 01:42:33 +01005672 fragment := java.ApexVariantReference{
5673 Apex: proptools.StringPtr("myapex"),
5674 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5675 }
5676
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005677 t.Run("prebuilt only", func(t *testing.T) {
5678 bp := `
5679 prebuilt_apex {
5680 name: "myapex",
5681 arch: {
5682 arm64: {
5683 src: "myapex-arm64.apex",
5684 },
5685 arm: {
5686 src: "myapex-arm.apex",
5687 },
5688 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005689 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5690 }
5691
5692 prebuilt_bootclasspath_fragment {
5693 name: "my-bootclasspath-fragment",
5694 contents: ["libfoo", "libbar"],
5695 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005696 hidden_api: {
5697 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5698 metadata: "my-bootclasspath-fragment/metadata.csv",
5699 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005700 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5701 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5702 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005703 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005704 }
5705
5706 java_import {
5707 name: "libfoo",
5708 jars: ["libfoo.jar"],
5709 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005710 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 }
Paul Duffin37856732021-02-26 14:24:15 +00005712
5713 java_sdk_library_import {
5714 name: "libbar",
5715 public: {
5716 jars: ["libbar.jar"],
5717 },
5718 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005719 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005720 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005721 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005722 `
5723
Paul Duffin89f570a2021-06-16 01:42:33 +01005724 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005725 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5726 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005727
Paul Duffin537ea3d2021-05-14 10:38:00 +01005728 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005729 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005730 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005731 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005732 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005733 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 +01005734 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005735 })
5736
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005737 t.Run("apex_set only", func(t *testing.T) {
5738 bp := `
5739 apex_set {
5740 name: "myapex",
5741 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005742 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005743 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005744 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5745 }
5746
5747 java_import {
5748 name: "myjavalib",
5749 jars: ["myjavalib.jar"],
5750 apex_available: ["myapex"],
5751 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005752 }
5753
5754 prebuilt_bootclasspath_fragment {
5755 name: "my-bootclasspath-fragment",
5756 contents: ["libfoo", "libbar"],
5757 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005758 hidden_api: {
5759 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5760 metadata: "my-bootclasspath-fragment/metadata.csv",
5761 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005762 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5763 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5764 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005765 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005766 }
5767
Liz Kammer2dc72442023-04-20 10:10:48 -04005768 prebuilt_systemserverclasspath_fragment {
5769 name: "my-systemserverclasspath-fragment",
5770 contents: ["libbaz"],
5771 apex_available: ["myapex"],
5772 }
5773
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005774 java_import {
5775 name: "libfoo",
5776 jars: ["libfoo.jar"],
5777 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005778 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005779 }
5780
5781 java_sdk_library_import {
5782 name: "libbar",
5783 public: {
5784 jars: ["libbar.jar"],
5785 },
5786 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005787 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005788 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005789 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005790
5791 java_sdk_library_import {
5792 name: "libbaz",
5793 public: {
5794 jars: ["libbaz.jar"],
5795 },
5796 apex_available: ["myapex"],
5797 shared_library: false,
5798 permitted_packages: ["baz"],
5799 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005800 `
5801
Paul Duffin89f570a2021-06-16 01:42:33 +01005802 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005803 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5804 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005805
Paul Duffin537ea3d2021-05-14 10:38:00 +01005806 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005807 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005808 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005809 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005810 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005811 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 +01005812 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005813
5814 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5815
5816 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005817 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005818 "myjavalib.myapex",
5819 "libfoo.myapex",
5820 "libbar.myapex",
5821 "libbaz.myapex",
5822 }
5823 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5824 for i, e := range mkEntries {
5825 g := e.OverrideName
5826 if w := overrideNames[i]; w != g {
5827 t.Errorf("Expected override name %q, got %q", w, g)
5828 }
5829 }
5830
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005831 })
5832
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005833 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5834 bp := `
5835 prebuilt_apex {
5836 name: "myapex",
5837 arch: {
5838 arm64: {
5839 src: "myapex-arm64.apex",
5840 },
5841 arm: {
5842 src: "myapex-arm.apex",
5843 },
5844 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005845 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5846 }
5847
5848 prebuilt_bootclasspath_fragment {
5849 name: "my-bootclasspath-fragment",
5850 contents: ["libfoo", "libbar"],
5851 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005852 hidden_api: {
5853 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5854 metadata: "my-bootclasspath-fragment/metadata.csv",
5855 index: "my-bootclasspath-fragment/index.csv",
5856 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5857 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5858 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005859 }
5860
5861 java_import {
5862 name: "libfoo",
5863 jars: ["libfoo.jar"],
5864 apex_available: ["myapex"],
5865 }
5866
5867 java_library {
5868 name: "libfoo",
5869 srcs: ["foo/bar/MyClass.java"],
5870 apex_available: ["myapex"],
5871 }
Paul Duffin37856732021-02-26 14:24:15 +00005872
5873 java_sdk_library_import {
5874 name: "libbar",
5875 public: {
5876 jars: ["libbar.jar"],
5877 },
5878 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005879 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005880 }
5881
5882 java_sdk_library {
5883 name: "libbar",
5884 srcs: ["foo/bar/MyClass.java"],
5885 unsafe_ignore_missing_latest_api: true,
5886 apex_available: ["myapex"],
5887 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005888 `
5889
5890 // In this test the source (java_library) libfoo is active since the
5891 // prebuilt (java_import) defaults to prefer:false. However the
5892 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5893 // find the dex boot jar in it. We either need to disable the source libfoo
5894 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005895 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005896 // dexbootjar check is skipped if AllowMissingDependencies is true
5897 preparerAllowMissingDeps := android.GroupFixturePreparers(
5898 preparer,
5899 android.PrepareForTestWithAllowMissingDependencies,
5900 )
5901 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005902 })
5903
5904 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5905 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005906 apex {
5907 name: "myapex",
5908 key: "myapex.key",
5909 updatable: false,
5910 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5911 }
5912
5913 apex_key {
5914 name: "myapex.key",
5915 public_key: "testkey.avbpubkey",
5916 private_key: "testkey.pem",
5917 }
5918
5919 bootclasspath_fragment {
5920 name: "my-bootclasspath-fragment",
5921 contents: ["libfoo", "libbar"],
5922 apex_available: ["myapex"],
5923 hidden_api: {
5924 split_packages: ["*"],
5925 },
5926 }
5927
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005928 prebuilt_apex {
5929 name: "myapex",
5930 arch: {
5931 arm64: {
5932 src: "myapex-arm64.apex",
5933 },
5934 arm: {
5935 src: "myapex-arm.apex",
5936 },
5937 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005938 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5939 }
5940
5941 prebuilt_bootclasspath_fragment {
5942 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005943 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005944 contents: ["libfoo", "libbar"],
5945 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005946 hidden_api: {
5947 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5948 metadata: "my-bootclasspath-fragment/metadata.csv",
5949 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005950 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5951 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5952 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005953 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005954 }
5955
5956 java_import {
5957 name: "libfoo",
5958 prefer: true,
5959 jars: ["libfoo.jar"],
5960 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005961 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005962 }
5963
5964 java_library {
5965 name: "libfoo",
5966 srcs: ["foo/bar/MyClass.java"],
5967 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005968 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005969 }
Paul Duffin37856732021-02-26 14:24:15 +00005970
5971 java_sdk_library_import {
5972 name: "libbar",
5973 prefer: true,
5974 public: {
5975 jars: ["libbar.jar"],
5976 },
5977 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005978 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005979 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005980 }
5981
5982 java_sdk_library {
5983 name: "libbar",
5984 srcs: ["foo/bar/MyClass.java"],
5985 unsafe_ignore_missing_latest_api: true,
5986 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005987 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005988 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005989 `
5990
Paul Duffin89f570a2021-06-16 01:42:33 +01005991 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005992 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5993 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005994
Paul Duffin537ea3d2021-05-14 10:38:00 +01005995 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005996 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005997 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005998 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005999 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006000 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 +01006001 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006002 })
6003
6004 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
6005 bp := `
6006 apex {
6007 name: "myapex",
6008 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006009 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006010 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006011 }
6012
6013 apex_key {
6014 name: "myapex.key",
6015 public_key: "testkey.avbpubkey",
6016 private_key: "testkey.pem",
6017 }
6018
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006019 bootclasspath_fragment {
6020 name: "my-bootclasspath-fragment",
6021 contents: ["libfoo", "libbar"],
6022 apex_available: ["myapex"],
6023 hidden_api: {
6024 split_packages: ["*"],
6025 },
6026 }
6027
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006028 prebuilt_apex {
6029 name: "myapex",
6030 arch: {
6031 arm64: {
6032 src: "myapex-arm64.apex",
6033 },
6034 arm: {
6035 src: "myapex-arm.apex",
6036 },
6037 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006038 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6039 }
6040
6041 prebuilt_bootclasspath_fragment {
6042 name: "my-bootclasspath-fragment",
6043 contents: ["libfoo", "libbar"],
6044 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006045 hidden_api: {
6046 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6047 metadata: "my-bootclasspath-fragment/metadata.csv",
6048 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006049 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6050 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6051 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006052 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006053 }
6054
6055 java_import {
6056 name: "libfoo",
6057 jars: ["libfoo.jar"],
6058 apex_available: ["myapex"],
6059 }
6060
6061 java_library {
6062 name: "libfoo",
6063 srcs: ["foo/bar/MyClass.java"],
6064 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006065 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006066 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006067 }
Paul Duffin37856732021-02-26 14:24:15 +00006068
6069 java_sdk_library_import {
6070 name: "libbar",
6071 public: {
6072 jars: ["libbar.jar"],
6073 },
6074 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006075 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006076 }
6077
6078 java_sdk_library {
6079 name: "libbar",
6080 srcs: ["foo/bar/MyClass.java"],
6081 unsafe_ignore_missing_latest_api: true,
6082 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006083 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006084 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006085 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006086 `
6087
Paul Duffin89f570a2021-06-16 01:42:33 +01006088 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006089 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6090 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 +00006091
Paul Duffin537ea3d2021-05-14 10:38:00 +01006092 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006093 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006094 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6095 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006096 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6097 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 +01006098 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006099 })
6100
6101 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6102 bp := `
6103 apex {
6104 name: "myapex",
6105 enabled: false,
6106 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006107 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006116 bootclasspath_fragment {
6117 name: "my-bootclasspath-fragment",
6118 enabled: false,
6119 contents: ["libfoo", "libbar"],
6120 apex_available: ["myapex"],
6121 hidden_api: {
6122 split_packages: ["*"],
6123 },
6124 }
6125
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006126 prebuilt_apex {
6127 name: "myapex",
6128 arch: {
6129 arm64: {
6130 src: "myapex-arm64.apex",
6131 },
6132 arm: {
6133 src: "myapex-arm.apex",
6134 },
6135 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006136 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6137 }
6138
6139 prebuilt_bootclasspath_fragment {
6140 name: "my-bootclasspath-fragment",
6141 contents: ["libfoo", "libbar"],
6142 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006143 hidden_api: {
6144 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6145 metadata: "my-bootclasspath-fragment/metadata.csv",
6146 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006147 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6148 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6149 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006150 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006151 }
6152
6153 java_import {
6154 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006155 jars: ["libfoo.jar"],
6156 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006157 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006158 }
6159
6160 java_library {
6161 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006162 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006163 srcs: ["foo/bar/MyClass.java"],
6164 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006165 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006166 }
Paul Duffin37856732021-02-26 14:24:15 +00006167
6168 java_sdk_library_import {
6169 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006170 public: {
6171 jars: ["libbar.jar"],
6172 },
6173 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006174 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006175 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006176 }
6177
6178 java_sdk_library {
6179 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006180 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006181 srcs: ["foo/bar/MyClass.java"],
6182 unsafe_ignore_missing_latest_api: true,
6183 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006184 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006185 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006186 `
6187
Paul Duffin89f570a2021-06-16 01:42:33 +01006188 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006189 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6190 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006191
Paul Duffin537ea3d2021-05-14 10:38:00 +01006192 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006193 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006194 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006195 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006196 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006197 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 +01006198 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006199 })
Spandan Das3a392012024-01-17 18:26:27 +00006200
6201 t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
6202 bp := `
6203 // Source
6204 apex {
6205 name: "myapex",
6206 enabled: false,
6207 key: "myapex.key",
6208 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6209 }
6210
6211 apex_key {
6212 name: "myapex.key",
6213 public_key: "testkey.avbpubkey",
6214 private_key: "testkey.pem",
6215 }
6216
6217 // Prebuilt
6218 prebuilt_apex {
6219 name: "myapex.v1",
6220 source_apex_name: "myapex",
6221 arch: {
6222 arm64: {
6223 src: "myapex-arm64.apex",
6224 },
6225 arm: {
6226 src: "myapex-arm.apex",
6227 },
6228 },
6229 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6230 prefer: true,
6231 }
6232 prebuilt_apex {
6233 name: "myapex.v2",
6234 source_apex_name: "myapex",
6235 arch: {
6236 arm64: {
6237 src: "myapex-arm64.apex",
6238 },
6239 arm: {
6240 src: "myapex-arm.apex",
6241 },
6242 },
6243 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6244 prefer: true,
6245 }
6246
6247 prebuilt_bootclasspath_fragment {
6248 name: "my-bootclasspath-fragment",
6249 contents: ["libfoo", "libbar"],
6250 apex_available: ["myapex"],
6251 hidden_api: {
6252 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6253 metadata: "my-bootclasspath-fragment/metadata.csv",
6254 index: "my-bootclasspath-fragment/index.csv",
6255 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6256 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6257 },
6258 prefer: true,
6259 }
6260
6261 java_import {
6262 name: "libfoo",
6263 jars: ["libfoo.jar"],
6264 apex_available: ["myapex"],
6265 prefer: true,
6266 }
6267 java_import {
6268 name: "libbar",
6269 jars: ["libbar.jar"],
6270 apex_available: ["myapex"],
6271 prefer: true,
6272 }
6273 `
6274
6275 testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
6276 })
6277
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006278}
6279
Roland Levillain630846d2019-06-26 12:48:34 +01006280func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006281 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006282 apex_test {
6283 name: "myapex",
6284 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006285 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006286 tests: [
6287 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006288 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006289 ],
6290 }
6291
6292 apex_key {
6293 name: "myapex.key",
6294 public_key: "testkey.avbpubkey",
6295 private_key: "testkey.pem",
6296 }
6297
Liz Kammer1c14a212020-05-12 15:26:55 -07006298 filegroup {
6299 name: "fg",
6300 srcs: [
6301 "baz",
6302 "bar/baz"
6303 ],
6304 }
6305
Roland Levillain630846d2019-06-26 12:48:34 +01006306 cc_test {
6307 name: "mytest",
6308 gtest: false,
6309 srcs: ["mytest.cpp"],
6310 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006311 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006312 system_shared_libs: [],
6313 static_executable: true,
6314 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006315 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006316 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006317
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006318 cc_library {
6319 name: "mylib",
6320 srcs: ["mylib.cpp"],
6321 system_shared_libs: [],
6322 stl: "none",
6323 }
6324
Liz Kammer5bd365f2020-05-27 15:15:11 -07006325 filegroup {
6326 name: "fg2",
6327 srcs: [
6328 "testdata/baz"
6329 ],
6330 }
6331
Roland Levillain9b5fde92019-06-28 15:41:19 +01006332 cc_test {
6333 name: "mytests",
6334 gtest: false,
6335 srcs: [
6336 "mytest1.cpp",
6337 "mytest2.cpp",
6338 "mytest3.cpp",
6339 ],
6340 test_per_src: true,
6341 relative_install_path: "test",
6342 system_shared_libs: [],
6343 static_executable: true,
6344 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006345 data: [
6346 ":fg",
6347 ":fg2",
6348 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006349 }
Roland Levillain630846d2019-06-26 12:48:34 +01006350 `)
6351
Jooyung Hana0503a52023-08-23 13:12:50 +09006352 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006353 copyCmds := apexRule.Args["copy_commands"]
6354
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006355 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006356 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006357 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006358
Liz Kammer1c14a212020-05-12 15:26:55 -07006359 //Ensure that test data are copied into apex.
6360 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6361 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6362
Roland Levillain9b5fde92019-06-28 15:41:19 +01006363 // Ensure that test deps built with `test_per_src` are copied into apex.
6364 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6365 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6366 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006367
6368 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006369 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006370 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006371 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006372 prefix := "TARGET_"
6373 var builder strings.Builder
6374 data.Custom(&builder, name, prefix, "", data)
6375 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006376 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6377 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6378 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6379 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006380 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006381}
6382
Jooyung Hand48f3c32019-08-23 11:18:57 +09006383func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6384 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6385 apex {
6386 name: "myapex",
6387 key: "myapex.key",
6388 native_shared_libs: ["libfoo"],
6389 }
6390
6391 apex_key {
6392 name: "myapex.key",
6393 public_key: "testkey.avbpubkey",
6394 private_key: "testkey.pem",
6395 }
6396
6397 cc_library {
6398 name: "libfoo",
6399 stl: "none",
6400 system_shared_libs: [],
6401 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006402 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006403 }
6404 `)
6405 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6406 apex {
6407 name: "myapex",
6408 key: "myapex.key",
6409 java_libs: ["myjar"],
6410 }
6411
6412 apex_key {
6413 name: "myapex.key",
6414 public_key: "testkey.avbpubkey",
6415 private_key: "testkey.pem",
6416 }
6417
6418 java_library {
6419 name: "myjar",
6420 srcs: ["foo/bar/MyClass.java"],
6421 sdk_version: "none",
6422 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006423 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006424 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006425 }
6426 `)
6427}
6428
Bill Peckhama41a6962021-01-11 10:58:54 -08006429func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006430 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006431 apex {
6432 name: "myapex",
6433 key: "myapex.key",
6434 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006435 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006436 }
6437
6438 apex_key {
6439 name: "myapex.key",
6440 public_key: "testkey.avbpubkey",
6441 private_key: "testkey.pem",
6442 }
6443
6444 java_import {
6445 name: "myjavaimport",
6446 apex_available: ["myapex"],
6447 jars: ["my.jar"],
6448 compile_dex: true,
6449 }
6450 `)
6451
Jooyung Hana0503a52023-08-23 13:12:50 +09006452 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006453 apexRule := module.Rule("apexRule")
6454 copyCmds := apexRule.Args["copy_commands"]
6455 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6456}
6457
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006458func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006459 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006460 apex {
6461 name: "myapex",
6462 key: "myapex.key",
6463 apps: [
6464 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006465 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006466 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006467 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006468 }
6469
6470 apex_key {
6471 name: "myapex.key",
6472 public_key: "testkey.avbpubkey",
6473 private_key: "testkey.pem",
6474 }
6475
6476 android_app {
6477 name: "AppFoo",
6478 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006479 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006480 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006481 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006483 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006484 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006485
6486 android_app {
6487 name: "AppFooPriv",
6488 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006489 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006490 system_modules: "none",
6491 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006492 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006493 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006494 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006495 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006496
6497 cc_library_shared {
6498 name: "libjni",
6499 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006500 shared_libs: ["libfoo"],
6501 stl: "none",
6502 system_shared_libs: [],
6503 apex_available: [ "myapex" ],
6504 sdk_version: "current",
6505 }
6506
6507 cc_library_shared {
6508 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006509 stl: "none",
6510 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006511 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006512 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006513 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006514 `)
6515
Jooyung Hana0503a52023-08-23 13:12:50 +09006516 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006517 apexRule := module.Rule("apexRule")
6518 copyCmds := apexRule.Args["copy_commands"]
6519
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006520 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6521 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006522 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006523
Colin Crossaede88c2020-08-11 12:17:01 -07006524 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006525 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006526 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006527 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006528 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006529 // JNI libraries including transitive deps are
6530 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006531 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006532 // ... embedded inside APK (jnilibs.zip)
6533 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6534 // ... and not directly inside the APEX
6535 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6536 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006537
6538 apexBundle := module.Module().(*apexBundle)
6539 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6540 var builder strings.Builder
6541 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6542 androidMk := builder.String()
6543 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6544 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6545 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6546 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6547 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6548 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 +01006549}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006550
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006551func TestApexWithAppImportBuildId(t *testing.T) {
6552 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6553 for _, id := range invalidBuildIds {
6554 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6555 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6556 variables.BuildId = proptools.StringPtr(id)
6557 })
6558 testApexError(t, message, `apex {
6559 name: "myapex",
6560 key: "myapex.key",
6561 apps: ["AppFooPrebuilt"],
6562 updatable: false,
6563 }
6564
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570
6571 android_app_import {
6572 name: "AppFooPrebuilt",
6573 apk: "PrebuiltAppFoo.apk",
6574 presigned: true,
6575 apex_available: ["myapex"],
6576 }
6577 `, fixture)
6578 }
6579}
6580
Dario Frenicde2a032019-10-27 00:29:22 +01006581func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006582 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006583 apex {
6584 name: "myapex",
6585 key: "myapex.key",
6586 apps: [
6587 "AppFooPrebuilt",
6588 "AppFooPrivPrebuilt",
6589 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006590 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006591 }
6592
6593 apex_key {
6594 name: "myapex.key",
6595 public_key: "testkey.avbpubkey",
6596 private_key: "testkey.pem",
6597 }
6598
6599 android_app_import {
6600 name: "AppFooPrebuilt",
6601 apk: "PrebuiltAppFoo.apk",
6602 presigned: true,
6603 dex_preopt: {
6604 enabled: false,
6605 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006606 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006607 }
6608
6609 android_app_import {
6610 name: "AppFooPrivPrebuilt",
6611 apk: "PrebuiltAppFooPriv.apk",
6612 privileged: true,
6613 presigned: true,
6614 dex_preopt: {
6615 enabled: false,
6616 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006617 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006618 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006619 }
6620 `)
6621
Jooyung Hana0503a52023-08-23 13:12:50 +09006622 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006623 apexRule := module.Rule("apexRule")
6624 copyCmds := apexRule.Args["copy_commands"]
6625
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006626 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6627 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006628}
6629
6630func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006631 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006632 apex {
6633 name: "myapex",
6634 key: "myapex.key",
6635 apps: [
6636 "AppFoo",
6637 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006638 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006639 }
6640
6641 apex_key {
6642 name: "myapex.key",
6643 public_key: "testkey.avbpubkey",
6644 private_key: "testkey.pem",
6645 }
6646
6647 android_app {
6648 name: "AppFoo",
6649 srcs: ["foo/bar/MyClass.java"],
6650 sdk_version: "none",
6651 system_modules: "none",
6652 apex_available: [ "myapex" ],
6653 }
6654
6655 android_app_import {
6656 name: "AppFoo",
6657 apk: "AppFooPrebuilt.apk",
6658 filename: "AppFooPrebuilt.apk",
6659 presigned: true,
6660 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006661 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006662 }
6663 `, withFiles(map[string][]byte{
6664 "AppFooPrebuilt.apk": nil,
6665 }))
6666
Jooyung Hana0503a52023-08-23 13:12:50 +09006667 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006668 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006669 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006670}
6671
Dario Freni6f3937c2019-12-20 22:58:03 +00006672func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006673 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006674 apex {
6675 name: "myapex",
6676 key: "myapex.key",
6677 apps: [
6678 "TesterHelpAppFoo",
6679 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006680 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006681 }
6682
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
6688
6689 android_test_helper_app {
6690 name: "TesterHelpAppFoo",
6691 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006692 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006693 }
6694
6695 `)
6696
Jooyung Hana0503a52023-08-23 13:12:50 +09006697 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006698 apexRule := module.Rule("apexRule")
6699 copyCmds := apexRule.Args["copy_commands"]
6700
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006701 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006702}
6703
Jooyung Han18020ea2019-11-13 10:50:48 +09006704func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6705 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006706 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006707 apex {
6708 name: "myapex",
6709 key: "myapex.key",
6710 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006711 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006712 }
6713
6714 apex_key {
6715 name: "myapex.key",
6716 public_key: "testkey.avbpubkey",
6717 private_key: "testkey.pem",
6718 }
6719
6720 apex {
6721 name: "otherapex",
6722 key: "myapex.key",
6723 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006724 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006725 }
6726
6727 cc_defaults {
6728 name: "libfoo-defaults",
6729 apex_available: ["otherapex"],
6730 }
6731
6732 cc_library {
6733 name: "libfoo",
6734 defaults: ["libfoo-defaults"],
6735 stl: "none",
6736 system_shared_libs: [],
6737 }`)
6738}
6739
Paul Duffine52e66f2020-03-30 17:54:29 +01006740func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006741 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006742 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006743 apex {
6744 name: "myapex",
6745 key: "myapex.key",
6746 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006747 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006748 }
6749
6750 apex_key {
6751 name: "myapex.key",
6752 public_key: "testkey.avbpubkey",
6753 private_key: "testkey.pem",
6754 }
6755
6756 apex {
6757 name: "otherapex",
6758 key: "otherapex.key",
6759 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006760 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006761 }
6762
6763 apex_key {
6764 name: "otherapex.key",
6765 public_key: "testkey.avbpubkey",
6766 private_key: "testkey.pem",
6767 }
6768
6769 cc_library {
6770 name: "libfoo",
6771 stl: "none",
6772 system_shared_libs: [],
6773 apex_available: ["otherapex"],
6774 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006775}
Jiyong Park127b40b2019-09-30 16:04:35 +09006776
Paul Duffine52e66f2020-03-30 17:54:29 +01006777func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006778 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006779 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006780.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006781.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006782.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006783.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006784.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006785.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006786 apex {
6787 name: "myapex",
6788 key: "myapex.key",
6789 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006790 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006791 }
6792
6793 apex_key {
6794 name: "myapex.key",
6795 public_key: "testkey.avbpubkey",
6796 private_key: "testkey.pem",
6797 }
6798
Jiyong Park127b40b2019-09-30 16:04:35 +09006799 cc_library {
6800 name: "libfoo",
6801 stl: "none",
6802 shared_libs: ["libbar"],
6803 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006804 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006805 }
6806
6807 cc_library {
6808 name: "libbar",
6809 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006810 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006811 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006812 apex_available: ["myapex"],
6813 }
6814
6815 cc_library {
6816 name: "libbaz",
6817 stl: "none",
6818 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006819 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006820}
Jiyong Park127b40b2019-09-30 16:04:35 +09006821
Liz Kammer5f108fa2023-05-11 14:33:17 -04006822func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6823 testApex(t, `
6824 apex {
6825 name: "myapex",
6826 key: "myapex.key",
6827 native_shared_libs: ["libfoo"],
6828 updatable: false,
6829 }
6830
6831 apex_key {
6832 name: "myapex.key",
6833 public_key: "testkey.avbpubkey",
6834 private_key: "testkey.pem",
6835 }
6836
6837 cc_library {
6838 name: "libfoo",
6839 stl: "none",
6840 static_libs: ["libbar"],
6841 system_shared_libs: [],
6842 apex_available: ["myapex"],
6843 }
6844
6845 cc_library {
6846 name: "libbar",
6847 stl: "none",
6848 shared_libs: ["libbaz"],
6849 system_shared_libs: [],
6850 apex_available: ["myapex"],
6851 }
6852
6853 cc_library {
6854 name: "libbaz",
6855 stl: "none",
6856 system_shared_libs: [],
6857 }`)
6858
6859 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6860 apex {
6861 name: "myapex",
6862 key: "myapex.key",
6863 native_shared_libs: ["libfoo"],
6864 updatable: false,
6865 }
6866
6867 apex_key {
6868 name: "myapex.key",
6869 public_key: "testkey.avbpubkey",
6870 private_key: "testkey.pem",
6871 }
6872
6873 cc_library {
6874 name: "libfoo",
6875 stl: "none",
6876 static_libs: ["libbar"],
6877 system_shared_libs: [],
6878 apex_available: ["myapex"],
6879 }
6880
6881 cc_library {
6882 name: "libbar",
6883 stl: "none",
6884 system_shared_libs: [],
6885 }`)
6886}
6887
Paul Duffine52e66f2020-03-30 17:54:29 +01006888func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006889 testApexError(t, "\"otherapex\" is not a valid module name", `
6890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
6893 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006894 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006895 }
6896
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902
6903 cc_library {
6904 name: "libfoo",
6905 stl: "none",
6906 system_shared_libs: [],
6907 apex_available: ["otherapex"],
6908 }`)
6909
Paul Duffine52e66f2020-03-30 17:54:29 +01006910 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006911 apex {
6912 name: "myapex",
6913 key: "myapex.key",
6914 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006915 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006916 }
6917
6918 apex_key {
6919 name: "myapex.key",
6920 public_key: "testkey.avbpubkey",
6921 private_key: "testkey.pem",
6922 }
6923
6924 cc_library {
6925 name: "libfoo",
6926 stl: "none",
6927 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006928 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006929 apex_available: ["myapex"],
6930 }
6931
6932 cc_library {
6933 name: "libbar",
6934 stl: "none",
6935 system_shared_libs: [],
6936 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006937 }
6938
6939 cc_library {
6940 name: "libbaz",
6941 stl: "none",
6942 system_shared_libs: [],
6943 stubs: {
6944 versions: ["10", "20", "30"],
6945 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006946 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006947}
Jiyong Park127b40b2019-09-30 16:04:35 +09006948
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006949func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6950 t.Run("negative variant_version produces error", func(t *testing.T) {
6951 testApexError(t, "expected an integer between 0-9; got -1", `
6952 apex {
6953 name: "myapex",
6954 key: "myapex.key",
6955 apex_available_name: "com.android.foo",
6956 variant_version: "-1",
6957 updatable: false,
6958 }
6959 apex_key {
6960 name: "myapex.key",
6961 public_key: "testkey.avbpubkey",
6962 private_key: "testkey.pem",
6963 }
6964 `)
6965 })
6966
6967 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6968 testApexError(t, "expected an integer between 0-9; got 10", `
6969 apex {
6970 name: "myapex",
6971 key: "myapex.key",
6972 apex_available_name: "com.android.foo",
6973 variant_version: "10",
6974 updatable: false,
6975 }
6976 apex_key {
6977 name: "myapex.key",
6978 public_key: "testkey.avbpubkey",
6979 private_key: "testkey.pem",
6980 }
6981 `)
6982 })
6983}
6984
6985func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6986 context := android.GroupFixturePreparers(
6987 android.PrepareForIntegrationTestWithAndroid,
6988 PrepareForTestWithApexBuildComponents,
6989 android.FixtureMergeMockFs(android.MockFS{
6990 "system/sepolicy/apex/foo-file_contexts": nil,
6991 "system/sepolicy/apex/bar-file_contexts": nil,
6992 }),
6993 )
6994 result := context.RunTestWithBp(t, `
6995 apex {
6996 name: "foo",
6997 key: "myapex.key",
6998 apex_available_name: "com.android.foo",
6999 variant_version: "0",
7000 updatable: false,
7001 }
7002 apex {
7003 name: "bar",
7004 key: "myapex.key",
7005 apex_available_name: "com.android.foo",
7006 variant_version: "3",
7007 updatable: false,
7008 }
7009 apex_key {
7010 name: "myapex.key",
7011 public_key: "testkey.avbpubkey",
7012 private_key: "testkey.pem",
7013 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007014 override_apex {
7015 name: "myoverrideapex",
7016 base: "bar",
7017 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007018 `)
7019
Jooyung Hana0503a52023-08-23 13:12:50 +09007020 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007021 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
7022 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
7023 if fooActualDefaultVersion != fooExpectedDefaultVersion {
7024 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
7025 }
7026
Jooyung Hana0503a52023-08-23 13:12:50 +09007027 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007028 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
7029 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
7030 barActualDefaultVersion := barManifestRule.Args["default_version"]
7031 if barActualDefaultVersion != barExpectedDefaultVersion {
7032 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7033 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007034
Jooyung Hana0503a52023-08-23 13:12:50 +09007035 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04007036 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
7037 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
7038 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7039 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007040}
7041
Sam Delmericoca816532023-06-02 14:09:50 -04007042func TestApexAvailable_ApexAvailableName(t *testing.T) {
7043 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
7044 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
7045 apex {
7046 name: "myapex_sminus",
7047 key: "myapex.key",
7048 apps: ["AppFoo"],
7049 apex_available_name: "myapex",
7050 updatable: false,
7051 }
7052 apex {
7053 name: "myapex",
7054 key: "myapex.key",
7055 apps: ["AppFoo"],
7056 updatable: false,
7057 }
7058 apex_key {
7059 name: "myapex.key",
7060 public_key: "testkey.avbpubkey",
7061 private_key: "testkey.pem",
7062 }
7063 android_app {
7064 name: "AppFoo",
7065 srcs: ["foo/bar/MyClass.java"],
7066 sdk_version: "none",
7067 system_modules: "none",
7068 apex_available: [ "myapex_sminus" ],
7069 }`,
7070 android.FixtureMergeMockFs(android.MockFS{
7071 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7072 }),
7073 )
7074 })
7075
7076 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7077 testApex(t, `
7078 apex {
7079 name: "myapex_sminus",
7080 key: "myapex.key",
7081 apps: ["AppFoo"],
7082 apex_available_name: "myapex",
7083 updatable: false,
7084 }
7085 apex {
7086 name: "myapex",
7087 key: "myapex.key",
7088 apps: ["AppFoo"],
7089 updatable: false,
7090 }
7091 apex_key {
7092 name: "myapex.key",
7093 public_key: "testkey.avbpubkey",
7094 private_key: "testkey.pem",
7095 }
7096 android_app {
7097 name: "AppFoo",
7098 srcs: ["foo/bar/MyClass.java"],
7099 sdk_version: "none",
7100 system_modules: "none",
7101 apex_available: [ "myapex" ],
7102 }`,
7103 android.FixtureMergeMockFs(android.MockFS{
7104 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7105 }),
7106 )
7107 })
7108
7109 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7110 testApex(t, `
7111 override_apex {
7112 name: "myoverrideapex_sminus",
7113 base: "myapex_sminus",
7114 key: "myapex.key",
7115 apps: ["AppFooOverride"],
7116 }
7117 override_apex {
7118 name: "myoverrideapex",
7119 base: "myapex",
7120 key: "myapex.key",
7121 apps: ["AppFooOverride"],
7122 }
7123 apex {
7124 name: "myapex_sminus",
7125 key: "myapex.key",
7126 apps: ["AppFoo"],
7127 apex_available_name: "myapex",
7128 updatable: false,
7129 }
7130 apex {
7131 name: "myapex",
7132 key: "myapex.key",
7133 apps: ["AppFoo"],
7134 updatable: false,
7135 }
7136 apex_key {
7137 name: "myapex.key",
7138 public_key: "testkey.avbpubkey",
7139 private_key: "testkey.pem",
7140 }
7141 android_app {
7142 name: "AppFooOverride",
7143 srcs: ["foo/bar/MyClass.java"],
7144 sdk_version: "none",
7145 system_modules: "none",
7146 apex_available: [ "myapex" ],
7147 }
7148 android_app {
7149 name: "AppFoo",
7150 srcs: ["foo/bar/MyClass.java"],
7151 sdk_version: "none",
7152 system_modules: "none",
7153 apex_available: [ "myapex" ],
7154 }`,
7155 android.FixtureMergeMockFs(android.MockFS{
7156 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7157 }),
7158 )
7159 })
7160}
7161
7162func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7163 context := android.GroupFixturePreparers(
7164 android.PrepareForIntegrationTestWithAndroid,
7165 PrepareForTestWithApexBuildComponents,
7166 java.PrepareForTestWithDexpreopt,
7167 android.FixtureMergeMockFs(android.MockFS{
7168 "system/sepolicy/apex/myapex-file_contexts": nil,
7169 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7170 }),
7171 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7172 variables.BuildId = proptools.StringPtr("buildid")
7173 }),
7174 )
7175 context.RunTestWithBp(t, `
7176 override_apex {
7177 name: "myoverrideapex_sminus",
7178 base: "myapex_sminus",
7179 }
7180 override_apex {
7181 name: "myoverrideapex",
7182 base: "myapex",
7183 }
7184 apex {
7185 name: "myapex",
7186 key: "myapex.key",
7187 apps: ["AppFoo"],
7188 updatable: false,
7189 }
7190 apex {
7191 name: "myapex_sminus",
7192 apex_available_name: "myapex",
7193 key: "myapex.key",
7194 apps: ["AppFoo_sminus"],
7195 updatable: false,
7196 }
7197 apex_key {
7198 name: "myapex.key",
7199 public_key: "testkey.avbpubkey",
7200 private_key: "testkey.pem",
7201 }
7202 android_app {
7203 name: "AppFoo",
7204 srcs: ["foo/bar/MyClass.java"],
7205 sdk_version: "none",
7206 system_modules: "none",
7207 apex_available: [ "myapex" ],
7208 }
7209 android_app {
7210 name: "AppFoo_sminus",
7211 srcs: ["foo/bar/MyClass.java"],
7212 sdk_version: "none",
7213 min_sdk_version: "29",
7214 system_modules: "none",
7215 apex_available: [ "myapex" ],
7216 }`)
7217}
7218
Jiyong Park89e850a2020-04-07 16:37:39 +09007219func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007220 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007221 apex {
7222 name: "myapex",
7223 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007224 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007225 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007226 }
7227
7228 apex_key {
7229 name: "myapex.key",
7230 public_key: "testkey.avbpubkey",
7231 private_key: "testkey.pem",
7232 }
7233
7234 cc_library {
7235 name: "libfoo",
7236 stl: "none",
7237 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007238 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007239 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007240 }
7241
7242 cc_library {
7243 name: "libfoo2",
7244 stl: "none",
7245 system_shared_libs: [],
7246 shared_libs: ["libbaz"],
7247 apex_available: ["//apex_available:platform"],
7248 }
7249
7250 cc_library {
7251 name: "libbar",
7252 stl: "none",
7253 system_shared_libs: [],
7254 apex_available: ["myapex"],
7255 }
7256
7257 cc_library {
7258 name: "libbaz",
7259 stl: "none",
7260 system_shared_libs: [],
7261 apex_available: ["myapex"],
7262 stubs: {
7263 versions: ["1"],
7264 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007265 }`)
7266
Jiyong Park89e850a2020-04-07 16:37:39 +09007267 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7268 // because it depends on libbar which isn't available to platform
7269 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7270 if libfoo.NotAvailableForPlatform() != true {
7271 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7272 }
7273
7274 // libfoo2 however can be available to platform because it depends on libbaz which provides
7275 // stubs
7276 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7277 if libfoo2.NotAvailableForPlatform() == true {
7278 t.Errorf("%q should be available to platform", libfoo2.String())
7279 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007280}
Jiyong Parka90ca002019-10-07 15:47:24 +09007281
Paul Duffine52e66f2020-03-30 17:54:29 +01007282func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007283 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007284 apex {
7285 name: "myapex",
7286 key: "myapex.key",
7287 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007288 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007289 }
7290
7291 apex_key {
7292 name: "myapex.key",
7293 public_key: "testkey.avbpubkey",
7294 private_key: "testkey.pem",
7295 }
7296
7297 cc_library {
7298 name: "libfoo",
7299 stl: "none",
7300 system_shared_libs: [],
7301 apex_available: ["myapex"],
7302 static: {
7303 apex_available: ["//apex_available:platform"],
7304 },
7305 }`)
7306
Jiyong Park89e850a2020-04-07 16:37:39 +09007307 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7308 if libfooShared.NotAvailableForPlatform() != true {
7309 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7310 }
7311 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7312 if libfooStatic.NotAvailableForPlatform() != false {
7313 t.Errorf("%q should be available to platform", libfooStatic.String())
7314 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007315}
7316
Jiyong Park5d790c32019-11-15 18:40:32 +09007317func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007318 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007319 apex {
7320 name: "myapex",
7321 key: "myapex.key",
7322 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007323 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007324 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007325 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007326 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007327 }
7328
7329 override_apex {
7330 name: "override_myapex",
7331 base: "myapex",
7332 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007333 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007334 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007335 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007336 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007337 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007338 key: "mynewapex.key",
7339 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007340 }
7341
7342 apex_key {
7343 name: "myapex.key",
7344 public_key: "testkey.avbpubkey",
7345 private_key: "testkey.pem",
7346 }
7347
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007348 apex_key {
7349 name: "mynewapex.key",
7350 public_key: "testkey2.avbpubkey",
7351 private_key: "testkey2.pem",
7352 }
7353
7354 android_app_certificate {
7355 name: "myapex.certificate",
7356 certificate: "testkey",
7357 }
7358
Jiyong Park5d790c32019-11-15 18:40:32 +09007359 android_app {
7360 name: "app",
7361 srcs: ["foo/bar/MyClass.java"],
7362 package_name: "foo",
7363 sdk_version: "none",
7364 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007365 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007366 }
7367
7368 override_android_app {
7369 name: "override_app",
7370 base: "app",
7371 package_name: "bar",
7372 }
markchien7c803b82021-08-26 22:10:06 +08007373
7374 bpf {
7375 name: "bpf",
7376 srcs: ["bpf.c"],
7377 }
7378
7379 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007380 name: "overrideBpf",
7381 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007382 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007383
7384 prebuilt_etc {
7385 name: "myetc",
7386 src: "myprebuilt",
7387 }
7388
7389 prebuilt_etc {
7390 name: "override_myetc",
7391 src: "override_myprebuilt",
7392 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007393 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007394
Jooyung Hana0503a52023-08-23 13:12:50 +09007395 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7396 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007397 if originalVariant.GetOverriddenBy() != "" {
7398 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7399 }
7400 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7401 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7402 }
7403
Jooyung Hana0503a52023-08-23 13:12:50 +09007404 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007405 apexRule := module.Rule("apexRule")
7406 copyCmds := apexRule.Args["copy_commands"]
7407
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007408 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7409 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007410
markchien7c803b82021-08-26 22:10:06 +08007411 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007412 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007413
Daniel Norman5a3ce132021-08-26 15:44:43 -07007414 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7415 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7416
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007417 apexBundle := module.Module().(*apexBundle)
7418 name := apexBundle.Name()
7419 if name != "override_myapex" {
7420 t.Errorf("name should be \"override_myapex\", but was %q", name)
7421 }
7422
Baligh Uddin004d7172020-02-19 21:29:28 -08007423 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7424 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7425 }
7426
Jiyong Park20bacab2020-03-03 11:45:41 +09007427 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007428 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007429 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7430
7431 signApkRule := module.Rule("signapk")
7432 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007433
Colin Crossaa255532020-07-03 13:18:24 -07007434 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007435 var builder strings.Builder
7436 data.Custom(&builder, name, "TARGET_", "", data)
7437 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007438 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7439 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007440 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007441 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007442 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007443 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007444 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007445 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007446}
7447
Albert Martineefabcf2022-03-21 20:11:16 +00007448func TestMinSdkVersionOverride(t *testing.T) {
7449 // Override from 29 to 31
7450 minSdkOverride31 := "31"
7451 ctx := testApex(t, `
7452 apex {
7453 name: "myapex",
7454 key: "myapex.key",
7455 native_shared_libs: ["mylib"],
7456 updatable: true,
7457 min_sdk_version: "29"
7458 }
7459
7460 override_apex {
7461 name: "override_myapex",
7462 base: "myapex",
7463 logging_parent: "com.foo.bar",
7464 package_name: "test.overridden.package"
7465 }
7466
7467 apex_key {
7468 name: "myapex.key",
7469 public_key: "testkey.avbpubkey",
7470 private_key: "testkey.pem",
7471 }
7472
7473 cc_library {
7474 name: "mylib",
7475 srcs: ["mylib.cpp"],
7476 runtime_libs: ["libbar"],
7477 system_shared_libs: [],
7478 stl: "none",
7479 apex_available: [ "myapex" ],
7480 min_sdk_version: "apex_inherit"
7481 }
7482
7483 cc_library {
7484 name: "libbar",
7485 srcs: ["mylib.cpp"],
7486 system_shared_libs: [],
7487 stl: "none",
7488 apex_available: [ "myapex" ],
7489 min_sdk_version: "apex_inherit"
7490 }
7491
7492 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7493
Jooyung Hana0503a52023-08-23 13:12:50 +09007494 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007495 copyCmds := apexRule.Args["copy_commands"]
7496
7497 // Ensure that direct non-stubs dep is always included
7498 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7499
7500 // Ensure that runtime_libs dep in included
7501 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7502
7503 // Ensure libraries target overridden min_sdk_version value
7504 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7505}
7506
7507func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7508 // Attempt to override from 31 to 29, should be a NOOP
7509 minSdkOverride29 := "29"
7510 ctx := testApex(t, `
7511 apex {
7512 name: "myapex",
7513 key: "myapex.key",
7514 native_shared_libs: ["mylib"],
7515 updatable: true,
7516 min_sdk_version: "31"
7517 }
7518
7519 override_apex {
7520 name: "override_myapex",
7521 base: "myapex",
7522 logging_parent: "com.foo.bar",
7523 package_name: "test.overridden.package"
7524 }
7525
7526 apex_key {
7527 name: "myapex.key",
7528 public_key: "testkey.avbpubkey",
7529 private_key: "testkey.pem",
7530 }
7531
7532 cc_library {
7533 name: "mylib",
7534 srcs: ["mylib.cpp"],
7535 runtime_libs: ["libbar"],
7536 system_shared_libs: [],
7537 stl: "none",
7538 apex_available: [ "myapex" ],
7539 min_sdk_version: "apex_inherit"
7540 }
7541
7542 cc_library {
7543 name: "libbar",
7544 srcs: ["mylib.cpp"],
7545 system_shared_libs: [],
7546 stl: "none",
7547 apex_available: [ "myapex" ],
7548 min_sdk_version: "apex_inherit"
7549 }
7550
7551 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7552
Jooyung Hana0503a52023-08-23 13:12:50 +09007553 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007554 copyCmds := apexRule.Args["copy_commands"]
7555
7556 // Ensure that direct non-stubs dep is always included
7557 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7558
7559 // Ensure that runtime_libs dep in included
7560 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7561
7562 // Ensure libraries target the original min_sdk_version value rather than the overridden
7563 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7564}
7565
Jooyung Han214bf372019-11-12 13:03:50 +09007566func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007567 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007568 apex {
7569 name: "myapex",
7570 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007571 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007572 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007573 }
7574
7575 apex_key {
7576 name: "myapex.key",
7577 public_key: "testkey.avbpubkey",
7578 private_key: "testkey.pem",
7579 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007580
7581 cc_library {
7582 name: "mylib",
7583 srcs: ["mylib.cpp"],
7584 stl: "libc++",
7585 system_shared_libs: [],
7586 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007587 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007588 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007589 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007590
Jooyung Hana0503a52023-08-23 13:12:50 +09007591 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007592 args := module.Rule("apexRule").Args
7593 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007594 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007595
7596 // The copies of the libraries in the apex should have one more dependency than
7597 // the ones outside the apex, namely the unwinder. Ideally we should check
7598 // the dependency names directly here but for some reason the names are blank in
7599 // this test.
7600 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007601 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007602 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7603 if len(apexImplicits) != len(nonApexImplicits)+1 {
7604 t.Errorf("%q missing unwinder dep", lib)
7605 }
7606 }
Jooyung Han214bf372019-11-12 13:03:50 +09007607}
7608
Paul Duffine05480a2021-03-08 15:07:14 +00007609var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007610 "api/current.txt": nil,
7611 "api/removed.txt": nil,
7612 "api/system-current.txt": nil,
7613 "api/system-removed.txt": nil,
7614 "api/test-current.txt": nil,
7615 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007616
Anton Hanssondff2c782020-12-21 17:10:01 +00007617 "100/public/api/foo.txt": nil,
7618 "100/public/api/foo-removed.txt": nil,
7619 "100/system/api/foo.txt": nil,
7620 "100/system/api/foo-removed.txt": nil,
7621
Paul Duffineedc5d52020-06-12 17:46:39 +01007622 // For java_sdk_library_import
7623 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007624}
7625
Jooyung Han58f26ab2019-12-18 15:34:32 +09007626func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007627 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007628 apex {
7629 name: "myapex",
7630 key: "myapex.key",
7631 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007632 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007633 }
7634
7635 apex_key {
7636 name: "myapex.key",
7637 public_key: "testkey.avbpubkey",
7638 private_key: "testkey.pem",
7639 }
7640
7641 java_sdk_library {
7642 name: "foo",
7643 srcs: ["a.java"],
7644 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007645 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007646 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007647
7648 prebuilt_apis {
7649 name: "sdk",
7650 api_dirs: ["100"],
7651 }
Paul Duffin9b879592020-05-26 13:21:35 +01007652 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007653
7654 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007655 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007656 "javalib/foo.jar",
7657 "etc/permissions/foo.xml",
7658 })
7659 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007660 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007661 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 +09007662}
7663
Paul Duffin9b879592020-05-26 13:21:35 +01007664func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007665 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007666 apex {
7667 name: "myapex",
7668 key: "myapex.key",
7669 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007670 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007671 }
7672
7673 apex_key {
7674 name: "myapex.key",
7675 public_key: "testkey.avbpubkey",
7676 private_key: "testkey.pem",
7677 }
7678
7679 java_sdk_library {
7680 name: "foo",
7681 srcs: ["a.java"],
7682 api_packages: ["foo"],
7683 apex_available: ["myapex"],
7684 sdk_version: "none",
7685 system_modules: "none",
7686 }
7687
7688 java_library {
7689 name: "bar",
7690 srcs: ["a.java"],
7691 libs: ["foo"],
7692 apex_available: ["myapex"],
7693 sdk_version: "none",
7694 system_modules: "none",
7695 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007696
7697 prebuilt_apis {
7698 name: "sdk",
7699 api_dirs: ["100"],
7700 }
Paul Duffin9b879592020-05-26 13:21:35 +01007701 `, withFiles(filesForSdkLibrary))
7702
7703 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007704 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007705 "javalib/bar.jar",
7706 "javalib/foo.jar",
7707 "etc/permissions/foo.xml",
7708 })
7709
7710 // The bar library should depend on the implementation jar.
7711 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007712 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007713 t.Errorf("expected %q, found %#q", expected, actual)
7714 }
7715}
7716
7717func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007718 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007719 apex {
7720 name: "myapex",
7721 key: "myapex.key",
7722 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007723 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007724 }
7725
7726 apex_key {
7727 name: "myapex.key",
7728 public_key: "testkey.avbpubkey",
7729 private_key: "testkey.pem",
7730 }
7731
7732 java_sdk_library {
7733 name: "foo",
7734 srcs: ["a.java"],
7735 api_packages: ["foo"],
7736 apex_available: ["myapex"],
7737 sdk_version: "none",
7738 system_modules: "none",
7739 }
7740
7741 java_library {
7742 name: "bar",
7743 srcs: ["a.java"],
7744 libs: ["foo"],
7745 sdk_version: "none",
7746 system_modules: "none",
7747 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007748
7749 prebuilt_apis {
7750 name: "sdk",
7751 api_dirs: ["100"],
7752 }
Paul Duffin9b879592020-05-26 13:21:35 +01007753 `, withFiles(filesForSdkLibrary))
7754
7755 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007756 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007757 "javalib/foo.jar",
7758 "etc/permissions/foo.xml",
7759 })
7760
7761 // The bar library should depend on the stubs jar.
7762 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007763 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007764 t.Errorf("expected %q, found %#q", expected, actual)
7765 }
7766}
7767
Paul Duffineedc5d52020-06-12 17:46:39 +01007768func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007769 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007770 prebuilt_apis {
7771 name: "sdk",
7772 api_dirs: ["100"],
7773 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007774 withFiles(map[string][]byte{
7775 "apex/a.java": nil,
7776 "apex/apex_manifest.json": nil,
7777 "apex/Android.bp": []byte(`
7778 package {
7779 default_visibility: ["//visibility:private"],
7780 }
7781
7782 apex {
7783 name: "myapex",
7784 key: "myapex.key",
7785 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007786 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007787 }
7788
7789 apex_key {
7790 name: "myapex.key",
7791 public_key: "testkey.avbpubkey",
7792 private_key: "testkey.pem",
7793 }
7794
7795 java_library {
7796 name: "bar",
7797 srcs: ["a.java"],
7798 libs: ["foo"],
7799 apex_available: ["myapex"],
7800 sdk_version: "none",
7801 system_modules: "none",
7802 }
7803`),
7804 "source/a.java": nil,
7805 "source/api/current.txt": nil,
7806 "source/api/removed.txt": nil,
7807 "source/Android.bp": []byte(`
7808 package {
7809 default_visibility: ["//visibility:private"],
7810 }
7811
7812 java_sdk_library {
7813 name: "foo",
7814 visibility: ["//apex"],
7815 srcs: ["a.java"],
7816 api_packages: ["foo"],
7817 apex_available: ["myapex"],
7818 sdk_version: "none",
7819 system_modules: "none",
7820 public: {
7821 enabled: true,
7822 },
7823 }
7824`),
7825 "prebuilt/a.jar": nil,
7826 "prebuilt/Android.bp": []byte(`
7827 package {
7828 default_visibility: ["//visibility:private"],
7829 }
7830
7831 java_sdk_library_import {
7832 name: "foo",
7833 visibility: ["//apex", "//source"],
7834 apex_available: ["myapex"],
7835 prefer: true,
7836 public: {
7837 jars: ["a.jar"],
7838 },
7839 }
7840`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007841 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007842 )
7843
7844 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007845 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007846 "javalib/bar.jar",
7847 "javalib/foo.jar",
7848 "etc/permissions/foo.xml",
7849 })
7850
7851 // The bar library should depend on the implementation jar.
7852 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007853 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007854 t.Errorf("expected %q, found %#q", expected, actual)
7855 }
7856}
7857
7858func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7859 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7860 apex {
7861 name: "myapex",
7862 key: "myapex.key",
7863 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007864 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007865 }
7866
7867 apex_key {
7868 name: "myapex.key",
7869 public_key: "testkey.avbpubkey",
7870 private_key: "testkey.pem",
7871 }
7872
7873 java_sdk_library_import {
7874 name: "foo",
7875 apex_available: ["myapex"],
7876 prefer: true,
7877 public: {
7878 jars: ["a.jar"],
7879 },
7880 }
7881
7882 `, withFiles(filesForSdkLibrary))
7883}
7884
atrost6e126252020-01-27 17:01:16 +00007885func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007886 result := android.GroupFixturePreparers(
7887 prepareForApexTest,
7888 java.PrepareForTestWithPlatformCompatConfig,
7889 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007890 apex {
7891 name: "myapex",
7892 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007893 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007894 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007895 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007896 }
7897
7898 apex_key {
7899 name: "myapex.key",
7900 public_key: "testkey.avbpubkey",
7901 private_key: "testkey.pem",
7902 }
7903
7904 platform_compat_config {
7905 name: "myjar-platform-compat-config",
7906 src: ":myjar",
7907 }
7908
7909 java_library {
7910 name: "myjar",
7911 srcs: ["foo/bar/MyClass.java"],
7912 sdk_version: "none",
7913 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007914 apex_available: [ "myapex" ],
7915 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007916
7917 // Make sure that a preferred prebuilt does not affect the apex contents.
7918 prebuilt_platform_compat_config {
7919 name: "myjar-platform-compat-config",
7920 metadata: "compat-config/metadata.xml",
7921 prefer: true,
7922 }
atrost6e126252020-01-27 17:01:16 +00007923 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007924 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007925 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007926 "etc/compatconfig/myjar-platform-compat-config.xml",
7927 "javalib/myjar.jar",
7928 })
7929}
7930
Jooyung Han862c0d62022-12-21 10:15:37 +09007931func TestNoDupeApexFiles(t *testing.T) {
7932 android.GroupFixturePreparers(
7933 android.PrepareForTestWithAndroidBuildComponents,
7934 PrepareForTestWithApexBuildComponents,
7935 prepareForTestWithMyapex,
7936 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7937 ).
7938 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7939 RunTestWithBp(t, `
7940 apex {
7941 name: "myapex",
7942 key: "myapex.key",
7943 prebuilts: ["foo", "bar"],
7944 updatable: false,
7945 }
7946
7947 apex_key {
7948 name: "myapex.key",
7949 public_key: "testkey.avbpubkey",
7950 private_key: "testkey.pem",
7951 }
7952
7953 prebuilt_etc {
7954 name: "foo",
7955 src: "myprebuilt",
7956 filename_from_src: true,
7957 }
7958
7959 prebuilt_etc {
7960 name: "bar",
7961 src: "myprebuilt",
7962 filename_from_src: true,
7963 }
7964 `)
7965}
7966
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007967func TestApexUnwantedTransitiveDeps(t *testing.T) {
7968 bp := `
7969 apex {
7970 name: "myapex",
7971 key: "myapex.key",
7972 native_shared_libs: ["libfoo"],
7973 updatable: false,
7974 unwanted_transitive_deps: ["libbar"],
7975 }
7976
7977 apex_key {
7978 name: "myapex.key",
7979 public_key: "testkey.avbpubkey",
7980 private_key: "testkey.pem",
7981 }
7982
7983 cc_library {
7984 name: "libfoo",
7985 srcs: ["foo.cpp"],
7986 shared_libs: ["libbar"],
7987 apex_available: ["myapex"],
7988 }
7989
7990 cc_library {
7991 name: "libbar",
7992 srcs: ["bar.cpp"],
7993 apex_available: ["myapex"],
7994 }`
7995 ctx := testApex(t, bp)
7996 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7997 "*/libc++.so",
7998 "*/libfoo.so",
7999 // not libbar.so
8000 })
8001}
8002
Jiyong Park479321d2019-12-16 11:47:12 +09008003func TestRejectNonInstallableJavaLibrary(t *testing.T) {
8004 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8005 apex {
8006 name: "myapex",
8007 key: "myapex.key",
8008 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008009 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008010 }
8011
8012 apex_key {
8013 name: "myapex.key",
8014 public_key: "testkey.avbpubkey",
8015 private_key: "testkey.pem",
8016 }
8017
8018 java_library {
8019 name: "myjar",
8020 srcs: ["foo/bar/MyClass.java"],
8021 sdk_version: "none",
8022 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008023 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008024 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008025 }
8026 `)
8027}
8028
Jiyong Park7afd1072019-12-30 16:56:33 +09008029func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008030 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09008031 apex {
8032 name: "myapex",
8033 key: "myapex.key",
8034 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008035 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09008036 }
8037
8038 apex_key {
8039 name: "myapex.key",
8040 public_key: "testkey.avbpubkey",
8041 private_key: "testkey.pem",
8042 }
8043
8044 cc_library {
8045 name: "mylib",
8046 srcs: ["mylib.cpp"],
8047 system_shared_libs: [],
8048 stl: "none",
8049 required: ["a", "b"],
8050 host_required: ["c", "d"],
8051 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00008052 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09008053 }
8054 `)
8055
Jooyung Hana0503a52023-08-23 13:12:50 +09008056 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008057 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09008058 name := apexBundle.BaseModuleName()
8059 prefix := "TARGET_"
8060 var builder strings.Builder
8061 data.Custom(&builder, name, prefix, "", data)
8062 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008063 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08008064 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
8065 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09008066}
8067
Jiyong Park7cd10e32020-01-14 09:22:18 +09008068func TestSymlinksFromApexToSystem(t *testing.T) {
8069 bp := `
8070 apex {
8071 name: "myapex",
8072 key: "myapex.key",
8073 native_shared_libs: ["mylib"],
8074 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008075 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008076 }
8077
Jiyong Park9d677202020-02-19 16:29:35 +09008078 apex {
8079 name: "myapex.updatable",
8080 key: "myapex.key",
8081 native_shared_libs: ["mylib"],
8082 java_libs: ["myjar"],
8083 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008084 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008085 }
8086
Jiyong Park7cd10e32020-01-14 09:22:18 +09008087 apex_key {
8088 name: "myapex.key",
8089 public_key: "testkey.avbpubkey",
8090 private_key: "testkey.pem",
8091 }
8092
8093 cc_library {
8094 name: "mylib",
8095 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008096 shared_libs: [
8097 "myotherlib",
8098 "myotherlib_ext",
8099 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008100 system_shared_libs: [],
8101 stl: "none",
8102 apex_available: [
8103 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008104 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008105 "//apex_available:platform",
8106 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008107 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008108 }
8109
8110 cc_library {
8111 name: "myotherlib",
8112 srcs: ["mylib.cpp"],
8113 system_shared_libs: [],
8114 stl: "none",
8115 apex_available: [
8116 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008117 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008118 "//apex_available:platform",
8119 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008120 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008121 }
8122
Jiyong Parkce243632023-02-17 18:22:25 +09008123 cc_library {
8124 name: "myotherlib_ext",
8125 srcs: ["mylib.cpp"],
8126 system_shared_libs: [],
8127 system_ext_specific: true,
8128 stl: "none",
8129 apex_available: [
8130 "myapex",
8131 "myapex.updatable",
8132 "//apex_available:platform",
8133 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008134 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008135 }
8136
Jiyong Park7cd10e32020-01-14 09:22:18 +09008137 java_library {
8138 name: "myjar",
8139 srcs: ["foo/bar/MyClass.java"],
8140 sdk_version: "none",
8141 system_modules: "none",
8142 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008143 apex_available: [
8144 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008145 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008146 "//apex_available:platform",
8147 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008148 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008149 }
8150
8151 java_library {
8152 name: "myotherjar",
8153 srcs: ["foo/bar/MyClass.java"],
8154 sdk_version: "none",
8155 system_modules: "none",
8156 apex_available: [
8157 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008158 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008159 "//apex_available:platform",
8160 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008161 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008162 }
8163 `
8164
8165 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8166 for _, f := range files {
8167 if f.path == file {
8168 if f.isLink {
8169 t.Errorf("%q is not a real file", file)
8170 }
8171 return
8172 }
8173 }
8174 t.Errorf("%q is not found", file)
8175 }
8176
Jiyong Parkce243632023-02-17 18:22:25 +09008177 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008178 for _, f := range files {
8179 if f.path == file {
8180 if !f.isLink {
8181 t.Errorf("%q is not a symlink", file)
8182 }
Jiyong Parkce243632023-02-17 18:22:25 +09008183 if f.src != target {
8184 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8185 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008186 return
8187 }
8188 }
8189 t.Errorf("%q is not found", file)
8190 }
8191
Jiyong Park9d677202020-02-19 16:29:35 +09008192 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8193 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008194 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008195 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008196 ensureRealfileExists(t, files, "javalib/myjar.jar")
8197 ensureRealfileExists(t, files, "lib64/mylib.so")
8198 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008199 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008200
Jooyung Hana0503a52023-08-23 13:12:50 +09008201 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008202 ensureRealfileExists(t, files, "javalib/myjar.jar")
8203 ensureRealfileExists(t, files, "lib64/mylib.so")
8204 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008205 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008206
8207 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008208 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008209 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008210 ensureRealfileExists(t, files, "javalib/myjar.jar")
8211 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008212 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8213 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008214
Jooyung Hana0503a52023-08-23 13:12:50 +09008215 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008216 ensureRealfileExists(t, files, "javalib/myjar.jar")
8217 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008218 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8219 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008220}
8221
Yo Chiange8128052020-07-23 20:09:18 +08008222func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008223 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008224 apex {
8225 name: "myapex",
8226 key: "myapex.key",
8227 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008228 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008229 }
8230
8231 apex_key {
8232 name: "myapex.key",
8233 public_key: "testkey.avbpubkey",
8234 private_key: "testkey.pem",
8235 }
8236
8237 cc_library_shared {
8238 name: "mylib",
8239 srcs: ["mylib.cpp"],
8240 shared_libs: ["myotherlib"],
8241 system_shared_libs: [],
8242 stl: "none",
8243 apex_available: [
8244 "myapex",
8245 "//apex_available:platform",
8246 ],
8247 }
8248
8249 cc_prebuilt_library_shared {
8250 name: "myotherlib",
8251 srcs: ["prebuilt.so"],
8252 system_shared_libs: [],
8253 stl: "none",
8254 apex_available: [
8255 "myapex",
8256 "//apex_available:platform",
8257 ],
8258 }
8259 `)
8260
Jooyung Hana0503a52023-08-23 13:12:50 +09008261 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008262 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008263 var builder strings.Builder
8264 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8265 androidMk := builder.String()
8266 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008267 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008268 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8269 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8270 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008271 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008272}
8273
Jooyung Han643adc42020-02-27 13:50:06 +09008274func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008275 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008276 apex {
8277 name: "myapex",
8278 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008279 binaries: ["mybin"],
8280 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008281 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008282 }
8283
8284 apex_key {
8285 name: "myapex.key",
8286 public_key: "testkey.avbpubkey",
8287 private_key: "testkey.pem",
8288 }
8289
8290 cc_library {
8291 name: "mylib",
8292 srcs: ["mylib.cpp"],
8293 shared_libs: ["mylib2"],
8294 system_shared_libs: [],
8295 stl: "none",
8296 apex_available: [ "myapex" ],
8297 }
8298
8299 cc_library {
8300 name: "mylib2",
8301 srcs: ["mylib.cpp"],
8302 system_shared_libs: [],
8303 stl: "none",
8304 apex_available: [ "myapex" ],
8305 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008306
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008307 // Used as both a JNI library and a regular shared library.
8308 cc_library {
8309 name: "mylib3",
8310 srcs: ["mylib.cpp"],
8311 system_shared_libs: [],
8312 stl: "none",
8313 apex_available: [ "myapex" ],
8314 }
8315
8316 cc_binary {
8317 name: "mybin",
8318 srcs: ["mybin.cpp"],
8319 shared_libs: ["mylib3"],
8320 system_shared_libs: [],
8321 stl: "none",
8322 apex_available: [ "myapex" ],
8323 }
8324
Jiyong Park34d5c332022-02-24 18:02:44 +09008325 rust_ffi_shared {
8326 name: "libfoo.rust",
8327 crate_name: "foo",
8328 srcs: ["foo.rs"],
8329 shared_libs: ["libfoo.shared_from_rust"],
8330 prefer_rlib: true,
8331 apex_available: ["myapex"],
8332 }
8333
8334 cc_library_shared {
8335 name: "libfoo.shared_from_rust",
8336 srcs: ["mylib.cpp"],
8337 system_shared_libs: [],
8338 stl: "none",
8339 stubs: {
8340 versions: ["10", "11", "12"],
8341 },
8342 }
8343
Jooyung Han643adc42020-02-27 13:50:06 +09008344 `)
8345
Jooyung Hana0503a52023-08-23 13:12:50 +09008346 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008347 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008348 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008349 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008350 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008351 "lib64/mylib.so",
8352 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008353 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008354 "lib64/libfoo.rust.so",
8355 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8356 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008357 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008358
8359 // b/220397949
8360 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008361}
8362
Jooyung Han49f67012020-04-17 13:43:10 +09008363func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008364 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008365 apex {
8366 name: "myapex",
8367 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008368 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008369 }
8370 apex_key {
8371 name: "myapex.key",
8372 public_key: "testkey.avbpubkey",
8373 private_key: "testkey.pem",
8374 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008375 `,
8376 android.FixtureModifyConfig(func(config android.Config) {
8377 delete(config.Targets, android.Android)
8378 config.AndroidCommonTarget = android.Target{}
8379 }),
8380 )
Jooyung Han49f67012020-04-17 13:43:10 +09008381
8382 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8383 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8384 }
8385}
8386
Jiyong Parkbd159612020-02-28 15:22:21 +09008387func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008388 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008389 apex {
8390 name: "myapex",
8391 key: "myapex.key",
8392 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008393 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008394 }
8395
8396 apex_key {
8397 name: "myapex.key",
8398 public_key: "testkey.avbpubkey",
8399 private_key: "testkey.pem",
8400 }
8401
8402 android_app {
8403 name: "AppFoo",
8404 srcs: ["foo/bar/MyClass.java"],
8405 sdk_version: "none",
8406 system_modules: "none",
8407 apex_available: [ "myapex" ],
8408 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008409 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008410
Jooyung Hana0503a52023-08-23 13:12:50 +09008411 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008412 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008413
8414 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008415 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 +09008416}
8417
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008418func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008419 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008420 apex {
8421 name: "myapex",
8422 key: "myapex.key",
8423 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008424 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008425 }
8426
8427 apex_key {
8428 name: "myapex.key",
8429 public_key: "testkey.avbpubkey",
8430 private_key: "testkey.pem",
8431 }
8432
8433 android_app_set {
8434 name: "AppSet",
8435 set: "AppSet.apks",
8436 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008437 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008438 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008439 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008440 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8441 s := mod.Rule("apexRule").Args["copy_commands"]
8442 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008443 if len(copyCmds) != 4 {
8444 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008445 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008446 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8447 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008448 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8449 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008450
8451 // Ensure that canned_fs_config has an entry for the app set zip file
8452 generateFsRule := mod.Rule("generateFsConfig")
8453 cmd := generateFsRule.RuleParams.Command
8454 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008455}
8456
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008457func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008458 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008459 apex_set {
8460 name: "myapex",
8461 filename: "foo_v2.apex",
8462 sanitized: {
8463 none: { set: "myapex.apks", },
8464 hwaddress: { set: "myapex.hwasan.apks", },
8465 },
Paul Duffin24704672021-04-06 16:09:30 +01008466 }
8467 `
8468 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008469
Paul Duffin24704672021-04-06 16:09:30 +01008470 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008471 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008472
Spandan Das3576e762024-01-03 18:57:03 +00008473 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008474 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008475
Paul Duffin24704672021-04-06 16:09:30 +01008476 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8477
8478 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008479 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8480 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008481
8482 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008483}
8484
Pranav Guptaeba03b02022-09-27 00:27:08 +00008485func TestApexSetApksModuleAssignment(t *testing.T) {
8486 ctx := testApex(t, `
8487 apex_set {
8488 name: "myapex",
8489 set: ":myapex_apks_file",
8490 }
8491
8492 filegroup {
8493 name: "myapex_apks_file",
8494 srcs: ["myapex.apks"],
8495 }
8496 `)
8497
Spandan Das3576e762024-01-03 18:57:03 +00008498 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008499
8500 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008501 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008502 extractedApex := m.Output(extractorOutput)
8503
8504 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8505}
8506
Paul Duffin89f570a2021-06-16 01:42:33 +01008507func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008508 t.Helper()
8509
Paul Duffin55607122021-03-30 23:32:51 +01008510 fs := android.MockFS{
8511 "a.java": nil,
8512 "a.jar": nil,
8513 "apex_manifest.json": nil,
8514 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008515 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008516 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8517 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8518 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008519 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008520 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008521
Paul Duffin55607122021-03-30 23:32:51 +01008522 errorHandler := android.FixtureExpectsNoErrors
8523 if errmsg != "" {
8524 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008525 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008526
Paul Duffin55607122021-03-30 23:32:51 +01008527 result := android.GroupFixturePreparers(
8528 cc.PrepareForTestWithCcDefaultModules,
8529 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008530 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008531 java.PrepareForTestWithJavaSdkLibraryFiles,
8532 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008533 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008534 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008535 android.FixtureModifyMockFS(func(fs android.MockFS) {
8536 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8537 insert := ""
8538 for _, fragment := range fragments {
8539 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8540 }
8541 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8542 platform_bootclasspath {
8543 name: "platform-bootclasspath",
8544 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008545 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008546 %s
8547 ],
8548 }
8549 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008550 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008551 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008552 // Dexpreopt for boot jars requires the ART boot image profile.
8553 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8554 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008555 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008556 ).
8557 ExtendWithErrorHandler(errorHandler).
8558 RunTestWithBp(t, bp)
8559
8560 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008561}
8562
Paul Duffin5556c5f2022-06-09 17:32:21 +00008563func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008564 preparers := android.GroupFixturePreparers(
8565 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008566 prepareForTestWithBootclasspathFragment,
8567 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008568 PrepareForTestWithApexBuildComponents,
8569 ).
8570 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008571 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008572
8573 bpBase := `
8574 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008575 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008576 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008577 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008578 set: "myapex.apks",
8579 }
8580
8581 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008582 name: "com.mycompany.android.art",
8583 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008584 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008585 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008586 set: "company-myapex.apks",
8587 }
8588
8589 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008590 name: "art-bootclasspath-fragment",
8591 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008592 hidden_api: {
8593 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8594 metadata: "my-bootclasspath-fragment/metadata.csv",
8595 index: "my-bootclasspath-fragment/index.csv",
8596 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8597 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8598 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008599 %s
8600 }
8601 `
8602
8603 t.Run("java_import", func(t *testing.T) {
8604 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8605 java_import {
8606 name: "libfoo",
8607 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008608 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008609 }
8610 `)
8611 })
8612
8613 t.Run("java_sdk_library_import", func(t *testing.T) {
8614 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8615 java_sdk_library_import {
8616 name: "libfoo",
8617 public: {
8618 jars: ["libbar.jar"],
8619 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008620 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008621 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008622 }
8623 `)
8624 })
8625
8626 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8627 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8628 image_name: "art",
8629 contents: ["libfoo"],
8630 `)+`
8631 java_sdk_library_import {
8632 name: "libfoo",
8633 public: {
8634 jars: ["libbar.jar"],
8635 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008636 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008637 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008638 }
8639 `)
8640 })
8641}
8642
Paul Duffin5556c5f2022-06-09 17:32:21 +00008643func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8644 preparers := android.GroupFixturePreparers(
8645 java.PrepareForTestWithJavaDefaultModules,
8646 PrepareForTestWithApexBuildComponents,
8647 )
8648
Spandan Das59a4a2b2024-01-09 21:35:56 +00008649 errCtx := moduleErrorfTestCtx{}
8650
Paul Duffin5556c5f2022-06-09 17:32:21 +00008651 bpBase := `
8652 apex_set {
8653 name: "com.android.myapex",
8654 installable: true,
8655 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8656 set: "myapex.apks",
8657 }
8658
8659 apex_set {
8660 name: "com.android.myapex_compressed",
8661 apex_name: "com.android.myapex",
8662 installable: true,
8663 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8664 set: "myapex_compressed.apks",
8665 }
8666
8667 prebuilt_bootclasspath_fragment {
8668 name: "my-bootclasspath-fragment",
8669 apex_available: [
8670 "com.android.myapex",
8671 "com.android.myapex_compressed",
8672 ],
8673 hidden_api: {
8674 annotation_flags: "annotation-flags.csv",
8675 metadata: "metadata.csv",
8676 index: "index.csv",
8677 signature_patterns: "signature_patterns.csv",
8678 },
8679 %s
8680 }
8681 `
8682
8683 t.Run("java_import", func(t *testing.T) {
8684 result := preparers.RunTestWithBp(t,
8685 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8686 java_import {
8687 name: "libfoo",
8688 jars: ["libfoo.jar"],
8689 apex_available: [
8690 "com.android.myapex",
8691 "com.android.myapex_compressed",
8692 ],
8693 }
8694 `)
8695
8696 module := result.Module("libfoo", "android_common_com.android.myapex")
8697 usesLibraryDep := module.(java.UsesLibraryDependency)
8698 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008699 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008700 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008701 })
8702
8703 t.Run("java_sdk_library_import", func(t *testing.T) {
8704 result := preparers.RunTestWithBp(t,
8705 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8706 java_sdk_library_import {
8707 name: "libfoo",
8708 public: {
8709 jars: ["libbar.jar"],
8710 },
8711 apex_available: [
8712 "com.android.myapex",
8713 "com.android.myapex_compressed",
8714 ],
8715 compile_dex: true,
8716 }
8717 `)
8718
8719 module := result.Module("libfoo", "android_common_com.android.myapex")
8720 usesLibraryDep := module.(java.UsesLibraryDependency)
8721 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008722 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008723 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008724 })
8725
8726 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8727 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8728 image_name: "art",
8729 contents: ["libfoo"],
8730 `)+`
8731 java_sdk_library_import {
8732 name: "libfoo",
8733 public: {
8734 jars: ["libbar.jar"],
8735 },
8736 apex_available: [
8737 "com.android.myapex",
8738 "com.android.myapex_compressed",
8739 ],
8740 compile_dex: true,
8741 }
8742 `)
8743 })
8744}
8745
Jooyung Han548640b2020-04-27 12:10:30 +09008746func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8747 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8748 apex {
8749 name: "myapex",
8750 key: "myapex.key",
8751 updatable: true,
8752 }
8753
8754 apex_key {
8755 name: "myapex.key",
8756 public_key: "testkey.avbpubkey",
8757 private_key: "testkey.pem",
8758 }
8759 `)
8760}
8761
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008762func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8763 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8764 apex {
8765 name: "myapex",
8766 key: "myapex.key",
8767 }
8768
8769 apex_key {
8770 name: "myapex.key",
8771 public_key: "testkey.avbpubkey",
8772 private_key: "testkey.pem",
8773 }
8774 `)
8775}
8776
Jooyung Handfc864c2023-03-20 18:19:07 +09008777func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8778 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008779 apex {
8780 name: "myapex",
8781 key: "myapex.key",
8782 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008783 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008784 soc_specific: true,
8785 }
8786
8787 apex_key {
8788 name: "myapex.key",
8789 public_key: "testkey.avbpubkey",
8790 private_key: "testkey.pem",
8791 }
8792 `)
8793}
8794
Jooyung Han02873da2023-03-22 17:41:03 +09008795func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8796 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8797 apex {
8798 name: "myapex",
8799 key: "myapex.key",
8800 updatable: false,
8801 min_sdk_version: "29",
8802 use_vndk_as_stable: true,
8803 vendor: true,
8804 }
8805
8806 apex_key {
8807 name: "myapex.key",
8808 public_key: "testkey.avbpubkey",
8809 private_key: "testkey.pem",
8810 }
8811 `)
8812}
8813
Jooyung Handfc864c2023-03-20 18:19:07 +09008814func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8815 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8816 apex {
8817 name: "myapex",
8818 key: "myapex.key",
8819 updatable: false,
8820 use_vndk_as_stable: true,
8821 }
8822
8823 apex_key {
8824 name: "myapex.key",
8825 public_key: "testkey.avbpubkey",
8826 private_key: "testkey.pem",
8827 }
8828 `)
8829}
8830
satayevb98371c2021-06-15 16:49:50 +01008831func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8832 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8833 apex {
8834 name: "myapex",
8835 key: "myapex.key",
8836 systemserverclasspath_fragments: [
8837 "mysystemserverclasspathfragment",
8838 ],
8839 min_sdk_version: "29",
8840 updatable: true,
8841 }
8842
8843 apex_key {
8844 name: "myapex.key",
8845 public_key: "testkey.avbpubkey",
8846 private_key: "testkey.pem",
8847 }
8848
8849 java_library {
8850 name: "foo",
8851 srcs: ["b.java"],
8852 min_sdk_version: "29",
8853 installable: true,
8854 apex_available: [
8855 "myapex",
8856 ],
8857 }
8858
8859 systemserverclasspath_fragment {
8860 name: "mysystemserverclasspathfragment",
8861 generate_classpaths_proto: false,
8862 contents: [
8863 "foo",
8864 ],
8865 apex_available: [
8866 "myapex",
8867 ],
8868 }
satayevabcd5972021-08-06 17:49:46 +01008869 `,
8870 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8871 )
satayevb98371c2021-06-15 16:49:50 +01008872}
8873
Paul Duffin064b70c2020-11-02 17:32:38 +00008874func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008875 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008876 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008877 fragment := java.ApexVariantReference{
8878 Apex: proptools.StringPtr("myapex"),
8879 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8880 }
8881
Paul Duffin064b70c2020-11-02 17:32:38 +00008882 testDexpreoptWithApexes(t, `
8883 prebuilt_apex {
8884 name: "myapex" ,
8885 arch: {
8886 arm64: {
8887 src: "myapex-arm64.apex",
8888 },
8889 arm: {
8890 src: "myapex-arm.apex",
8891 },
8892 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008893 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8894 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008895
Paul Duffin89f570a2021-06-16 01:42:33 +01008896 prebuilt_bootclasspath_fragment {
8897 name: "my-bootclasspath-fragment",
8898 contents: ["libfoo"],
8899 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008900 hidden_api: {
8901 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8902 metadata: "my-bootclasspath-fragment/metadata.csv",
8903 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008904 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8905 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8906 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008907 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008908 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008909
Paul Duffin89f570a2021-06-16 01:42:33 +01008910 java_import {
8911 name: "libfoo",
8912 jars: ["libfoo.jar"],
8913 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008914 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008915 }
8916 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008917 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008918}
8919
Spandan Dasf14e2542021-11-12 00:01:37 +00008920func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008921 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008922 bp += `
8923 apex_key {
8924 name: "myapex.key",
8925 public_key: "testkey.avbpubkey",
8926 private_key: "testkey.pem",
8927 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008928 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008929 "lib1/src/A.java": nil,
8930 "lib2/src/B.java": nil,
8931 "system/sepolicy/apex/myapex-file_contexts": nil,
8932 }
8933
Paul Duffin45338f02021-03-30 23:07:52 +01008934 errorHandler := android.FixtureExpectsNoErrors
8935 if errmsg != "" {
8936 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008937 }
Colin Crossae8600b2020-10-29 17:09:13 -07008938
Paul Duffin45338f02021-03-30 23:07:52 +01008939 android.GroupFixturePreparers(
8940 android.PrepareForTestWithAndroidBuildComponents,
8941 java.PrepareForTestWithJavaBuildComponents,
8942 PrepareForTestWithApexBuildComponents,
8943 android.PrepareForTestWithNeverallowRules(rules),
8944 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008945 apexBootJars := make([]string, 0, len(bootJars))
8946 for _, apexBootJar := range bootJars {
8947 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008948 }
satayevd604b212021-07-21 14:23:52 +01008949 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008950 }),
8951 fs.AddToFixture(),
8952 ).
8953 ExtendWithErrorHandler(errorHandler).
8954 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008955}
8956
8957func TestApexPermittedPackagesRules(t *testing.T) {
8958 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008959 name string
8960 expectedError string
8961 bp string
8962 bootJars []string
8963 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008964 }{
8965
8966 {
8967 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8968 expectedError: "",
8969 bp: `
8970 java_library {
8971 name: "bcp_lib1",
8972 srcs: ["lib1/src/*.java"],
8973 permitted_packages: ["foo.bar"],
8974 apex_available: ["myapex"],
8975 sdk_version: "none",
8976 system_modules: "none",
8977 }
8978 java_library {
8979 name: "nonbcp_lib2",
8980 srcs: ["lib2/src/*.java"],
8981 apex_available: ["myapex"],
8982 permitted_packages: ["a.b"],
8983 sdk_version: "none",
8984 system_modules: "none",
8985 }
8986 apex {
8987 name: "myapex",
8988 key: "myapex.key",
8989 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008990 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008991 }`,
8992 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008993 bcpPermittedPackages: map[string][]string{
8994 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008995 "foo.bar",
8996 },
8997 },
8998 },
8999 {
Anton Hanssone1b18362021-12-23 15:05:38 +00009000 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00009001 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 +01009002 bp: `
9003 java_library {
9004 name: "bcp_lib1",
9005 srcs: ["lib1/src/*.java"],
9006 apex_available: ["myapex"],
9007 permitted_packages: ["foo.bar"],
9008 sdk_version: "none",
9009 system_modules: "none",
9010 }
9011 java_library {
9012 name: "bcp_lib2",
9013 srcs: ["lib2/src/*.java"],
9014 apex_available: ["myapex"],
9015 permitted_packages: ["foo.bar", "bar.baz"],
9016 sdk_version: "none",
9017 system_modules: "none",
9018 }
9019 apex {
9020 name: "myapex",
9021 key: "myapex.key",
9022 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009023 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01009024 }
9025 `,
9026 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00009027 bcpPermittedPackages: map[string][]string{
9028 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01009029 "foo.bar",
9030 },
Spandan Dasf14e2542021-11-12 00:01:37 +00009031 "bcp_lib2": []string{
9032 "foo.bar",
9033 },
9034 },
9035 },
9036 {
9037 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
9038 expectedError: "",
9039 bp: `
9040 java_library {
9041 name: "bcp_lib_restricted",
9042 srcs: ["lib1/src/*.java"],
9043 apex_available: ["myapex"],
9044 permitted_packages: ["foo.bar"],
9045 sdk_version: "none",
9046 min_sdk_version: "29",
9047 system_modules: "none",
9048 }
9049 java_library {
9050 name: "bcp_lib_unrestricted",
9051 srcs: ["lib2/src/*.java"],
9052 apex_available: ["myapex"],
9053 permitted_packages: ["foo.bar", "bar.baz"],
9054 sdk_version: "none",
9055 min_sdk_version: "29",
9056 system_modules: "none",
9057 }
9058 apex {
9059 name: "myapex",
9060 key: "myapex.key",
9061 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
9062 updatable: true,
9063 min_sdk_version: "29",
9064 }
9065 `,
9066 bootJars: []string{"bcp_lib1", "bcp_lib2"},
9067 bcpPermittedPackages: map[string][]string{
9068 "bcp_lib1_non_updateable": []string{
9069 "foo.bar",
9070 },
9071 // 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 +01009072 },
9073 },
9074 }
9075 for _, tc := range testcases {
9076 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009077 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9078 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009079 })
9080 }
9081}
9082
Jiyong Park62304bb2020-04-13 16:19:48 +09009083func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009084 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009085 apex {
9086 name: "myapex",
9087 key: "myapex.key",
9088 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009089 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009090 }
9091
9092 apex_key {
9093 name: "myapex.key",
9094 public_key: "testkey.avbpubkey",
9095 private_key: "testkey.pem",
9096 }
9097
9098 cc_library {
9099 name: "mylib",
9100 srcs: ["mylib.cpp"],
9101 system_shared_libs: [],
9102 stl: "none",
9103 stubs: {
9104 versions: ["1"],
9105 },
9106 apex_available: ["myapex"],
9107 }
9108
9109 cc_library {
9110 name: "myprivlib",
9111 srcs: ["mylib.cpp"],
9112 system_shared_libs: [],
9113 stl: "none",
9114 apex_available: ["myapex"],
9115 }
9116
9117
9118 cc_test {
9119 name: "mytest",
9120 gtest: false,
9121 srcs: ["mylib.cpp"],
9122 system_shared_libs: [],
9123 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009124 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009125 test_for: ["myapex"]
9126 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009127
9128 cc_library {
9129 name: "mytestlib",
9130 srcs: ["mylib.cpp"],
9131 system_shared_libs: [],
9132 shared_libs: ["mylib", "myprivlib"],
9133 stl: "none",
9134 test_for: ["myapex"],
9135 }
9136
9137 cc_benchmark {
9138 name: "mybench",
9139 srcs: ["mylib.cpp"],
9140 system_shared_libs: [],
9141 shared_libs: ["mylib", "myprivlib"],
9142 stl: "none",
9143 test_for: ["myapex"],
9144 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009145 `)
9146
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009147 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009148 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009149 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9150 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9151 }
9152
9153 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009154 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009155 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9156 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9157 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9158}
Jiyong Park46a512f2020-12-04 18:02:13 +09009159
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009160func TestIndirectTestFor(t *testing.T) {
9161 ctx := testApex(t, `
9162 apex {
9163 name: "myapex",
9164 key: "myapex.key",
9165 native_shared_libs: ["mylib", "myprivlib"],
9166 updatable: false,
9167 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009168
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009169 apex_key {
9170 name: "myapex.key",
9171 public_key: "testkey.avbpubkey",
9172 private_key: "testkey.pem",
9173 }
9174
9175 cc_library {
9176 name: "mylib",
9177 srcs: ["mylib.cpp"],
9178 system_shared_libs: [],
9179 stl: "none",
9180 stubs: {
9181 versions: ["1"],
9182 },
9183 apex_available: ["myapex"],
9184 }
9185
9186 cc_library {
9187 name: "myprivlib",
9188 srcs: ["mylib.cpp"],
9189 system_shared_libs: [],
9190 stl: "none",
9191 shared_libs: ["mylib"],
9192 apex_available: ["myapex"],
9193 }
9194
9195 cc_library {
9196 name: "mytestlib",
9197 srcs: ["mylib.cpp"],
9198 system_shared_libs: [],
9199 shared_libs: ["myprivlib"],
9200 stl: "none",
9201 test_for: ["myapex"],
9202 }
9203 `)
9204
9205 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009206 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009207 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9208 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9209 }
9210
9211 // The platform variant of mytestlib links to the platform variant of the
9212 // internal myprivlib.
9213 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9214
9215 // The platform variant of myprivlib links to the platform variant of mylib
9216 // and bypasses its stubs.
9217 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 +09009218}
9219
Martin Stjernholmec009002021-03-27 15:18:31 +00009220func TestTestForForLibInOtherApex(t *testing.T) {
9221 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9222 _ = testApex(t, `
9223 apex {
9224 name: "com.android.art",
9225 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009226 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009227 updatable: false,
9228 }
9229
9230 apex {
9231 name: "com.android.art.debug",
9232 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009233 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009234 updatable: false,
9235 }
9236
9237 apex_key {
9238 name: "myapex.key",
9239 public_key: "testkey.avbpubkey",
9240 private_key: "testkey.pem",
9241 }
9242
9243 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009244 name: "libnativebridge",
9245 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009246 system_shared_libs: [],
9247 stl: "none",
9248 stubs: {
9249 versions: ["1"],
9250 },
9251 apex_available: ["com.android.art", "com.android.art.debug"],
9252 }
9253
9254 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009255 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009256 srcs: ["mylib.cpp"],
9257 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009258 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009259 stl: "none",
9260 apex_available: ["com.android.art.debug"],
9261 test_for: ["com.android.art"],
9262 }
9263 `,
9264 android.MockFS{
9265 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9266 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9267 }.AddToFixture())
9268}
9269
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009270// TODO(jungjw): Move this to proptools
9271func intPtr(i int) *int {
9272 return &i
9273}
9274
9275func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009276 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009277 apex_set {
9278 name: "myapex",
9279 set: "myapex.apks",
9280 filename: "foo_v2.apex",
9281 overrides: ["foo"],
9282 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009283 `,
9284 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9285 variables.Platform_sdk_version = intPtr(30)
9286 }),
9287 android.FixtureModifyConfig(func(config android.Config) {
9288 config.Targets[android.Android] = []android.Target{
9289 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9290 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9291 }
9292 }),
9293 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009294
Spandan Das3576e762024-01-03 18:57:03 +00009295 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009296
9297 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009298 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009299 actual := extractedApex.Args["abis"]
9300 expected := "ARMEABI_V7A,ARM64_V8A"
9301 if actual != expected {
9302 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9303 }
9304 actual = extractedApex.Args["sdk-version"]
9305 expected = "30"
9306 if actual != expected {
9307 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9308 }
9309
Paul Duffin6717d882021-06-15 19:09:41 +01009310 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009311 a := m.Module().(*ApexSet)
9312 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009313 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009314 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9315 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9316 }
9317}
9318
Anton Hansson805e0a52022-11-25 14:06:46 +00009319func TestApexSet_NativeBridge(t *testing.T) {
9320 ctx := testApex(t, `
9321 apex_set {
9322 name: "myapex",
9323 set: "myapex.apks",
9324 filename: "foo_v2.apex",
9325 overrides: ["foo"],
9326 }
9327 `,
9328 android.FixtureModifyConfig(func(config android.Config) {
9329 config.Targets[android.Android] = []android.Target{
9330 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9331 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9332 }
9333 }),
9334 )
9335
Spandan Das3576e762024-01-03 18:57:03 +00009336 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009337
9338 // Check extract_apks tool parameters. No native bridge arch expected
9339 extractedApex := m.Output("extracted/myapex.apks")
9340 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9341}
9342
Jiyong Park7d95a512020-05-10 15:16:24 +09009343func TestNoStaticLinkingToStubsLib(t *testing.T) {
9344 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9345 apex {
9346 name: "myapex",
9347 key: "myapex.key",
9348 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009349 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009350 }
9351
9352 apex_key {
9353 name: "myapex.key",
9354 public_key: "testkey.avbpubkey",
9355 private_key: "testkey.pem",
9356 }
9357
9358 cc_library {
9359 name: "mylib",
9360 srcs: ["mylib.cpp"],
9361 static_libs: ["otherlib"],
9362 system_shared_libs: [],
9363 stl: "none",
9364 apex_available: [ "myapex" ],
9365 }
9366
9367 cc_library {
9368 name: "otherlib",
9369 srcs: ["mylib.cpp"],
9370 system_shared_libs: [],
9371 stl: "none",
9372 stubs: {
9373 versions: ["1", "2", "3"],
9374 },
9375 apex_available: [ "myapex" ],
9376 }
9377 `)
9378}
9379
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009380func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009381 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009382 apex {
9383 name: "myapex",
9384 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009385 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009386 custom_sign_tool: "sign_myapex",
9387 }
9388
9389 apex_key {
9390 name: "myapex.key",
9391 public_key: "testkey.avbpubkey",
9392 private_key: "testkey.pem",
9393 }
9394 `)
9395
Jooyung Han286957d2023-10-30 16:17:56 +09009396 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009397 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009398 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 +09009399}
9400
9401func TestApexKeysTxtOverrides(t *testing.T) {
9402 ctx := testApex(t, `
9403 apex {
9404 name: "myapex",
9405 key: "myapex.key",
9406 updatable: false,
9407 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009408 }
9409
9410 apex_key {
9411 name: "myapex.key",
9412 public_key: "testkey.avbpubkey",
9413 private_key: "testkey.pem",
9414 }
9415
9416 prebuilt_apex {
9417 name: "myapex",
9418 prefer: true,
9419 arch: {
9420 arm64: {
9421 src: "myapex-arm64.apex",
9422 },
9423 arm: {
9424 src: "myapex-arm.apex",
9425 },
9426 },
9427 }
9428
9429 apex_set {
9430 name: "myapex_set",
9431 set: "myapex.apks",
9432 filename: "myapex_set.apex",
9433 overrides: ["myapex"],
9434 }
9435 `)
9436
Colin Crossf61d03d2023-11-02 16:56:39 -07009437 content := android.ContentFromFileRuleForTests(t, ctx,
9438 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009439 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 -07009440 content = android.ContentFromFileRuleForTests(t, ctx,
9441 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009442 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 +09009443}
9444
Jooyung Han938b5932020-06-20 12:47:47 +09009445func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009446 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009447 apex {
9448 name: "myapex",
9449 key: "myapex.key",
9450 apps: ["app"],
9451 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009452 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009453 }
9454
9455 apex_key {
9456 name: "myapex.key",
9457 public_key: "testkey.avbpubkey",
9458 private_key: "testkey.pem",
9459 }
9460
9461 android_app {
9462 name: "app",
9463 srcs: ["foo/bar/MyClass.java"],
9464 package_name: "foo",
9465 sdk_version: "none",
9466 system_modules: "none",
9467 apex_available: [ "myapex" ],
9468 }
9469 `, withFiles(map[string][]byte{
9470 "sub/Android.bp": []byte(`
9471 override_apex {
9472 name: "override_myapex",
9473 base: "myapex",
9474 apps: ["override_app"],
9475 allowed_files: ":allowed",
9476 }
9477 // Overridable "path" property should be referenced indirectly
9478 filegroup {
9479 name: "allowed",
9480 srcs: ["allowed.txt"],
9481 }
9482 override_android_app {
9483 name: "override_app",
9484 base: "app",
9485 package_name: "bar",
9486 }
9487 `),
9488 }))
9489
Jooyung Hana0503a52023-08-23 13:12:50 +09009490 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009491 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9492 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9493 }
9494
Jooyung Hana0503a52023-08-23 13:12:50 +09009495 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009496 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9497 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9498 }
9499}
9500
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009501func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009502 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009503 apex {
9504 name: "myapex",
9505 key: "myapex.key",
9506 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009507 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009508 }
9509
9510 apex_key {
9511 name: "myapex.key",
9512 public_key: "testkey.avbpubkey",
9513 private_key: "testkey.pem",
9514 }
9515
9516 cc_library {
9517 name: "mylib",
9518 srcs: ["mylib.cpp"],
9519 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009520 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009521 },
9522 apex_available: ["myapex"],
9523 }
9524
9525 cc_prebuilt_library_shared {
9526 name: "mylib",
9527 prefer: false,
9528 srcs: ["prebuilt.so"],
9529 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009530 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009531 },
9532 apex_available: ["myapex"],
9533 }
9534 `)
9535}
9536
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009537func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009538 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009539 apex {
9540 name: "myapex",
9541 key: "myapex.key",
9542 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009543 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009544 }
9545 apex_key {
9546 name: "myapex.key",
9547 public_key: "testkey.avbpubkey",
9548 private_key: "testkey.pem",
9549 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009550 `,
9551 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9552 variables.CompressedApex = proptools.BoolPtr(true)
9553 }),
9554 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009555
Jooyung Hana0503a52023-08-23 13:12:50 +09009556 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009557 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9558
Jooyung Hana0503a52023-08-23 13:12:50 +09009559 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009560 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9561
9562 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009563 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009564 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9565
9566 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009567 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009568 var builder strings.Builder
9569 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9570 androidMk := builder.String()
9571 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9572}
9573
Martin Stjernholm2856c662020-12-02 15:03:42 +00009574func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009575 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009576 apex {
9577 name: "myapex",
9578 key: "myapex.key",
9579 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009580 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009581 }
9582
9583 apex_key {
9584 name: "myapex.key",
9585 public_key: "testkey.avbpubkey",
9586 private_key: "testkey.pem",
9587 }
9588
9589 cc_library {
9590 name: "mylib",
9591 srcs: ["mylib.cpp"],
9592 apex_available: ["myapex"],
9593 shared_libs: ["otherlib"],
9594 system_shared_libs: [],
9595 }
9596
9597 cc_library {
9598 name: "otherlib",
9599 srcs: ["mylib.cpp"],
9600 stubs: {
9601 versions: ["current"],
9602 },
9603 }
9604
9605 cc_prebuilt_library_shared {
9606 name: "otherlib",
9607 prefer: true,
9608 srcs: ["prebuilt.so"],
9609 stubs: {
9610 versions: ["current"],
9611 },
9612 }
9613 `)
9614
Jooyung Hana0503a52023-08-23 13:12:50 +09009615 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009616 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009617 var builder strings.Builder
9618 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9619 androidMk := builder.String()
9620
9621 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9622 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009623 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009624}
9625
Jiyong Parke3867542020-12-03 17:28:25 +09009626func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009627 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009628 apex {
9629 name: "myapex",
9630 key: "myapex.key",
9631 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009632 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009633 }
9634
9635 apex_key {
9636 name: "myapex.key",
9637 public_key: "testkey.avbpubkey",
9638 private_key: "testkey.pem",
9639 }
9640
9641 cc_library {
9642 name: "mylib",
9643 srcs: ["mylib.cpp"],
9644 system_shared_libs: [],
9645 stl: "none",
9646 apex_available: ["myapex"],
9647 shared_libs: ["mylib2"],
9648 target: {
9649 apex: {
9650 exclude_shared_libs: ["mylib2"],
9651 },
9652 },
9653 }
9654
9655 cc_library {
9656 name: "mylib2",
9657 srcs: ["mylib.cpp"],
9658 system_shared_libs: [],
9659 stl: "none",
9660 }
9661 `)
9662
9663 // Check if mylib is linked to mylib2 for the non-apex target
9664 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9665 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9666
9667 // Make sure that the link doesn't occur for the apex target
9668 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9669 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9670
9671 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009672 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009673 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9674}
9675
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009676func TestPrebuiltStubLibDep(t *testing.T) {
9677 bpBase := `
9678 apex {
9679 name: "myapex",
9680 key: "myapex.key",
9681 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009682 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009683 }
9684 apex_key {
9685 name: "myapex.key",
9686 public_key: "testkey.avbpubkey",
9687 private_key: "testkey.pem",
9688 }
9689 cc_library {
9690 name: "mylib",
9691 srcs: ["mylib.cpp"],
9692 apex_available: ["myapex"],
9693 shared_libs: ["stublib"],
9694 system_shared_libs: [],
9695 }
9696 apex {
9697 name: "otherapex",
9698 enabled: %s,
9699 key: "myapex.key",
9700 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009701 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009702 }
9703 `
9704
9705 stublibSourceBp := `
9706 cc_library {
9707 name: "stublib",
9708 srcs: ["mylib.cpp"],
9709 apex_available: ["otherapex"],
9710 system_shared_libs: [],
9711 stl: "none",
9712 stubs: {
9713 versions: ["1"],
9714 },
9715 }
9716 `
9717
9718 stublibPrebuiltBp := `
9719 cc_prebuilt_library_shared {
9720 name: "stublib",
9721 srcs: ["prebuilt.so"],
9722 apex_available: ["otherapex"],
9723 stubs: {
9724 versions: ["1"],
9725 },
9726 %s
9727 }
9728 `
9729
9730 tests := []struct {
9731 name string
9732 stublibBp string
9733 usePrebuilt bool
9734 modNames []string // Modules to collect AndroidMkEntries for
9735 otherApexEnabled []string
9736 }{
9737 {
9738 name: "only_source",
9739 stublibBp: stublibSourceBp,
9740 usePrebuilt: false,
9741 modNames: []string{"stublib"},
9742 otherApexEnabled: []string{"true", "false"},
9743 },
9744 {
9745 name: "source_preferred",
9746 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9747 usePrebuilt: false,
9748 modNames: []string{"stublib", "prebuilt_stublib"},
9749 otherApexEnabled: []string{"true", "false"},
9750 },
9751 {
9752 name: "prebuilt_preferred",
9753 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9754 usePrebuilt: true,
9755 modNames: []string{"stublib", "prebuilt_stublib"},
9756 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9757 },
9758 {
9759 name: "only_prebuilt",
9760 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9761 usePrebuilt: true,
9762 modNames: []string{"stublib"},
9763 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9764 },
9765 }
9766
9767 for _, test := range tests {
9768 t.Run(test.name, func(t *testing.T) {
9769 for _, otherApexEnabled := range test.otherApexEnabled {
9770 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009771 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009772
9773 type modAndMkEntries struct {
9774 mod *cc.Module
9775 mkEntries android.AndroidMkEntries
9776 }
9777 entries := []*modAndMkEntries{}
9778
9779 // Gather shared lib modules that are installable
9780 for _, modName := range test.modNames {
9781 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9782 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9783 continue
9784 }
9785 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009786 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009787 continue
9788 }
Colin Crossaa255532020-07-03 13:18:24 -07009789 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009790 if ent.Disabled {
9791 continue
9792 }
9793 entries = append(entries, &modAndMkEntries{
9794 mod: mod,
9795 mkEntries: ent,
9796 })
9797 }
9798 }
9799 }
9800
9801 var entry *modAndMkEntries = nil
9802 for _, ent := range entries {
9803 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9804 if entry != nil {
9805 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9806 } else {
9807 entry = ent
9808 }
9809 }
9810 }
9811
9812 if entry == nil {
9813 t.Errorf("AndroidMk entry for \"stublib\" missing")
9814 } else {
9815 isPrebuilt := entry.mod.Prebuilt() != nil
9816 if isPrebuilt != test.usePrebuilt {
9817 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9818 }
9819 if !entry.mod.IsStubs() {
9820 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9821 }
9822 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9823 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9824 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009825 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009826 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009827 if !android.InList(expected, cflags) {
9828 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9829 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009830 }
9831 })
9832 }
9833 })
9834 }
9835}
9836
Colin Crossc33e5212021-05-25 18:16:02 -07009837func TestApexJavaCoverage(t *testing.T) {
9838 bp := `
9839 apex {
9840 name: "myapex",
9841 key: "myapex.key",
9842 java_libs: ["mylib"],
9843 bootclasspath_fragments: ["mybootclasspathfragment"],
9844 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9845 updatable: false,
9846 }
9847
9848 apex_key {
9849 name: "myapex.key",
9850 public_key: "testkey.avbpubkey",
9851 private_key: "testkey.pem",
9852 }
9853
9854 java_library {
9855 name: "mylib",
9856 srcs: ["mylib.java"],
9857 apex_available: ["myapex"],
9858 compile_dex: true,
9859 }
9860
9861 bootclasspath_fragment {
9862 name: "mybootclasspathfragment",
9863 contents: ["mybootclasspathlib"],
9864 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009865 hidden_api: {
9866 split_packages: ["*"],
9867 },
Colin Crossc33e5212021-05-25 18:16:02 -07009868 }
9869
9870 java_library {
9871 name: "mybootclasspathlib",
9872 srcs: ["mybootclasspathlib.java"],
9873 apex_available: ["myapex"],
9874 compile_dex: true,
9875 }
9876
9877 systemserverclasspath_fragment {
9878 name: "mysystemserverclasspathfragment",
9879 contents: ["mysystemserverclasspathlib"],
9880 apex_available: ["myapex"],
9881 }
9882
9883 java_library {
9884 name: "mysystemserverclasspathlib",
9885 srcs: ["mysystemserverclasspathlib.java"],
9886 apex_available: ["myapex"],
9887 compile_dex: true,
9888 }
9889 `
9890
9891 result := android.GroupFixturePreparers(
9892 PrepareForTestWithApexBuildComponents,
9893 prepareForTestWithMyapex,
9894 java.PrepareForTestWithJavaDefaultModules,
9895 android.PrepareForTestWithAndroidBuildComponents,
9896 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009897 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9898 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009899 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009900 ).RunTest(t)
9901
9902 // Make sure jacoco ran on both mylib and mybootclasspathlib
9903 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9904 t.Errorf("Failed to find jacoco rule for mylib")
9905 }
9906 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9907 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9908 }
9909 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9910 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9911 }
9912}
9913
Jiyong Park192600a2021-08-03 07:52:17 +00009914func TestProhibitStaticExecutable(t *testing.T) {
9915 testApexError(t, `executable mybin is static`, `
9916 apex {
9917 name: "myapex",
9918 key: "myapex.key",
9919 binaries: ["mybin"],
9920 min_sdk_version: "29",
9921 }
9922
9923 apex_key {
9924 name: "myapex.key",
9925 public_key: "testkey.avbpubkey",
9926 private_key: "testkey.pem",
9927 }
9928
9929 cc_binary {
9930 name: "mybin",
9931 srcs: ["mylib.cpp"],
9932 relative_install_path: "foo/bar",
9933 static_executable: true,
9934 system_shared_libs: [],
9935 stl: "none",
9936 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009937 min_sdk_version: "29",
9938 }
9939 `)
9940
9941 testApexError(t, `executable mybin.rust is static`, `
9942 apex {
9943 name: "myapex",
9944 key: "myapex.key",
9945 binaries: ["mybin.rust"],
9946 min_sdk_version: "29",
9947 }
9948
9949 apex_key {
9950 name: "myapex.key",
9951 public_key: "testkey.avbpubkey",
9952 private_key: "testkey.pem",
9953 }
9954
9955 rust_binary {
9956 name: "mybin.rust",
9957 srcs: ["foo.rs"],
9958 static_executable: true,
9959 apex_available: ["myapex"],
9960 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009961 }
9962 `)
9963}
9964
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009965func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9966 ctx := testApex(t, `
9967 apex {
9968 name: "myapex",
9969 key: "myapex.key",
9970 updatable: false,
9971 java_libs: ["foo"],
9972 }
9973
9974 apex_key {
9975 name: "myapex.key",
9976 public_key: "testkey.avbpubkey",
9977 private_key: "testkey.pem",
9978 }
9979
9980 java_library {
9981 name: "foo",
9982 srcs: ["foo.java"],
9983 apex_available: ["myapex"],
9984 installable: true,
9985 }
9986 `,
9987 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9988 )
9989
Jooyung Hana0503a52023-08-23 13:12:50 +09009990 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9992 var builder strings.Builder
9993 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9994 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009995 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 +00009996}
9997
9998func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9999 ctx := testApex(t, `
10000 prebuilt_apex {
10001 name: "myapex",
10002 arch: {
10003 arm64: {
10004 src: "myapex-arm64.apex",
10005 },
10006 arm: {
10007 src: "myapex-arm.apex",
10008 },
10009 },
10010 exported_java_libs: ["foo"],
10011 }
10012
10013 java_import {
10014 name: "foo",
10015 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +000010016 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +000010017 }
10018 `,
10019 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
10020 )
10021
10022 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
10023 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
10024 mainModuleEntries := entriesList[0]
10025 android.AssertArrayString(t,
10026 "LOCAL_REQUIRED_MODULES",
10027 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
10028 []string{
10029 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
10030 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
10031 })
10032}
10033
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010034func TestAndroidMk_RequiredModules(t *testing.T) {
10035 ctx := testApex(t, `
10036 apex {
10037 name: "myapex",
10038 key: "myapex.key",
10039 updatable: false,
10040 java_libs: ["foo"],
10041 required: ["otherapex"],
10042 }
10043
10044 apex {
10045 name: "otherapex",
10046 key: "myapex.key",
10047 updatable: false,
10048 java_libs: ["foo"],
10049 required: ["otherapex"],
10050 }
10051
10052 apex_key {
10053 name: "myapex.key",
10054 public_key: "testkey.avbpubkey",
10055 private_key: "testkey.pem",
10056 }
10057
10058 java_library {
10059 name: "foo",
10060 srcs: ["foo.java"],
10061 apex_available: ["myapex", "otherapex"],
10062 installable: true,
10063 }
10064 `)
10065
Jooyung Hana0503a52023-08-23 13:12:50 +090010066 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010067 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
10068 var builder strings.Builder
10069 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10070 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010071 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010072}
10073
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010074func TestAndroidMk_RequiredDeps(t *testing.T) {
10075 ctx := testApex(t, `
10076 apex {
10077 name: "myapex",
10078 key: "myapex.key",
10079 updatable: false,
10080 }
10081
10082 apex_key {
10083 name: "myapex.key",
10084 public_key: "testkey.avbpubkey",
10085 private_key: "testkey.pem",
10086 }
10087 `)
10088
Jooyung Hana0503a52023-08-23 13:12:50 +090010089 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010090 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010091 data := android.AndroidMkDataForTest(t, ctx, bundle)
10092 var builder strings.Builder
10093 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10094 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010095 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010096}
10097
Jooyung Hana6d36672022-02-24 13:58:07 +090010098func TestApexOutputFileProducer(t *testing.T) {
10099 for _, tc := range []struct {
10100 name string
10101 ref string
10102 expected_data []string
10103 }{
10104 {
10105 name: "test_using_output",
10106 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010107 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010108 },
10109 {
10110 name: "test_using_apex",
10111 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010112 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010113 },
10114 } {
10115 t.Run(tc.name, func(t *testing.T) {
10116 ctx := testApex(t, `
10117 apex {
10118 name: "myapex",
10119 key: "myapex.key",
10120 compressible: true,
10121 updatable: false,
10122 }
10123
10124 apex_key {
10125 name: "myapex.key",
10126 public_key: "testkey.avbpubkey",
10127 private_key: "testkey.pem",
10128 }
10129
10130 java_test {
10131 name: "`+tc.name+`",
10132 srcs: ["a.java"],
10133 data: ["`+tc.ref+`"],
10134 }
10135 `,
10136 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10137 variables.CompressedApex = proptools.BoolPtr(true)
10138 }))
10139 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10140 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10141 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10142 })
10143 }
10144}
10145
satayev758968a2021-12-06 11:42:40 +000010146func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10147 preparer := android.GroupFixturePreparers(
10148 PrepareForTestWithApexBuildComponents,
10149 prepareForTestWithMyapex,
10150 java.PrepareForTestWithJavaSdkLibraryFiles,
10151 java.PrepareForTestWithJavaDefaultModules,
10152 android.PrepareForTestWithAndroidBuildComponents,
10153 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10154 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10155 )
10156
10157 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10158 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10159 preparer.RunTestWithBp(t, `
10160 apex {
10161 name: "myapex",
10162 key: "myapex.key",
10163 bootclasspath_fragments: ["mybootclasspathfragment"],
10164 min_sdk_version: "30",
10165 updatable: false,
10166 }
10167
10168 apex_key {
10169 name: "myapex.key",
10170 public_key: "testkey.avbpubkey",
10171 private_key: "testkey.pem",
10172 }
10173
10174 bootclasspath_fragment {
10175 name: "mybootclasspathfragment",
10176 contents: ["mybootclasspathlib"],
10177 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010178 hidden_api: {
10179 split_packages: ["*"],
10180 },
satayev758968a2021-12-06 11:42:40 +000010181 }
10182
10183 java_sdk_library {
10184 name: "mybootclasspathlib",
10185 srcs: ["mybootclasspathlib.java"],
10186 apex_available: ["myapex"],
10187 compile_dex: true,
10188 unsafe_ignore_missing_latest_api: true,
10189 min_sdk_version: "31",
10190 static_libs: ["util"],
10191 }
10192
10193 java_library {
10194 name: "util",
10195 srcs: ["a.java"],
10196 apex_available: ["myapex"],
10197 min_sdk_version: "31",
10198 static_libs: ["another_util"],
10199 }
10200
10201 java_library {
10202 name: "another_util",
10203 srcs: ["a.java"],
10204 min_sdk_version: "31",
10205 apex_available: ["myapex"],
10206 }
10207 `)
10208 })
10209
10210 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10211 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10212 preparer.RunTestWithBp(t, `
10213 apex {
10214 name: "myapex",
10215 key: "myapex.key",
10216 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10217 min_sdk_version: "30",
10218 updatable: false,
10219 }
10220
10221 apex_key {
10222 name: "myapex.key",
10223 public_key: "testkey.avbpubkey",
10224 private_key: "testkey.pem",
10225 }
10226
10227 systemserverclasspath_fragment {
10228 name: "mysystemserverclasspathfragment",
10229 contents: ["mysystemserverclasspathlib"],
10230 apex_available: ["myapex"],
10231 }
10232
10233 java_sdk_library {
10234 name: "mysystemserverclasspathlib",
10235 srcs: ["mysystemserverclasspathlib.java"],
10236 apex_available: ["myapex"],
10237 compile_dex: true,
10238 min_sdk_version: "32",
10239 unsafe_ignore_missing_latest_api: true,
10240 static_libs: ["util"],
10241 }
10242
10243 java_library {
10244 name: "util",
10245 srcs: ["a.java"],
10246 apex_available: ["myapex"],
10247 min_sdk_version: "31",
10248 static_libs: ["another_util"],
10249 }
10250
10251 java_library {
10252 name: "another_util",
10253 srcs: ["a.java"],
10254 min_sdk_version: "31",
10255 apex_available: ["myapex"],
10256 }
10257 `)
10258 })
10259
10260 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10261 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10262 RunTestWithBp(t, `
10263 apex {
10264 name: "myapex",
10265 key: "myapex.key",
10266 bootclasspath_fragments: ["mybootclasspathfragment"],
10267 min_sdk_version: "30",
10268 updatable: false,
10269 }
10270
10271 apex_key {
10272 name: "myapex.key",
10273 public_key: "testkey.avbpubkey",
10274 private_key: "testkey.pem",
10275 }
10276
10277 bootclasspath_fragment {
10278 name: "mybootclasspathfragment",
10279 contents: ["mybootclasspathlib"],
10280 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010281 hidden_api: {
10282 split_packages: ["*"],
10283 },
satayev758968a2021-12-06 11:42:40 +000010284 }
10285
10286 java_sdk_library {
10287 name: "mybootclasspathlib",
10288 srcs: ["mybootclasspathlib.java"],
10289 apex_available: ["myapex"],
10290 compile_dex: true,
10291 unsafe_ignore_missing_latest_api: true,
10292 }
10293 `)
10294 })
10295
10296 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10297 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10298 RunTestWithBp(t, `
10299 apex {
10300 name: "myapex",
10301 key: "myapex.key",
10302 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10303 min_sdk_version: "30",
10304 updatable: false,
10305 }
10306
10307 apex_key {
10308 name: "myapex.key",
10309 public_key: "testkey.avbpubkey",
10310 private_key: "testkey.pem",
10311 }
10312
10313 systemserverclasspath_fragment {
10314 name: "mysystemserverclasspathfragment",
10315 contents: ["mysystemserverclasspathlib"],
10316 apex_available: ["myapex"],
10317 }
10318
10319 java_sdk_library {
10320 name: "mysystemserverclasspathlib",
10321 srcs: ["mysystemserverclasspathlib.java"],
10322 apex_available: ["myapex"],
10323 compile_dex: true,
10324 unsafe_ignore_missing_latest_api: true,
10325 }
10326 `)
10327 })
10328}
10329
Jiakai Zhang6decef92022-01-12 17:56:19 +000010330// Verifies that the APEX depends on all the Make modules in the list.
10331func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10332 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10333 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010334 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010335 }
10336}
10337
10338// Verifies that the APEX does not depend on any of the Make modules in the list.
10339func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10340 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10341 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010342 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010343 }
10344}
10345
Cole Faust1021ccd2023-02-26 21:15:25 -080010346// TODO(b/193460475): Re-enable this test
10347//func TestApexStrictUpdtabilityLint(t *testing.T) {
10348// bpTemplate := `
10349// apex {
10350// name: "myapex",
10351// key: "myapex.key",
10352// java_libs: ["myjavalib"],
10353// updatable: %v,
10354// min_sdk_version: "29",
10355// }
10356// apex_key {
10357// name: "myapex.key",
10358// }
10359// java_library {
10360// name: "myjavalib",
10361// srcs: ["MyClass.java"],
10362// apex_available: [ "myapex" ],
10363// lint: {
10364// strict_updatability_linting: %v,
10365// },
10366// sdk_version: "current",
10367// min_sdk_version: "29",
10368// }
10369// `
10370// fs := android.MockFS{
10371// "lint-baseline.xml": nil,
10372// }
10373//
10374// testCases := []struct {
10375// testCaseName string
10376// apexUpdatable bool
10377// javaStrictUpdtabilityLint bool
10378// lintFileExists bool
10379// disallowedFlagExpected bool
10380// }{
10381// {
10382// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10383// apexUpdatable: true,
10384// javaStrictUpdtabilityLint: true,
10385// lintFileExists: false,
10386// disallowedFlagExpected: false,
10387// },
10388// {
10389// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10390// apexUpdatable: false,
10391// javaStrictUpdtabilityLint: false,
10392// lintFileExists: true,
10393// disallowedFlagExpected: false,
10394// },
10395// {
10396// testCaseName: "non-updatable apex respects strict updatability of javalib",
10397// apexUpdatable: false,
10398// javaStrictUpdtabilityLint: true,
10399// lintFileExists: true,
10400// disallowedFlagExpected: true,
10401// },
10402// {
10403// testCaseName: "updatable apex sets strict updatability of javalib to true",
10404// apexUpdatable: true,
10405// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10406// lintFileExists: true,
10407// disallowedFlagExpected: true,
10408// },
10409// }
10410//
10411// for _, testCase := range testCases {
10412// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10413// fixtures := []android.FixturePreparer{}
10414// if testCase.lintFileExists {
10415// fixtures = append(fixtures, fs.AddToFixture())
10416// }
10417//
10418// result := testApex(t, bp, fixtures...)
10419// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10420// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10421// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10422//
10423// if disallowedFlagActual != testCase.disallowedFlagExpected {
10424// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10425// }
10426// }
10427//}
10428//
10429//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10430// bp := `
10431// apex {
10432// name: "myapex",
10433// key: "myapex.key",
10434// java_libs: ["myjavalib"],
10435// updatable: true,
10436// min_sdk_version: "29",
10437// }
10438// apex_key {
10439// name: "myapex.key",
10440// }
10441// java_library {
10442// name: "myjavalib",
10443// srcs: ["MyClass.java"],
10444// apex_available: [ "myapex" ],
10445// sdk_version: "current",
10446// min_sdk_version: "29",
10447// }
10448// `
10449//
10450// testCases := []struct {
10451// testCaseName string
10452// moduleDirectory string
10453// disallowedFlagExpected bool
10454// }{
10455// {
10456// testCaseName: "lintable module defined outside libcore",
10457// moduleDirectory: "",
10458// disallowedFlagExpected: true,
10459// },
10460// {
10461// testCaseName: "lintable module defined in libcore root directory",
10462// moduleDirectory: "libcore/",
10463// disallowedFlagExpected: false,
10464// },
10465// {
10466// testCaseName: "lintable module defined in libcore child directory",
10467// moduleDirectory: "libcore/childdir/",
10468// disallowedFlagExpected: true,
10469// },
10470// }
10471//
10472// for _, testCase := range testCases {
10473// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10474// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10475// result := testApex(t, "", lintFileCreator, bpFileCreator)
10476// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10477// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10478// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10479// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10480//
10481// if disallowedFlagActual != testCase.disallowedFlagExpected {
10482// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10483// }
10484// }
10485//}
10486//
10487//// checks transtive deps of an apex coming from bootclasspath_fragment
10488//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10489// bp := `
10490// apex {
10491// name: "myapex",
10492// key: "myapex.key",
10493// bootclasspath_fragments: ["mybootclasspathfragment"],
10494// updatable: true,
10495// min_sdk_version: "29",
10496// }
10497// apex_key {
10498// name: "myapex.key",
10499// }
10500// bootclasspath_fragment {
10501// name: "mybootclasspathfragment",
10502// contents: ["myjavalib"],
10503// apex_available: ["myapex"],
10504// hidden_api: {
10505// split_packages: ["*"],
10506// },
10507// }
10508// java_library {
10509// name: "myjavalib",
10510// srcs: ["MyClass.java"],
10511// apex_available: [ "myapex" ],
10512// sdk_version: "current",
10513// min_sdk_version: "29",
10514// compile_dex: true,
10515// }
10516// `
10517// fs := android.MockFS{
10518// "lint-baseline.xml": nil,
10519// }
10520//
10521// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10522// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10523// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10524// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10525// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10526// }
10527//}
Spandan Das66773252022-01-15 00:23:18 +000010528
Spandan Das42e89502022-05-06 22:12:55 +000010529// updatable apexes should propagate updatable=true to its apps
10530func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10531 bp := `
10532 apex {
10533 name: "myapex",
10534 key: "myapex.key",
10535 updatable: %v,
10536 apps: [
10537 "myapp",
10538 ],
10539 min_sdk_version: "30",
10540 }
10541 apex_key {
10542 name: "myapex.key",
10543 }
10544 android_app {
10545 name: "myapp",
10546 updatable: %v,
10547 apex_available: [
10548 "myapex",
10549 ],
10550 sdk_version: "current",
10551 min_sdk_version: "30",
10552 }
10553 `
10554 testCases := []struct {
10555 name string
10556 apex_is_updatable_bp bool
10557 app_is_updatable_bp bool
10558 app_is_updatable_expected bool
10559 }{
10560 {
10561 name: "Non-updatable apex respects updatable property of non-updatable app",
10562 apex_is_updatable_bp: false,
10563 app_is_updatable_bp: false,
10564 app_is_updatable_expected: false,
10565 },
10566 {
10567 name: "Non-updatable apex respects updatable property of updatable app",
10568 apex_is_updatable_bp: false,
10569 app_is_updatable_bp: true,
10570 app_is_updatable_expected: true,
10571 },
10572 {
10573 name: "Updatable apex respects updatable property of updatable app",
10574 apex_is_updatable_bp: true,
10575 app_is_updatable_bp: true,
10576 app_is_updatable_expected: true,
10577 },
10578 {
10579 name: "Updatable apex sets updatable=true on non-updatable app",
10580 apex_is_updatable_bp: true,
10581 app_is_updatable_bp: false,
10582 app_is_updatable_expected: true,
10583 },
10584 }
10585 for _, testCase := range testCases {
10586 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10587 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10588 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10589 }
10590}
10591
Kiyoung Kim487689e2022-07-26 09:48:22 +090010592func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10593 bp := `
10594 apex {
10595 name: "myapex",
10596 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010597 native_shared_libs: ["libbaz"],
10598 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010599 min_sdk_version: "29",
10600 }
10601 apex_key {
10602 name: "myapex.key",
10603 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010604 cc_binary {
10605 name: "binfoo",
10606 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010607 apex_available: ["myapex"],
10608 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010609 recovery_available: false,
10610 }
10611 cc_library {
10612 name: "libbar",
10613 srcs: ["libbar.cc"],
10614 stubs: {
10615 symbol_file: "libbar.map.txt",
10616 versions: [
10617 "29",
10618 ],
10619 },
10620 }
10621 cc_library {
10622 name: "libbaz",
10623 srcs: ["libbaz.cc"],
10624 apex_available: ["myapex"],
10625 min_sdk_version: "29",
10626 stubs: {
10627 symbol_file: "libbaz.map.txt",
10628 versions: [
10629 "29",
10630 ],
10631 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010632 }
10633 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010634 name: "libbar",
10635 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010636 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010637 variants: ["apex.29"],
10638 }
10639 cc_api_variant {
10640 name: "libbar",
10641 variant: "apex",
10642 version: "29",
10643 src: "libbar_apex_29.so",
10644 }
10645 cc_api_library {
10646 name: "libbaz",
10647 src: "libbaz_stub.so",
10648 min_sdk_version: "29",
10649 variants: ["apex.29"],
10650 }
10651 cc_api_variant {
10652 name: "libbaz",
10653 variant: "apex",
10654 version: "29",
10655 src: "libbaz_apex_29.so",
10656 }
10657 cc_api_library {
10658 name: "libqux",
10659 src: "libqux_stub.so",
10660 min_sdk_version: "29",
10661 variants: ["apex.29"],
10662 }
10663 cc_api_variant {
10664 name: "libqux",
10665 variant: "apex",
10666 version: "29",
10667 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010668 }
10669 api_imports {
10670 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010671 apex_shared_libs: [
10672 "libbar",
10673 "libbaz",
10674 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010675 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010676 }
10677 `
10678 result := testApex(t, bp)
10679
10680 hasDep := func(m android.Module, wantDep android.Module) bool {
10681 t.Helper()
10682 var found bool
10683 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10684 if dep == wantDep {
10685 found = true
10686 }
10687 })
10688 return found
10689 }
10690
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010691 // Library defines stubs and cc_api_library should be used with cc_api_library
10692 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10693 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10694 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010695
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010696 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10697 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010698
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010699 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10700 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10701 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10702 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10703
10704 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10705 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10706 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10707 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10708 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10709
10710 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10711 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10712 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10713
10714 // cc_api_library defined without original library should be linked with cc_api_library
10715 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10716 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10717 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10718}
10719
10720func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10721 bp := `
10722 apex {
10723 name: "myapex",
10724 key: "myapex.key",
10725 native_shared_libs: ["libbar"],
10726 min_sdk_version: "29",
10727 }
10728 apex_key {
10729 name: "myapex.key",
10730 }
10731 cc_binary {
10732 name: "binfoo",
10733 shared_libs: ["libbar"],
10734 recovery_available: false,
10735 }
10736 cc_library {
10737 name: "libbar",
10738 srcs: ["libbar.cc"],
10739 apex_available: ["myapex"],
10740 min_sdk_version: "29",
10741 stubs: {
10742 symbol_file: "libbar.map.txt",
10743 versions: [
10744 "29",
10745 ],
10746 },
10747 }
10748 cc_api_library {
10749 name: "libbar",
10750 src: "libbar_stub.so",
10751 variants: ["apex.29"],
10752 }
10753 cc_api_variant {
10754 name: "libbar",
10755 variant: "apex",
10756 version: "29",
10757 src: "libbar_apex_29.so",
10758 }
10759 api_imports {
10760 name: "api_imports",
10761 apex_shared_libs: [
10762 "libbar",
10763 ],
10764 }
10765 `
10766
10767 result := testApex(t, bp)
10768
10769 hasDep := func(m android.Module, wantDep android.Module) bool {
10770 t.Helper()
10771 var found bool
10772 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10773 if dep == wantDep {
10774 found = true
10775 }
10776 })
10777 return found
10778 }
10779
10780 // Library defines stubs and cc_api_library should be used with cc_api_library
10781 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10782 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10783 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10784
10785 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10786 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10787
10788 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10789 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10790 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10791 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010792}
Dennis Shend4f5d932023-01-31 20:27:21 +000010793
10794func TestTrimmedApex(t *testing.T) {
10795 bp := `
10796 apex {
10797 name: "myapex",
10798 key: "myapex.key",
10799 native_shared_libs: ["libfoo","libbaz"],
10800 min_sdk_version: "29",
10801 trim_against: "mydcla",
10802 }
10803 apex {
10804 name: "mydcla",
10805 key: "myapex.key",
10806 native_shared_libs: ["libfoo","libbar"],
10807 min_sdk_version: "29",
10808 file_contexts: ":myapex-file_contexts",
10809 dynamic_common_lib_apex: true,
10810 }
10811 apex_key {
10812 name: "myapex.key",
10813 }
10814 cc_library {
10815 name: "libfoo",
10816 shared_libs: ["libc"],
10817 apex_available: ["myapex","mydcla"],
10818 min_sdk_version: "29",
10819 }
10820 cc_library {
10821 name: "libbar",
10822 shared_libs: ["libc"],
10823 apex_available: ["myapex","mydcla"],
10824 min_sdk_version: "29",
10825 }
10826 cc_library {
10827 name: "libbaz",
10828 shared_libs: ["libc"],
10829 apex_available: ["myapex","mydcla"],
10830 min_sdk_version: "29",
10831 }
10832 cc_api_library {
10833 name: "libc",
10834 src: "libc.so",
10835 min_sdk_version: "29",
10836 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010837 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010838 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010839 }
10840 api_imports {
10841 name: "api_imports",
10842 shared_libs: [
10843 "libc",
10844 ],
10845 header_libs: [],
10846 }
10847 `
10848 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010849 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010850 apexRule := module.MaybeRule("apexRule")
10851 if apexRule.Rule == nil {
10852 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10853 }
10854
10855 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010856 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010857 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10858 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10859 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10860 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10861}
Jingwen Chendea7a642023-03-28 11:30:50 +000010862
10863func TestCannedFsConfig(t *testing.T) {
10864 ctx := testApex(t, `
10865 apex {
10866 name: "myapex",
10867 key: "myapex.key",
10868 updatable: false,
10869 }
10870
10871 apex_key {
10872 name: "myapex.key",
10873 public_key: "testkey.avbpubkey",
10874 private_key: "testkey.pem",
10875 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010876 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010877 generateFsRule := mod.Rule("generateFsConfig")
10878 cmd := generateFsRule.RuleParams.Command
10879
10880 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10881}
10882
10883func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10884 ctx := testApex(t, `
10885 apex {
10886 name: "myapex",
10887 key: "myapex.key",
10888 canned_fs_config: "my_config",
10889 updatable: false,
10890 }
10891
10892 apex_key {
10893 name: "myapex.key",
10894 public_key: "testkey.avbpubkey",
10895 private_key: "testkey.pem",
10896 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010897 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010898 generateFsRule := mod.Rule("generateFsConfig")
10899 cmd := generateFsRule.RuleParams.Command
10900
10901 // Ensure that canned_fs_config has "cat my_config" at the end
10902 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10903}
Spandan Das20fce2d2023-04-12 17:21:39 +000010904
10905func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10906 testCases := []struct {
10907 desc string
10908 hasStubs bool
10909 apexAvailable string
10910 expectedError string
10911 }{
10912 {
10913 desc: "non-stub library can have multiple apex_available",
10914 hasStubs: false,
10915 apexAvailable: `["myapex", "otherapex"]`,
10916 },
10917 {
10918 desc: "stub library should not be available to anyapex",
10919 hasStubs: true,
10920 apexAvailable: `["//apex_available:anyapex"]`,
10921 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10922 },
10923 {
10924 desc: "stub library should not be available to multiple apexes",
10925 hasStubs: true,
10926 apexAvailable: `["myapex", "otherapex"]`,
10927 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10928 },
10929 {
10930 desc: "stub library can be available to a core apex and a test apex",
10931 hasStubs: true,
10932 apexAvailable: `["myapex", "test_myapex"]`,
10933 },
10934 }
10935 bpTemplate := `
10936 cc_library {
10937 name: "libfoo",
10938 %v
10939 apex_available: %v,
10940 }
10941 apex {
10942 name: "myapex",
10943 key: "apex.key",
10944 updatable: false,
10945 native_shared_libs: ["libfoo"],
10946 }
10947 apex {
10948 name: "otherapex",
10949 key: "apex.key",
10950 updatable: false,
10951 }
10952 apex_test {
10953 name: "test_myapex",
10954 key: "apex.key",
10955 updatable: false,
10956 native_shared_libs: ["libfoo"],
10957 }
10958 apex_key {
10959 name: "apex.key",
10960 }
10961 `
10962 for _, tc := range testCases {
10963 stubs := ""
10964 if tc.hasStubs {
10965 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10966 }
10967 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10968 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10969 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10970 })
10971 if tc.expectedError == "" {
10972 testApex(t, bp, mockFsFixturePreparer)
10973 } else {
10974 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10975 }
10976 }
10977}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010978
10979func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10980 context := android.GroupFixturePreparers(
10981 android.PrepareForIntegrationTestWithAndroid,
10982 cc.PrepareForIntegrationTestWithCc,
10983 PrepareForTestWithApexBuildComponents,
10984 prepareForTestWithMyapex,
10985 filesystem.PrepareForTestWithFilesystemBuildComponents,
10986 )
10987 result := context.RunTestWithBp(t, `
10988 android_system_image {
10989 name: "myfilesystem",
10990 deps: [
10991 "libfoo",
10992 ],
10993 linker_config_src: "linker.config.json",
10994 }
10995
10996 cc_library {
10997 name: "libfoo",
10998 shared_libs: [
10999 "libbar",
11000 ],
11001 stl: "none",
11002 }
11003
11004 cc_library {
11005 name: "libbar",
11006 stl: "none",
11007 apex_available: ["myapex"],
11008 }
11009
11010 apex {
11011 name: "myapex",
11012 native_shared_libs: ["libbar"],
11013 key: "myapex.key",
11014 updatable: false,
11015 }
11016
11017 apex_key {
11018 name: "myapex.key",
11019 public_key: "testkey.avbpubkey",
11020 private_key: "testkey.pem",
11021 }
11022 `)
11023
11024 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
11025 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
11026 inputs.Strings(),
11027 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
11028}
Yu Liueae7b362023-11-16 17:05:47 -080011029
11030var apex_default_bp = `
11031 apex_key {
11032 name: "myapex.key",
11033 public_key: "testkey.avbpubkey",
11034 private_key: "testkey.pem",
11035 }
11036
11037 filegroup {
11038 name: "myapex.manifest",
11039 srcs: ["apex_manifest.json"],
11040 }
11041
11042 filegroup {
11043 name: "myapex.androidmanifest",
11044 srcs: ["AndroidManifest.xml"],
11045 }
11046`
11047
11048func TestAconfigFilesJavaDeps(t *testing.T) {
11049 ctx := testApex(t, apex_default_bp+`
11050 apex {
11051 name: "myapex",
11052 manifest: ":myapex.manifest",
11053 androidManifest: ":myapex.androidmanifest",
11054 key: "myapex.key",
11055 java_libs: [
11056 "my_java_library_foo",
11057 "my_java_library_bar",
11058 ],
11059 updatable: false,
11060 }
11061
11062 java_library {
11063 name: "my_java_library_foo",
11064 srcs: ["foo/bar/MyClass.java"],
11065 sdk_version: "none",
11066 system_modules: "none",
11067 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011068 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011069 "myapex",
11070 ],
11071 }
11072
11073 java_library {
11074 name: "my_java_library_bar",
11075 srcs: ["foo/bar/MyClass.java"],
11076 sdk_version: "none",
11077 system_modules: "none",
11078 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011079 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011080 "myapex",
11081 ],
11082 }
11083
11084 aconfig_declarations {
11085 name: "my_aconfig_declarations_foo",
11086 package: "com.example.package",
11087 container: "myapex",
11088 srcs: ["foo.aconfig"],
11089 }
11090
11091 java_aconfig_library {
11092 name: "my_java_aconfig_library_foo",
11093 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011094 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011095 "myapex",
11096 ],
11097 }
11098
11099 aconfig_declarations {
11100 name: "my_aconfig_declarations_bar",
11101 package: "com.example.package",
11102 container: "myapex",
11103 srcs: ["bar.aconfig"],
11104 }
11105
11106 java_aconfig_library {
11107 name: "my_java_aconfig_library_bar",
11108 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011109 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011110 "myapex",
11111 ],
11112 }
11113 `)
11114
11115 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11116 s := mod.Rule("apexRule").Args["copy_commands"]
11117 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11118 if len(copyCmds) != 5 {
11119 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11120 }
11121
11122 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11123
11124 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11125 s = " " + combineAconfigRule.Args["cache_files"]
11126 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11127 if len(aconfigArgs) != 2 {
11128 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11129 }
11130 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11131 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11132
11133 buildParams := combineAconfigRule.BuildParams
11134 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11135 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11136 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11137}
11138
11139func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11140 ctx := testApex(t, apex_default_bp+`
11141 apex {
11142 name: "myapex",
11143 manifest: ":myapex.manifest",
11144 androidManifest: ":myapex.androidmanifest",
11145 key: "myapex.key",
11146 java_libs: [
11147 "my_java_library_foo",
11148 ],
11149 native_shared_libs: [
11150 "my_cc_library_bar",
11151 ],
11152 binaries: [
11153 "my_cc_binary_baz",
11154 ],
11155 updatable: false,
11156 }
11157
11158 java_library {
11159 name: "my_java_library_foo",
11160 srcs: ["foo/bar/MyClass.java"],
11161 sdk_version: "none",
11162 system_modules: "none",
11163 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011164 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011165 "myapex",
11166 ],
11167 }
11168
11169 cc_library {
11170 name: "my_cc_library_bar",
11171 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011172 static_libs: [
11173 "my_cc_aconfig_library_bar",
11174 "my_cc_aconfig_library_baz",
11175 ],
Yu Liueae7b362023-11-16 17:05:47 -080011176 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011177 "myapex",
11178 ],
11179 }
11180
11181 cc_binary {
11182 name: "my_cc_binary_baz",
11183 srcs: ["foo/bar/MyClass.cc"],
11184 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011185 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011186 "myapex",
11187 ],
11188 }
11189
11190 aconfig_declarations {
11191 name: "my_aconfig_declarations_foo",
11192 package: "com.example.package",
11193 container: "myapex",
11194 srcs: ["foo.aconfig"],
11195 }
11196
11197 java_aconfig_library {
11198 name: "my_java_aconfig_library_foo",
11199 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011200 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011201 "myapex",
11202 ],
11203 }
11204
11205 aconfig_declarations {
11206 name: "my_aconfig_declarations_bar",
11207 package: "com.example.package",
11208 container: "myapex",
11209 srcs: ["bar.aconfig"],
11210 }
11211
11212 cc_aconfig_library {
11213 name: "my_cc_aconfig_library_bar",
11214 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011215 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011216 "myapex",
11217 ],
11218 }
11219
11220 aconfig_declarations {
11221 name: "my_aconfig_declarations_baz",
11222 package: "com.example.package",
11223 container: "myapex",
11224 srcs: ["baz.aconfig"],
11225 }
11226
11227 cc_aconfig_library {
11228 name: "my_cc_aconfig_library_baz",
11229 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011230 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011231 "myapex",
11232 ],
11233 }
11234
11235 cc_library {
11236 name: "server_configurable_flags",
11237 srcs: ["server_configurable_flags.cc"],
11238 }
11239 `)
11240
11241 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11242 s := mod.Rule("apexRule").Args["copy_commands"]
11243 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11244 if len(copyCmds) != 9 {
11245 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11246 }
11247
11248 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11249
11250 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11251 s = " " + combineAconfigRule.Args["cache_files"]
11252 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11253 if len(aconfigArgs) != 3 {
11254 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11255 }
11256 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011257 android.EnsureListContainsSuffix(t, aconfigArgs, "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011258 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11259
11260 buildParams := combineAconfigRule.BuildParams
11261 if len(buildParams.Inputs) != 3 {
11262 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11263 }
11264 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011265 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb")
Yu Liueae7b362023-11-16 17:05:47 -080011266 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11267 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11268}
11269
Yu Liucec0e412023-11-30 16:45:50 -080011270func TestAconfigFilesRustDeps(t *testing.T) {
11271 ctx := testApex(t, apex_default_bp+`
11272 apex {
11273 name: "myapex",
11274 manifest: ":myapex.manifest",
11275 androidManifest: ":myapex.androidmanifest",
11276 key: "myapex.key",
11277 native_shared_libs: [
11278 "libmy_rust_library",
11279 ],
11280 binaries: [
11281 "my_rust_binary",
11282 ],
11283 rust_dyn_libs: [
11284 "libmy_rust_dylib",
11285 ],
11286 updatable: false,
11287 }
11288
11289 rust_library {
11290 name: "libflags_rust", // test mock
11291 crate_name: "flags_rust",
11292 srcs: ["lib.rs"],
11293 apex_available: [
11294 "myapex",
11295 ],
11296 }
11297
11298 rust_library {
11299 name: "liblazy_static", // test mock
11300 crate_name: "lazy_static",
11301 srcs: ["src/lib.rs"],
11302 apex_available: [
11303 "myapex",
11304 ],
11305 }
11306
11307 rust_ffi_shared {
11308 name: "libmy_rust_library",
11309 srcs: ["src/lib.rs"],
11310 rustlibs: ["libmy_rust_aconfig_library_foo"],
11311 crate_name: "my_rust_library",
11312 apex_available: [
11313 "myapex",
11314 ],
11315 }
11316
11317 rust_library_dylib {
11318 name: "libmy_rust_dylib",
11319 srcs: ["foo/bar/MyClass.rs"],
11320 rustlibs: ["libmy_rust_aconfig_library_bar"],
11321 crate_name: "my_rust_dylib",
11322 apex_available: [
11323 "myapex",
11324 ],
11325 }
11326
11327 rust_binary {
11328 name: "my_rust_binary",
11329 srcs: ["foo/bar/MyClass.rs"],
11330 rustlibs: [
11331 "libmy_rust_aconfig_library_baz",
11332 "libmy_rust_dylib",
11333 ],
11334 apex_available: [
11335 "myapex",
11336 ],
11337 }
11338
11339 aconfig_declarations {
11340 name: "my_aconfig_declarations_foo",
11341 package: "com.example.package",
11342 container: "myapex",
11343 srcs: ["foo.aconfig"],
11344 }
11345
11346 aconfig_declarations {
11347 name: "my_aconfig_declarations_bar",
11348 package: "com.example.package",
11349 container: "myapex",
11350 srcs: ["bar.aconfig"],
11351 }
11352
11353 aconfig_declarations {
11354 name: "my_aconfig_declarations_baz",
11355 package: "com.example.package",
11356 container: "myapex",
11357 srcs: ["baz.aconfig"],
11358 }
11359
11360 rust_aconfig_library {
11361 name: "libmy_rust_aconfig_library_foo",
11362 aconfig_declarations: "my_aconfig_declarations_foo",
11363 crate_name: "my_rust_aconfig_library_foo",
11364 apex_available: [
11365 "myapex",
11366 ],
11367 }
11368
11369 rust_aconfig_library {
11370 name: "libmy_rust_aconfig_library_bar",
11371 aconfig_declarations: "my_aconfig_declarations_bar",
11372 crate_name: "my_rust_aconfig_library_bar",
11373 apex_available: [
11374 "myapex",
11375 ],
11376 }
11377
11378 rust_aconfig_library {
11379 name: "libmy_rust_aconfig_library_baz",
11380 aconfig_declarations: "my_aconfig_declarations_baz",
11381 crate_name: "my_rust_aconfig_library_baz",
11382 apex_available: [
11383 "myapex",
11384 ],
11385 }
11386 `)
11387
11388 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11389 s := mod.Rule("apexRule").Args["copy_commands"]
11390 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11391 if len(copyCmds) != 23 {
11392 t.Fatalf("Expected 23 commands, got %d in:\n%s", len(copyCmds), s)
11393 }
11394
11395 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11396
11397 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11398 s = " " + combineAconfigRule.Args["cache_files"]
11399 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11400 if len(aconfigArgs) != 2 {
11401 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11402 }
11403 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011404 android.EnsureListContainsSuffix(t, aconfigArgs, "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011405
11406 buildParams := combineAconfigRule.BuildParams
11407 if len(buildParams.Inputs) != 2 {
11408 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11409 }
11410 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011411 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011412 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11413}
11414
Yu Liueae7b362023-11-16 17:05:47 -080011415func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11416 ctx := testApex(t, apex_default_bp+`
11417 apex {
11418 name: "myapex",
11419 manifest: ":myapex.manifest",
11420 androidManifest: ":myapex.androidmanifest",
11421 key: "myapex.key",
11422 java_libs: [
11423 "my_java_library_foo",
11424 "other_java_library_bar",
11425 ],
11426 updatable: false,
11427 }
11428
11429 java_library {
11430 name: "my_java_library_foo",
11431 srcs: ["foo/bar/MyClass.java"],
11432 sdk_version: "none",
11433 system_modules: "none",
11434 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011435 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011436 "myapex",
11437 ],
11438 }
11439
11440 java_library {
11441 name: "other_java_library_bar",
11442 srcs: ["foo/bar/MyClass.java"],
11443 sdk_version: "none",
11444 system_modules: "none",
11445 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011446 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011447 "myapex",
11448 ],
11449 }
11450
11451 aconfig_declarations {
11452 name: "my_aconfig_declarations_foo",
11453 package: "com.example.package",
11454 container: "myapex",
11455 srcs: ["foo.aconfig"],
11456 }
11457
11458 java_aconfig_library {
11459 name: "my_java_aconfig_library_foo",
11460 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011461 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011462 "myapex",
11463 ],
11464 }
11465
11466 aconfig_declarations {
11467 name: "other_aconfig_declarations_bar",
11468 package: "com.example.package",
11469 container: "otherapex",
11470 srcs: ["bar.aconfig"],
11471 }
11472
11473 java_aconfig_library {
11474 name: "other_java_aconfig_library_bar",
11475 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011476 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011477 "myapex",
11478 ],
11479 }
11480 `)
11481
11482 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11483 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11484 s := " " + combineAconfigRule.Args["cache_files"]
11485 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11486 if len(aconfigArgs) != 1 {
11487 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11488 }
11489 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11490
11491 buildParams := combineAconfigRule.BuildParams
11492 if len(buildParams.Inputs) != 1 {
11493 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11494 }
11495 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11496 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11497}
11498
11499func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11500 ctx := testApex(t, apex_default_bp+`
11501 apex {
11502 name: "myapex",
11503 manifest: ":myapex.manifest",
11504 androidManifest: ":myapex.androidmanifest",
11505 key: "myapex.key",
11506 java_libs: [
11507 "my_java_library_foo",
11508 "my_java_library_bar",
11509 ],
11510 updatable: false,
11511 }
11512
11513 java_library {
11514 name: "my_java_library_foo",
11515 srcs: ["foo/bar/MyClass.java"],
11516 sdk_version: "none",
11517 system_modules: "none",
11518 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011519 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011520 "myapex",
11521 ],
11522 }
11523
11524 java_library {
11525 name: "my_java_library_bar",
11526 srcs: ["foo/bar/MyClass.java"],
11527 sdk_version: "none",
11528 system_modules: "none",
11529 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011530 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011531 "myapex",
11532 ],
11533 }
11534
11535 aconfig_declarations {
11536 name: "my_aconfig_declarations_foo",
11537 package: "com.example.package",
11538 container: "myapex",
11539 srcs: ["foo.aconfig"],
11540 }
11541
11542 java_aconfig_library {
11543 name: "my_java_aconfig_library_foo",
11544 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011545 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011546 "myapex",
11547 ],
11548 }
11549
11550 java_aconfig_library {
11551 name: "my_java_aconfig_library_bar",
11552 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011553 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011554 "myapex",
11555 ],
11556 }
11557 `)
11558
11559 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11560 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11561 s := " " + combineAconfigRule.Args["cache_files"]
11562 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11563 if len(aconfigArgs) != 1 {
11564 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11565 }
11566 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11567
11568 buildParams := combineAconfigRule.BuildParams
11569 if len(buildParams.Inputs) != 1 {
11570 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11571 }
11572 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11573 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11574}
Spandan Das5be63332023-12-13 00:06:32 +000011575
11576// Test that the boot jars come from the _selected_ apex prebuilt
11577// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11578func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11579 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11580 t.Helper()
11581 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11582 foundLibfooJar := false
11583 base := stem + ".jar"
11584 for _, output := range s.AllOutputs() {
11585 if filepath.Base(output) == base {
11586 foundLibfooJar = true
11587 buildRule := s.Output(output)
11588 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11589 }
11590 }
11591 if !foundLibfooJar {
11592 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11593 }
11594 }
11595
Spandan Das64c9e0c2023-12-20 20:13:34 +000011596 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11597 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11598 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11599 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11600 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11601 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)
11602 }
11603
11604 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11605 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11606 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11607 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11608 }
11609
Spandan Das5be63332023-12-13 00:06:32 +000011610 bp := `
11611 // Source APEX.
11612
11613 java_library {
11614 name: "framework-foo",
11615 srcs: ["foo.java"],
11616 installable: true,
11617 apex_available: [
11618 "com.android.foo",
11619 ],
11620 }
11621
11622 bootclasspath_fragment {
11623 name: "foo-bootclasspath-fragment",
11624 contents: ["framework-foo"],
11625 apex_available: [
11626 "com.android.foo",
11627 ],
11628 hidden_api: {
11629 split_packages: ["*"],
11630 },
11631 }
11632
11633 apex_key {
11634 name: "com.android.foo.key",
11635 public_key: "com.android.foo.avbpubkey",
11636 private_key: "com.android.foo.pem",
11637 }
11638
11639 apex {
11640 name: "com.android.foo",
11641 key: "com.android.foo.key",
11642 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11643 updatable: false,
11644 }
11645
11646 // Prebuilt APEX.
11647
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011648 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011649 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011650 public: {
11651 jars: ["foo.jar"],
11652 },
Spandan Das5be63332023-12-13 00:06:32 +000011653 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011654 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011655 }
11656
11657 prebuilt_bootclasspath_fragment {
11658 name: "foo-bootclasspath-fragment",
11659 contents: ["framework-foo"],
11660 hidden_api: {
11661 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11662 metadata: "my-bootclasspath-fragment/metadata.csv",
11663 index: "my-bootclasspath-fragment/index.csv",
11664 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11665 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11666 },
11667 apex_available: [
11668 "com.android.foo",
11669 ],
11670 }
11671
11672 prebuilt_apex {
11673 name: "com.android.foo",
11674 apex_name: "com.android.foo",
11675 src: "com.android.foo-arm.apex",
11676 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11677 }
11678
11679 // Another Prebuilt ART APEX
11680 prebuilt_apex {
11681 name: "com.android.foo.v2",
11682 apex_name: "com.android.foo", // Used to determine the API domain
11683 src: "com.android.foo-arm.apex",
11684 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11685 }
11686
11687 // APEX contribution modules
11688
11689 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011690 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011691 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011692 contents: ["com.android.foo"],
11693 }
11694
11695 apex_contributions {
11696 name: "foo.prebuilt.contributions",
11697 api_domain: "com.android.foo",
11698 contents: ["prebuilt_com.android.foo"],
11699 }
11700
11701 apex_contributions {
11702 name: "foo.prebuilt.v2.contributions",
11703 api_domain: "com.android.foo",
11704 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011705 }
11706 `
11707
11708 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011709 desc string
11710 selectedApexContributions string
11711 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011712 }{
11713 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011714 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11715 selectedApexContributions: "foo.source.contributions",
11716 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011717 },
11718 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011719 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11720 selectedApexContributions: "foo.prebuilt.contributions",
11721 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011722 },
11723 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011724 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11725 selectedApexContributions: "foo.prebuilt.v2.contributions",
11726 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011727 },
11728 }
11729
11730 fragment := java.ApexVariantReference{
11731 Apex: proptools.StringPtr("com.android.foo"),
11732 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11733 }
11734
11735 for _, tc := range testCases {
11736 preparer := android.GroupFixturePreparers(
11737 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11738 android.FixtureMergeMockFs(map[string][]byte{
11739 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11740 }),
11741 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11742 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011743 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011744 }
11745 }),
11746 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011747 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011748 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011749 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11750 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011751 }
11752}
Spandan Das3576e762024-01-03 18:57:03 +000011753
11754// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11755// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11756func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11757 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11758 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11759 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11760 // Variations are created based on apex_name
11761 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11762 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11763 }
11764 // for a mainline module family, check that only the flagged soong module is visible to make
11765 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11766 variation := func(moduleName string) string {
11767 ret := "android_common_com.android.foo"
11768 if moduleName == "com.google.android.foo" {
11769 ret = "android_common_com.google.android.foo_com.android.foo"
11770 }
11771 return ret
11772 }
11773
11774 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11775 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11776
11777 for _, hiddenModuleName := range hiddenModuleNames {
11778 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11779 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11780
11781 }
11782 }
11783
11784 bp := `
11785 apex_key {
11786 name: "com.android.foo.key",
11787 public_key: "com.android.foo.avbpubkey",
11788 private_key: "com.android.foo.pem",
11789 }
11790
11791 // AOSP source apex
11792 apex {
11793 name: "com.android.foo",
11794 key: "com.android.foo.key",
11795 updatable: false,
11796 }
11797
11798 // Google source apex
11799 override_apex {
11800 name: "com.google.android.foo",
11801 base: "com.android.foo",
11802 key: "com.android.foo.key",
11803 }
11804
11805 // Prebuilt Google APEX.
11806
11807 prebuilt_apex {
11808 name: "com.google.android.foo",
11809 apex_name: "com.android.foo",
11810 src: "com.android.foo-arm.apex",
11811 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11812 }
11813
11814 // Another Prebuilt Google APEX
11815 prebuilt_apex {
11816 name: "com.google.android.foo.v2",
11817 apex_name: "com.android.foo",
11818 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11819 src: "com.android.foo-arm.apex",
11820 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11821 }
11822
11823 // APEX contribution modules
11824
11825 apex_contributions {
11826 name: "foo.source.contributions",
11827 api_domain: "com.android.foo",
11828 contents: ["com.google.android.foo"],
11829 }
11830
11831 apex_contributions {
11832 name: "foo.prebuilt.contributions",
11833 api_domain: "com.android.foo",
11834 contents: ["prebuilt_com.google.android.foo"],
11835 }
11836
11837 apex_contributions {
11838 name: "foo.prebuilt.v2.contributions",
11839 api_domain: "com.android.foo",
11840 contents: ["prebuilt_com.google.android.foo.v2"],
11841 }
11842
11843 // This is an incompatible module because it selects multiple versions of the same mainline module
11844 apex_contributions {
11845 name: "foo.prebuilt.duplicate.contributions",
11846 api_domain: "com.android.foo",
11847 contents: [
11848 "prebuilt_com.google.android.foo",
11849 "prebuilt_com.google.android.foo.v2",
11850 ],
11851 }
11852 `
11853
11854 testCases := []struct {
11855 desc string
11856 selectedApexContributions string
11857 expectedVisibleModuleName string
11858 expectedHiddenModuleNames []string
11859 expectedError string
11860 }{
11861 {
11862 desc: "Source apex is selected, prebuilts should be hidden from make",
11863 selectedApexContributions: "foo.source.contributions",
11864 expectedVisibleModuleName: "com.google.android.foo",
11865 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11866 },
11867 {
11868 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11869 selectedApexContributions: "foo.prebuilt.contributions",
11870 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11871 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11872 },
11873 {
11874 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11875 selectedApexContributions: "foo.prebuilt.v2.contributions",
11876 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11877 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11878 },
11879 {
11880 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11881 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11882 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11883 },
11884 }
11885
11886 for _, tc := range testCases {
11887 preparer := android.GroupFixturePreparers(
11888 android.FixtureMergeMockFs(map[string][]byte{
11889 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11890 }),
11891 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11892 variables.BuildFlags = map[string]string{
11893 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11894 }
11895 }),
11896 )
11897 if tc.expectedError != "" {
11898 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11899 testApex(t, bp, preparer)
11900 return
11901 }
11902 ctx := testApex(t, bp, preparer)
11903
11904 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11905 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11906 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11907 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11908
11909 // Check that
11910 // 1. The contents of the selected apex_contributions are visible to make
11911 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11912 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11913 }
11914}