blob: 7e67c0f9da54d4756b84644380f82a34671119f9 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
221 variables.DeviceVndkVersion = proptools.StringPtr("current")
222 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
223 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
224 variables.Platform_sdk_codename = proptools.StringPtr("Q")
225 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000226 // "Tiramisu" needs to be in the next line for compatibility with soong code,
227 // not because of these tests specifically (it's not used by the tests)
228 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900229 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000230 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000231 }),
232)
233
Paul Duffin52bfaa42021-03-23 23:40:12 +0000234var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
235 "system/sepolicy/apex/myapex-file_contexts": nil,
236})
237
Jooyung Han643adc42020-02-27 13:50:06 +0900238// ensure that 'result' equals 'expected'
239func ensureEquals(t *testing.T, result string, expected string) {
240 t.Helper()
241 if result != expected {
242 t.Errorf("%q != %q", expected, result)
243 }
244}
245
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246// ensure that 'result' contains 'expected'
247func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900248 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if !strings.Contains(result, expected) {
250 t.Errorf("%q is not found in %q", expected, result)
251 }
252}
253
Liz Kammer5bd365f2020-05-27 15:15:11 -0700254// ensure that 'result' contains 'expected' exactly one time
255func ensureContainsOnce(t *testing.T, result string, expected string) {
256 t.Helper()
257 count := strings.Count(result, expected)
258 if count != 1 {
259 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
260 }
261}
262
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263// ensures that 'result' does not contain 'notExpected'
264func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900265 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266 if strings.Contains(result, notExpected) {
267 t.Errorf("%q is found in %q", notExpected, result)
268 }
269}
270
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271func ensureMatches(t *testing.T, result string, expectedRex string) {
272 ok, err := regexp.MatchString(expectedRex, result)
273 if err != nil {
274 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
275 return
276 }
277 if !ok {
278 t.Errorf("%s does not match regular expession %s", result, expectedRex)
279 }
280}
281
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900283 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284 if !android.InList(expected, result) {
285 t.Errorf("%q is not found in %v", expected, result)
286 }
287}
288
289func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if android.InList(notExpected, result) {
292 t.Errorf("%q is found in %v", notExpected, result)
293 }
294}
295
Jooyung Hane1633032019-08-01 17:41:43 +0900296func ensureListEmpty(t *testing.T, result []string) {
297 t.Helper()
298 if len(result) > 0 {
299 t.Errorf("%q is expected to be empty", result)
300 }
301}
302
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000303func ensureListNotEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) == 0 {
306 t.Errorf("%q is expected to be not empty", result)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310// Minimal test
311func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800312 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900313 apex_defaults {
314 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900315 manifest: ":myapex.manifest",
316 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900318 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900319 native_shared_libs: [
320 "mylib",
321 "libfoo.ffi",
322 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900323 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800324 multilib: {
325 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900326 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800327 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900328 },
Jiyong Park77acec62020-06-01 21:39:15 +0900329 java_libs: [
330 "myjar",
331 "myjar_dex",
332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000333 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 shared_libs: [
361 "mylib2",
362 "libbar.ffi",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 system_shared_libs: [],
365 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000366 // TODO: remove //apex_available:platform
367 apex_available: [
368 "//apex_available:platform",
369 "myapex",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 }
372
Alex Light3d673592019-01-18 14:37:31 -0800373 cc_binary {
374 name: "foo",
375 srcs: ["mylib.cpp"],
376 compile_multilib: "both",
377 multilib: {
378 lib32: {
379 suffix: "32",
380 },
381 lib64: {
382 suffix: "64",
383 },
384 },
385 symlinks: ["foo_link_"],
386 symlink_preferred_arch: true,
387 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800388 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700389 apex_available: [ "myapex", "com.android.gki.*" ],
390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400396 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900405 shared_libs: ["libfoo.shared_from_rust"],
406 }
407
408 cc_library_shared {
409 name: "libfoo.shared_from_rust",
410 srcs: ["mylib.cpp"],
411 system_shared_libs: [],
412 stl: "none",
413 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900414 }
415
416 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000417 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900423 rust_ffi_shared {
424 name: "libfoo.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
430 rust_ffi_shared {
431 name: "libbar.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "bar",
434 apex_available: ["myapex"],
435 }
436
Yifan Hongd22a84a2020-07-28 17:37:46 -0700437 apex {
438 name: "com.android.gki.fake",
439 binaries: ["foo"],
440 key: "myapex.key",
441 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000442 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800443 }
444
Paul Duffindddd5462020-04-07 15:25:44 +0100445 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900446 name: "mylib2",
447 srcs: ["mylib.cpp"],
448 system_shared_libs: [],
449 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900450 static_libs: ["libstatic"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Paul Duffindddd5462020-04-07 15:25:44 +0100458 cc_prebuilt_library_shared {
459 name: "mylib2",
460 srcs: ["prebuilt.so"],
461 // TODO: remove //apex_available:platform
462 apex_available: [
463 "//apex_available:platform",
464 "myapex",
465 ],
466 }
467
Jiyong Park9918e1a2020-03-17 19:16:40 +0900468 cc_library_static {
469 name: "libstatic",
470 srcs: ["mylib.cpp"],
471 system_shared_libs: [],
472 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479
480 java_library {
481 name: "myjar",
482 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900483 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 sdk_version: "none",
485 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900487 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900493 }
494
Jiyong Park77acec62020-06-01 21:39:15 +0900495 dex_import {
496 name: "myjar_dex",
497 jars: ["prebuilt.jar"],
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
502 }
503
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 java_library {
505 name: "myotherjar",
506 srcs: ["foo/bar/MyClass.java"],
507 sdk_version: "none",
508 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900509 // TODO: remove //apex_available:platform
510 apex_available: [
511 "//apex_available:platform",
512 "myapex",
513 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900515
516 java_library {
517 name: "mysharedjar",
518 srcs: ["foo/bar/MyClass.java"],
519 sdk_version: "none",
520 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900521 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900522 `)
523
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900525
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900527 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700528 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900529 var builder strings.Builder
530 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
531
532 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000533 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
535
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536 optFlags := apexRule.Args["opt_flags"]
537 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700538 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900539 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900540
Jiyong Park25fc6a92018-11-18 18:02:45 +0900541 copyCmds := apexRule.Args["copy_commands"]
542
543 // Ensure that main rule creates an output
544 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
545
546 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700554 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560
561 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900565 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
568 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900569 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 // .. but not for java libs
571 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800573
Colin Cross7113d202019-11-20 16:39:12 -0800574 // Ensure that the platform variant ends with _shared or _common
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
576 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
578 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
580
581 // Ensure that dynamic dependency to java libs are not included
582 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800583
584 // Ensure that all symlinks are present.
585 found_foo_link_64 := false
586 found_foo := false
587 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900588 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800589 if strings.HasSuffix(cmd, "bin/foo") {
590 found_foo = true
591 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
592 found_foo_link_64 = true
593 }
594 }
595 }
596 good := found_foo && found_foo_link_64
597 if !good {
598 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
599 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900600
Colin Crossf61d03d2023-11-02 16:56:39 -0700601 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
602 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
605 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
606 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800626 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800680 name: "netdTest",
681 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900686 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000690 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800694 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
Jooyung Hana0503a52023-08-23 13:12:50 +0900713 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Jooyung Hanaf730952023-02-28 14:13:38 +0900793func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900794 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900796 if vendor {
797 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 }
799 ctx := testApex(t, `
800 apex {
801 name: "myapex",
802 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900803 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900804 `+prop+`
805 }
806
807 apex_key {
808 name: "myapex.key",
809 public_key: "testkey.avbpubkey",
810 private_key: "testkey.pem",
811 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900813
Jooyung Hana0503a52023-08-23 13:12:50 +0900814 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 if vendor {
816 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
817 rule.RuleParams.Command,
818 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900819 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900820 android.AssertStringDoesContain(t, "should force-label as system_file",
821 rule.RuleParams.Command,
822 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900823 }
824 }
825}
826
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800828 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829 apex {
830 name: "myapex",
831 key: "myapex.key",
832 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900833 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000834 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 }
836
837 apex_key {
838 name: "myapex.key",
839 public_key: "testkey.avbpubkey",
840 private_key: "testkey.pem",
841 }
842
843 cc_library {
844 name: "mylib",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["mylib2", "mylib3"],
847 system_shared_libs: [],
848 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000849 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
851
852 cc_library {
853 name: "mylib2",
854 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900855 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900856 system_shared_libs: [],
857 stl: "none",
858 stubs: {
859 versions: ["1", "2", "3"],
860 },
861 }
862
863 cc_library {
864 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900865 srcs: ["mylib.cpp"],
866 shared_libs: ["mylib4"],
867 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 stl: "none",
869 stubs: {
870 versions: ["10", "11", "12"],
871 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000872 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900874
875 cc_library {
876 name: "mylib4",
877 srcs: ["mylib.cpp"],
878 system_shared_libs: [],
879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000880 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900881 }
Jiyong Park105dc322021-06-11 17:22:09 +0900882
883 rust_binary {
884 name: "foo.rust",
885 srcs: ["foo.rs"],
886 shared_libs: ["libfoo.shared_from_rust"],
887 prefer_rlib: true,
888 apex_available: ["myapex"],
889 }
890
891 cc_library_shared {
892 name: "libfoo.shared_from_rust",
893 srcs: ["mylib.cpp"],
894 system_shared_libs: [],
895 stl: "none",
896 stubs: {
897 versions: ["10", "11", "12"],
898 },
899 }
900
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 `)
902
Jooyung Hana0503a52023-08-23 13:12:50 +0900903 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 copyCmds := apexRule.Args["copy_commands"]
905
906 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800913 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914
Colin Crossaede88c2020-08-11 12:17:01 -0700915 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900918 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900920 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700923 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700925 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900926
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700927 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
928 // is replaced by sharing of "cFlags" in cc/builder.go.
929 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
930 // module variable representing "cflags". So it was not detected by ensureNotContains.
931 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
932 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
933 // including the original cflags's "-include mylib.h".
934 //
Jiyong Park64379952018-12-13 18:37:29 +0900935 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700936 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
937 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900938
Jiyong Park85cc35a2022-07-17 11:30:47 +0900939 // Ensure that genstub for platform-provided lib is invoked with --systemapi
940 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
941 // Ensure that genstub for apex-provided lib is invoked with --apex
942 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900943
Jooyung Hana0503a52023-08-23 13:12:50 +0900944 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900945 "lib64/mylib.so",
946 "lib64/mylib3.so",
947 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900948 "bin/foo.rust",
949 "lib64/libc++.so", // by the implicit dependency from foo.rust
950 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900951 })
Jiyong Park105dc322021-06-11 17:22:09 +0900952
953 // Ensure that stub dependency from a rust module is not included
954 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
955 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700956 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900957 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
958 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900959
Jooyung Hana0503a52023-08-23 13:12:50 +0900960 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900961 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962}
963
Jooyung Han20348752023-12-05 15:23:56 +0900964func TestApexShouldNotEmbedStubVariant(t *testing.T) {
965 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
966 apex {
967 name: "myapex",
968 key: "myapex.key",
969 vendor: true,
970 updatable: false,
971 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 cc_library {
981 name: "libbar",
982 srcs: ["mylib.cpp"],
983 llndk: {
984 symbol_file: "libbar.map.txt",
985 }
986 }
987 `)
988}
989
Jiyong Park1bc84122021-06-22 20:23:05 +0900990func TestApexCanUsePrivateApis(t *testing.T) {
991 ctx := testApex(t, `
992 apex {
993 name: "myapex",
994 key: "myapex.key",
995 native_shared_libs: ["mylib"],
996 binaries: ["foo.rust"],
997 updatable: false,
998 platform_apis: true,
999 }
1000
1001 apex_key {
1002 name: "myapex.key",
1003 public_key: "testkey.avbpubkey",
1004 private_key: "testkey.pem",
1005 }
1006
1007 cc_library {
1008 name: "mylib",
1009 srcs: ["mylib.cpp"],
1010 shared_libs: ["mylib2"],
1011 system_shared_libs: [],
1012 stl: "none",
1013 apex_available: [ "myapex" ],
1014 }
1015
1016 cc_library {
1017 name: "mylib2",
1018 srcs: ["mylib.cpp"],
1019 cflags: ["-include mylib.h"],
1020 system_shared_libs: [],
1021 stl: "none",
1022 stubs: {
1023 versions: ["1", "2", "3"],
1024 },
1025 }
1026
1027 rust_binary {
1028 name: "foo.rust",
1029 srcs: ["foo.rs"],
1030 shared_libs: ["libfoo.shared_from_rust"],
1031 prefer_rlib: true,
1032 apex_available: ["myapex"],
1033 }
1034
1035 cc_library_shared {
1036 name: "libfoo.shared_from_rust",
1037 srcs: ["mylib.cpp"],
1038 system_shared_libs: [],
1039 stl: "none",
1040 stubs: {
1041 versions: ["10", "11", "12"],
1042 },
1043 }
1044 `)
1045
Jooyung Hana0503a52023-08-23 13:12:50 +09001046 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001047 copyCmds := apexRule.Args["copy_commands"]
1048
1049 // Ensure that indirect stubs dep is not included
1050 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1051 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1052
1053 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1054 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001056 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1057 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001058 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001059 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1060 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1061}
1062
Colin Cross7812fd32020-09-25 12:35:10 -07001063func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1064 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001065 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001066 apex {
1067 name: "myapex",
1068 key: "myapex.key",
1069 native_shared_libs: ["mylib", "mylib3"],
1070 min_sdk_version: "29",
1071 }
1072
1073 apex_key {
1074 name: "myapex.key",
1075 public_key: "testkey.avbpubkey",
1076 private_key: "testkey.pem",
1077 }
1078
1079 cc_library {
1080 name: "mylib",
1081 srcs: ["mylib.cpp"],
1082 shared_libs: ["mylib2", "mylib3"],
1083 system_shared_libs: [],
1084 stl: "none",
1085 apex_available: [ "myapex" ],
1086 min_sdk_version: "28",
1087 }
1088
1089 cc_library {
1090 name: "mylib2",
1091 srcs: ["mylib.cpp"],
1092 cflags: ["-include mylib.h"],
1093 system_shared_libs: [],
1094 stl: "none",
1095 stubs: {
1096 versions: ["28", "29", "30", "current"],
1097 },
1098 min_sdk_version: "28",
1099 }
1100
1101 cc_library {
1102 name: "mylib3",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib4"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 stubs: {
1108 versions: ["28", "29", "30", "current"],
1109 },
1110 apex_available: [ "myapex" ],
1111 min_sdk_version: "28",
1112 }
1113
1114 cc_library {
1115 name: "mylib4",
1116 srcs: ["mylib.cpp"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex" ],
1120 min_sdk_version: "28",
1121 }
1122 `)
1123
Jooyung Hana0503a52023-08-23 13:12:50 +09001124 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 copyCmds := apexRule.Args["copy_commands"]
1126
1127 // Ensure that direct non-stubs dep is always included
1128 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1129
1130 // Ensure that indirect stubs dep is not included
1131 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1132
1133 // Ensure that direct stubs dep is included
1134 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1135
1136 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1137
Jiyong Park55549df2021-02-26 23:57:23 +09001138 // Ensure that mylib is linking with the latest version of stub for mylib2
1139 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001140 // ... and not linking to the non-stub (impl) variant of mylib2
1141 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1142
1143 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1144 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1145 // .. and not linking to the stubs variant of mylib3
1146 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1147
1148 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001149 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001150 ensureNotContains(t, mylib2Cflags, "-include ")
1151
Jiyong Park85cc35a2022-07-17 11:30:47 +09001152 // Ensure that genstub is invoked with --systemapi
1153 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001154
Jooyung Hana0503a52023-08-23 13:12:50 +09001155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001156 "lib64/mylib.so",
1157 "lib64/mylib3.so",
1158 "lib64/mylib4.so",
1159 })
1160}
1161
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001162func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1163 t.Parallel()
1164 // myapex (Z)
1165 // mylib -----------------.
1166 // |
1167 // otherapex (29) |
1168 // libstub's versions: 29 Z current
1169 // |
1170 // <platform> |
1171 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001172 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001173 apex {
1174 name: "myapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["mylib"],
1177 min_sdk_version: "Z", // non-final
1178 }
1179
1180 cc_library {
1181 name: "mylib",
1182 srcs: ["mylib.cpp"],
1183 shared_libs: ["libstub"],
1184 apex_available: ["myapex"],
1185 min_sdk_version: "Z",
1186 }
1187
1188 apex_key {
1189 name: "myapex.key",
1190 public_key: "testkey.avbpubkey",
1191 private_key: "testkey.pem",
1192 }
1193
1194 apex {
1195 name: "otherapex",
1196 key: "myapex.key",
1197 native_shared_libs: ["libstub"],
1198 min_sdk_version: "29",
1199 }
1200
1201 cc_library {
1202 name: "libstub",
1203 srcs: ["mylib.cpp"],
1204 stubs: {
1205 versions: ["29", "Z", "current"],
1206 },
1207 apex_available: ["otherapex"],
1208 min_sdk_version: "29",
1209 }
1210
1211 // platform module depending on libstub from otherapex should use the latest stub("current")
1212 cc_library {
1213 name: "libplatform",
1214 srcs: ["mylib.cpp"],
1215 shared_libs: ["libstub"],
1216 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001217 `,
1218 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1219 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1220 variables.Platform_sdk_final = proptools.BoolPtr(false)
1221 variables.Platform_version_active_codenames = []string{"Z"}
1222 }),
1223 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001224
Jiyong Park55549df2021-02-26 23:57:23 +09001225 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001226 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001227 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001228 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001229 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001230
1231 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1232 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1233 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1234 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1235 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1236}
1237
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001238func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001239 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001240 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001241 name: "myapex2",
1242 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001244 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001248 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001249 public_key: "testkey.avbpubkey",
1250 private_key: "testkey.pem",
1251 }
1252
1253 cc_library {
1254 name: "mylib",
1255 srcs: ["mylib.cpp"],
1256 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001257 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 system_shared_libs: [],
1259 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001260 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 }
1262
1263 cc_library {
1264 name: "libfoo",
1265 srcs: ["mylib.cpp"],
1266 shared_libs: ["libbar"],
1267 system_shared_libs: [],
1268 stl: "none",
1269 stubs: {
1270 versions: ["10", "20", "30"],
1271 },
1272 }
1273
1274 cc_library {
1275 name: "libbar",
1276 srcs: ["mylib.cpp"],
1277 system_shared_libs: [],
1278 stl: "none",
1279 }
1280
Jiyong Park678c8812020-02-07 17:25:49 +09001281 cc_library_static {
1282 name: "libbaz",
1283 srcs: ["mylib.cpp"],
1284 system_shared_libs: [],
1285 stl: "none",
1286 apex_available: [ "myapex2" ],
1287 }
1288
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289 `)
1290
Jooyung Hana0503a52023-08-23 13:12:50 +09001291 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 copyCmds := apexRule.Args["copy_commands"]
1293
1294 // Ensure that direct non-stubs dep is always included
1295 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1296
1297 // Ensure that indirect stubs dep is not included
1298 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1299
1300 // Ensure that dependency of stubs is not included
1301 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1302
Colin Crossaede88c2020-08-11 12:17:01 -07001303 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304
1305 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001306 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001307 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001308 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309
Jiyong Park3ff16992019-12-27 14:11:47 +09001310 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311
1312 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1313 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314
Colin Crossf61d03d2023-11-02 16:56:39 -07001315 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1316 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001317 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001318
Colin Crossf61d03d2023-11-02 16:56:39 -07001319 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1320 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001321 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001322}
1323
Jooyung Hand3639552019-08-09 12:57:43 +09001324func TestApexWithRuntimeLibsDependency(t *testing.T) {
1325 /*
1326 myapex
1327 |
1328 v (runtime_libs)
1329 mylib ------+------> libfoo [provides stub]
1330 |
1331 `------> libbar
1332 */
Colin Cross1c460562021-02-16 17:55:47 -08001333 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001334 apex {
1335 name: "myapex",
1336 key: "myapex.key",
1337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001338 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001339 }
1340
1341 apex_key {
1342 name: "myapex.key",
1343 public_key: "testkey.avbpubkey",
1344 private_key: "testkey.pem",
1345 }
1346
1347 cc_library {
1348 name: "mylib",
1349 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001350 static_libs: ["libstatic"],
1351 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001352 runtime_libs: ["libfoo", "libbar"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 cc_library {
1359 name: "libfoo",
1360 srcs: ["mylib.cpp"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 stubs: {
1364 versions: ["10", "20", "30"],
1365 },
1366 }
1367
1368 cc_library {
1369 name: "libbar",
1370 srcs: ["mylib.cpp"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
Liz Kammer5f108fa2023-05-11 14:33:17 -04001376 cc_library {
1377 name: "libstatic",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
1382 runtime_libs: ["libstatic_to_runtime"],
1383 }
1384
1385 cc_library {
1386 name: "libshared",
1387 srcs: ["mylib.cpp"],
1388 system_shared_libs: [],
1389 stl: "none",
1390 apex_available: [ "myapex" ],
1391 runtime_libs: ["libshared_to_runtime"],
1392 }
1393
1394 cc_library {
1395 name: "libstatic_to_runtime",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 }
1401
1402 cc_library {
1403 name: "libshared_to_runtime",
1404 srcs: ["mylib.cpp"],
1405 system_shared_libs: [],
1406 stl: "none",
1407 apex_available: [ "myapex" ],
1408 }
Jooyung Hand3639552019-08-09 12:57:43 +09001409 `)
1410
Jooyung Hana0503a52023-08-23 13:12:50 +09001411 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001412 copyCmds := apexRule.Args["copy_commands"]
1413
1414 // Ensure that direct non-stubs dep is always included
1415 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1416
1417 // Ensure that indirect stubs dep is not included
1418 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1419
1420 // Ensure that runtime_libs dep in included
1421 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001422 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1423 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1424
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001426
Jooyung Hana0503a52023-08-23 13:12:50 +09001427 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001428 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1429 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001430}
1431
Paul Duffina02cae32021-03-09 01:44:06 +00001432var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1433 cc.PrepareForTestWithCcBuildComponents,
1434 PrepareForTestWithApexBuildComponents,
1435 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 apex {
1437 name: "com.android.runtime",
1438 key: "com.android.runtime.key",
1439 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001440 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001441 }
1442
1443 apex_key {
1444 name: "com.android.runtime.key",
1445 public_key: "testkey.avbpubkey",
1446 private_key: "testkey.pem",
1447 }
Paul Duffina02cae32021-03-09 01:44:06 +00001448 `),
1449 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1450)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451
Paul Duffina02cae32021-03-09 01:44:06 +00001452func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001453 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 cc_library {
1455 name: "libc",
1456 no_libcrt: true,
1457 nocrt: true,
1458 stl: "none",
1459 system_shared_libs: [],
1460 stubs: { versions: ["1"] },
1461 apex_available: ["com.android.runtime"],
1462
1463 sanitize: {
1464 hwaddress: true,
1465 }
1466 }
1467
1468 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001469 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001470 no_libcrt: true,
1471 nocrt: true,
1472 stl: "none",
1473 system_shared_libs: [],
1474 srcs: [""],
1475 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001476 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001477
1478 sanitize: {
1479 never: true,
1480 },
Spandan Das4de7b492023-05-05 21:13:01 +00001481 apex_available: [
1482 "//apex_available:anyapex",
1483 "//apex_available:platform",
1484 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001485 } `)
1486 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001487
Jooyung Hana0503a52023-08-23 13:12:50 +09001488 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489 "lib64/bionic/libc.so",
1490 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1491 })
1492
Colin Cross4c4c1be2022-02-10 11:41:18 -08001493 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001494
1495 installed := hwasan.Description("install libclang_rt.hwasan")
1496 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1497
1498 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1499 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1500 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1501}
1502
1503func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001504 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001505 prepareForTestOfRuntimeApexWithHwasan,
1506 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1507 variables.SanitizeDevice = []string{"hwaddress"}
1508 }),
1509 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001510 cc_library {
1511 name: "libc",
1512 no_libcrt: true,
1513 nocrt: true,
1514 stl: "none",
1515 system_shared_libs: [],
1516 stubs: { versions: ["1"] },
1517 apex_available: ["com.android.runtime"],
1518 }
1519
1520 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001521 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522 no_libcrt: true,
1523 nocrt: true,
1524 stl: "none",
1525 system_shared_libs: [],
1526 srcs: [""],
1527 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001528 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001529
1530 sanitize: {
1531 never: true,
1532 },
Spandan Das4de7b492023-05-05 21:13:01 +00001533 apex_available: [
1534 "//apex_available:anyapex",
1535 "//apex_available:platform",
1536 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001537 }
Paul Duffina02cae32021-03-09 01:44:06 +00001538 `)
1539 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540
Jooyung Hana0503a52023-08-23 13:12:50 +09001541 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542 "lib64/bionic/libc.so",
1543 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1544 })
1545
Colin Cross4c4c1be2022-02-10 11:41:18 -08001546 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547
1548 installed := hwasan.Description("install libclang_rt.hwasan")
1549 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1550
1551 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1552 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1553 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1554}
1555
Jooyung Han61b66e92020-03-21 14:21:46 +00001556func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1557 testcases := []struct {
1558 name string
1559 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001560 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 shouldLink string
1562 shouldNotLink []string
1563 }{
1564 {
Jiyong Park55549df2021-02-26 23:57:23 +09001565 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001566 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001567 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001568 shouldLink: "current",
1569 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 },
1571 {
Jiyong Park55549df2021-02-26 23:57:23 +09001572 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001573 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001574 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001575 shouldLink: "current",
1576 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001577 },
1578 }
1579 for _, tc := range testcases {
1580 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001581 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001582 apex {
1583 name: "myapex",
1584 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001585 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001586 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001587 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001588 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001589
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 apex_key {
1591 name: "myapex.key",
1592 public_key: "testkey.avbpubkey",
1593 private_key: "testkey.pem",
1594 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001595
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 cc_library {
1597 name: "mylib",
1598 srcs: ["mylib.cpp"],
1599 vendor_available: true,
1600 shared_libs: ["libbar"],
1601 system_shared_libs: [],
1602 stl: "none",
1603 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001604 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001605 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001606
Jooyung Han61b66e92020-03-21 14:21:46 +00001607 cc_library {
1608 name: "libbar",
1609 srcs: ["mylib.cpp"],
1610 system_shared_libs: [],
1611 stl: "none",
1612 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001613 llndk: {
1614 symbol_file: "libbar.map.txt",
1615 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001616 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001617 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001618 withUnbundledBuild,
1619 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001620
Jooyung Han61b66e92020-03-21 14:21:46 +00001621 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001622 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001623 "lib64/mylib.so",
1624 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001625
Jooyung Han61b66e92020-03-21 14:21:46 +00001626 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001627 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001628 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1629 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001630
Steven Moreland2c4000c2021-04-27 02:08:49 +00001631 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1632 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001633 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001634 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001635 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001636
Steven Moreland2c4000c2021-04-27 02:08:49 +00001637 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001638 ver := tc.shouldLink
1639 if tc.shouldLink == "current" {
1640 ver = strconv.Itoa(android.FutureApiLevelInt)
1641 }
1642 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001643 })
1644 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001645}
1646
Jiyong Park25fc6a92018-11-18 18:02:45 +09001647func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001648 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001649 apex {
1650 name: "myapex",
1651 key: "myapex.key",
1652 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001653 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 }
1655
1656 apex_key {
1657 name: "myapex.key",
1658 public_key: "testkey.avbpubkey",
1659 private_key: "testkey.pem",
1660 }
1661
1662 cc_library {
1663 name: "mylib",
1664 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001665 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666 shared_libs: ["libdl#27"],
1667 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001668 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001669 }
1670
1671 cc_library_shared {
1672 name: "mylib_shared",
1673 srcs: ["mylib.cpp"],
1674 shared_libs: ["libdl#27"],
1675 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001676 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001677 }
1678
1679 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001680 name: "libBootstrap",
1681 srcs: ["mylib.cpp"],
1682 stl: "none",
1683 bootstrap: true,
1684 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685 `)
1686
Jooyung Hana0503a52023-08-23 13:12:50 +09001687 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001688 copyCmds := apexRule.Args["copy_commands"]
1689
1690 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001691 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001692 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1693 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001694
1695 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001696 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697
Colin Crossaede88c2020-08-11 12:17:01 -07001698 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1699 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1700 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701
1702 // For dependency to libc
1703 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001704 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001705 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001706 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001707 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1709 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710
1711 // For dependency to libm
1712 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001713 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001715 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001716 // ... and is not compiling with the stub
1717 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1718 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1719
1720 // For dependency to libdl
1721 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001722 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001723 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001724 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1725 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001726 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001727 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001728 // ... Cflags from stub is correctly exported to mylib
1729 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1730 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001731
1732 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001733 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1734 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1735 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1736 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001737}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001738
Jooyung Han749dc692020-04-15 11:03:39 +09001739func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001740 // there are three links between liba --> libz.
1741 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001742 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001743 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001744 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001745 apex {
1746 name: "myapex",
1747 key: "myapex.key",
1748 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001749 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001750 }
1751
1752 apex {
1753 name: "otherapex",
1754 key: "myapex.key",
1755 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001756 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001757 }
1758
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764
1765 cc_library {
1766 name: "libx",
1767 shared_libs: ["liba"],
1768 system_shared_libs: [],
1769 stl: "none",
1770 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001771 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001772 }
1773
1774 cc_library {
1775 name: "liby",
1776 shared_libs: ["liba"],
1777 system_shared_libs: [],
1778 stl: "none",
1779 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001780 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001781 }
1782
1783 cc_library {
1784 name: "liba",
1785 shared_libs: ["libz"],
1786 system_shared_libs: [],
1787 stl: "none",
1788 apex_available: [
1789 "//apex_available:anyapex",
1790 "//apex_available:platform",
1791 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001792 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001793 }
1794
1795 cc_library {
1796 name: "libz",
1797 system_shared_libs: [],
1798 stl: "none",
1799 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001800 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001801 },
1802 }
Jooyung Han749dc692020-04-15 11:03:39 +09001803 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001804
1805 expectLink := func(from, from_variant, to, to_variant string) {
1806 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1807 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1808 }
1809 expectNoLink := func(from, from_variant, to, to_variant string) {
1810 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1811 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1812 }
1813 // platform liba is linked to non-stub version
1814 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001815 // liba in myapex is linked to current
1816 expectLink("liba", "shared_apex29", "libz", "shared_current")
1817 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001818 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001819 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001820 // liba in otherapex is linked to current
1821 expectLink("liba", "shared_apex30", "libz", "shared_current")
1822 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001823 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1824 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001825}
1826
Jooyung Hanaed150d2020-04-02 01:41:41 +09001827func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001828 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001829 apex {
1830 name: "myapex",
1831 key: "myapex.key",
1832 native_shared_libs: ["libx"],
1833 min_sdk_version: "R",
1834 }
1835
1836 apex_key {
1837 name: "myapex.key",
1838 public_key: "testkey.avbpubkey",
1839 private_key: "testkey.pem",
1840 }
1841
1842 cc_library {
1843 name: "libx",
1844 shared_libs: ["libz"],
1845 system_shared_libs: [],
1846 stl: "none",
1847 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001848 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001849 }
1850
1851 cc_library {
1852 name: "libz",
1853 system_shared_libs: [],
1854 stl: "none",
1855 stubs: {
1856 versions: ["29", "R"],
1857 },
1858 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001859 `,
1860 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1861 variables.Platform_version_active_codenames = []string{"R"}
1862 }),
1863 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001864
1865 expectLink := func(from, from_variant, to, to_variant string) {
1866 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1867 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1868 }
1869 expectNoLink := func(from, from_variant, to, to_variant string) {
1870 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1871 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1872 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001873 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1874 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001875 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1876 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001877}
1878
Jooyung Han4c4da062021-06-23 10:23:16 +09001879func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1880 testApex(t, `
1881 apex {
1882 name: "myapex",
1883 key: "myapex.key",
1884 java_libs: ["libx"],
1885 min_sdk_version: "S",
1886 }
1887
1888 apex_key {
1889 name: "myapex.key",
1890 public_key: "testkey.avbpubkey",
1891 private_key: "testkey.pem",
1892 }
1893
1894 java_library {
1895 name: "libx",
1896 srcs: ["a.java"],
1897 apex_available: [ "myapex" ],
1898 sdk_version: "current",
1899 min_sdk_version: "S", // should be okay
1900 }
1901 `,
1902 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1903 variables.Platform_version_active_codenames = []string{"S"}
1904 variables.Platform_sdk_codename = proptools.StringPtr("S")
1905 }),
1906 )
1907}
1908
Jooyung Han749dc692020-04-15 11:03:39 +09001909func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001910 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001911 apex {
1912 name: "myapex",
1913 key: "myapex.key",
1914 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001915 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001916 }
1917
1918 apex_key {
1919 name: "myapex.key",
1920 public_key: "testkey.avbpubkey",
1921 private_key: "testkey.pem",
1922 }
1923
1924 cc_library {
1925 name: "libx",
1926 shared_libs: ["libz"],
1927 system_shared_libs: [],
1928 stl: "none",
1929 apex_available: [ "myapex" ],
1930 }
1931
1932 cc_library {
1933 name: "libz",
1934 system_shared_libs: [],
1935 stl: "none",
1936 stubs: {
1937 versions: ["1", "2"],
1938 },
1939 }
1940 `)
1941
1942 expectLink := func(from, from_variant, to, to_variant string) {
1943 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1944 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1945 }
1946 expectNoLink := func(from, from_variant, to, to_variant string) {
1947 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1948 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1949 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001950 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001951 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001952 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001954}
1955
Jooyung Handfc864c2023-03-20 18:19:07 +09001956func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001957 ctx := testApex(t, `
1958 apex {
1959 name: "myapex",
1960 key: "myapex.key",
1961 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001962 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001963 vendor: true,
1964 min_sdk_version: "29",
1965 }
1966
1967 apex_key {
1968 name: "myapex.key",
1969 public_key: "testkey.avbpubkey",
1970 private_key: "testkey.pem",
1971 }
1972
1973 cc_library {
1974 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001975 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001976 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001977 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001978 shared_libs: ["libbar"],
1979 }
1980
1981 cc_library {
1982 name: "libbar",
1983 stubs: { versions: ["29", "30"] },
1984 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001985 }
1986 `)
1987
1988 vendorVariant := "android_vendor.29_arm64_armv8-a"
1989
Jooyung Handfc864c2023-03-20 18:19:07 +09001990 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1991
1992 // Ensure that mylib links with "current" LLNDK
1993 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1994 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1995
1996 // Ensure that mylib is targeting 29
1997 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1998 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1999
2000 // Ensure that the correct variant of crtbegin_so is used.
2001 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2002 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002003
2004 // Ensure that the crtbegin_so used by the APEX is targeting 29
2005 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2006 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2007}
2008
Jooyung Han4495f842023-04-25 16:39:59 +09002009func TestTrackAllowedDeps(t *testing.T) {
2010 ctx := testApex(t, `
2011 apex {
2012 name: "myapex",
2013 key: "myapex.key",
2014 updatable: true,
2015 native_shared_libs: [
2016 "mylib",
2017 "yourlib",
2018 ],
2019 min_sdk_version: "29",
2020 }
2021
2022 apex {
2023 name: "myapex2",
2024 key: "myapex.key",
2025 updatable: false,
2026 native_shared_libs: ["yourlib"],
2027 }
2028
2029 apex_key {
2030 name: "myapex.key",
2031 public_key: "testkey.avbpubkey",
2032 private_key: "testkey.pem",
2033 }
2034
2035 cc_library {
2036 name: "mylib",
2037 srcs: ["mylib.cpp"],
2038 shared_libs: ["libbar"],
2039 min_sdk_version: "29",
2040 apex_available: ["myapex"],
2041 }
2042
2043 cc_library {
2044 name: "libbar",
2045 stubs: { versions: ["29", "30"] },
2046 }
2047
2048 cc_library {
2049 name: "yourlib",
2050 srcs: ["mylib.cpp"],
2051 min_sdk_version: "29",
2052 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2053 }
2054 `, withFiles(android.MockFS{
2055 "packages/modules/common/build/allowed_deps.txt": nil,
2056 }))
2057
2058 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2059 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2060 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002061 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002062 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002063 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002064
Jooyung Hana0503a52023-08-23 13:12:50 +09002065 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002066 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2067 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002068 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2069 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2070 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2071 flatlist, "mylib:(minSdkVersion:29)")
2072 android.AssertStringListContains(t, "track platform-available lib",
2073 flatlist, "yourlib(minSdkVersion:29)")
2074}
2075
2076func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2077 ctx := testApex(t, `
2078 apex {
2079 name: "myapex",
2080 key: "myapex.key",
2081 updatable: true,
2082 min_sdk_version: "29",
2083 }
2084
2085 apex_key {
2086 name: "myapex.key",
2087 public_key: "testkey.avbpubkey",
2088 private_key: "testkey.pem",
2089 }
2090 `)
2091 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2092 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2093 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2094 }
2095}
2096
Jooyung Han03b51852020-02-26 22:45:42 +09002097func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002098 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002099 apex {
2100 name: "myapex",
2101 key: "myapex.key",
2102 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002103 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002104 }
2105
2106 apex_key {
2107 name: "myapex.key",
2108 public_key: "testkey.avbpubkey",
2109 private_key: "testkey.pem",
2110 }
2111
2112 cc_library {
2113 name: "libx",
2114 system_shared_libs: [],
2115 stl: "none",
2116 apex_available: [ "myapex" ],
2117 stubs: {
2118 versions: ["1", "2"],
2119 },
2120 }
2121
2122 cc_library {
2123 name: "libz",
2124 shared_libs: ["libx"],
2125 system_shared_libs: [],
2126 stl: "none",
2127 }
2128 `)
2129
2130 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002131 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002132 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2133 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2134 }
2135 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002136 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002137 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2138 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2139 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002140 expectLink("libz", "shared", "libx", "shared_current")
2141 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002142 expectNoLink("libz", "shared", "libz", "shared_1")
2143 expectNoLink("libz", "shared", "libz", "shared")
2144}
2145
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002146var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2147 func(variables android.FixtureProductVariables) {
2148 variables.SanitizeDevice = []string{"hwaddress"}
2149 },
2150)
2151
Jooyung Han75568392020-03-20 04:29:24 +09002152func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002153 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002154 apex {
2155 name: "myapex",
2156 key: "myapex.key",
2157 native_shared_libs: ["libx"],
2158 min_sdk_version: "29",
2159 }
2160
2161 apex_key {
2162 name: "myapex.key",
2163 public_key: "testkey.avbpubkey",
2164 private_key: "testkey.pem",
2165 }
2166
2167 cc_library {
2168 name: "libx",
2169 shared_libs: ["libbar"],
2170 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002171 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002172 }
2173
2174 cc_library {
2175 name: "libbar",
2176 stubs: {
2177 versions: ["29", "30"],
2178 },
2179 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002180 `,
2181 prepareForTestWithSantitizeHwaddress,
2182 )
Jooyung Han03b51852020-02-26 22:45:42 +09002183 expectLink := func(from, from_variant, to, to_variant string) {
2184 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2185 libFlags := ld.Args["libFlags"]
2186 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2187 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002188 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002189}
2190
Jooyung Han75568392020-03-20 04:29:24 +09002191func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002192 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002193 apex {
2194 name: "myapex",
2195 key: "myapex.key",
2196 native_shared_libs: ["libx"],
2197 min_sdk_version: "29",
2198 }
2199
2200 apex_key {
2201 name: "myapex.key",
2202 public_key: "testkey.avbpubkey",
2203 private_key: "testkey.pem",
2204 }
2205
2206 cc_library {
2207 name: "libx",
2208 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002209 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002210 }
Jooyung Han75568392020-03-20 04:29:24 +09002211 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002212
2213 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002214 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002215 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002216 // note that platform variant is not.
2217 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002218 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002219}
2220
Jooyung Han749dc692020-04-15 11:03:39 +09002221func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2222 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002223 apex {
2224 name: "myapex",
2225 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002226 native_shared_libs: ["mylib"],
2227 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002228 }
2229
2230 apex_key {
2231 name: "myapex.key",
2232 public_key: "testkey.avbpubkey",
2233 private_key: "testkey.pem",
2234 }
Jooyung Han749dc692020-04-15 11:03:39 +09002235
2236 cc_library {
2237 name: "mylib",
2238 srcs: ["mylib.cpp"],
2239 system_shared_libs: [],
2240 stl: "none",
2241 apex_available: [
2242 "myapex",
2243 ],
2244 min_sdk_version: "30",
2245 }
2246 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002247
2248 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2249 apex {
2250 name: "myapex",
2251 key: "myapex.key",
2252 native_shared_libs: ["libfoo.ffi"],
2253 min_sdk_version: "29",
2254 }
2255
2256 apex_key {
2257 name: "myapex.key",
2258 public_key: "testkey.avbpubkey",
2259 private_key: "testkey.pem",
2260 }
2261
2262 rust_ffi_shared {
2263 name: "libfoo.ffi",
2264 srcs: ["foo.rs"],
2265 crate_name: "foo",
2266 apex_available: [
2267 "myapex",
2268 ],
2269 min_sdk_version: "30",
2270 }
2271 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002272
2273 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2274 apex {
2275 name: "myapex",
2276 key: "myapex.key",
2277 java_libs: ["libfoo"],
2278 min_sdk_version: "29",
2279 }
2280
2281 apex_key {
2282 name: "myapex.key",
2283 public_key: "testkey.avbpubkey",
2284 private_key: "testkey.pem",
2285 }
2286
2287 java_import {
2288 name: "libfoo",
2289 jars: ["libfoo.jar"],
2290 apex_available: [
2291 "myapex",
2292 ],
2293 min_sdk_version: "30",
2294 }
2295 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002296
2297 // Skip check for modules compiling against core API surface
2298 testApex(t, `
2299 apex {
2300 name: "myapex",
2301 key: "myapex.key",
2302 java_libs: ["libfoo"],
2303 min_sdk_version: "29",
2304 }
2305
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311
2312 java_library {
2313 name: "libfoo",
2314 srcs: ["Foo.java"],
2315 apex_available: [
2316 "myapex",
2317 ],
2318 // Compile against core API surface
2319 sdk_version: "core_current",
2320 min_sdk_version: "30",
2321 }
2322 `)
2323
Jooyung Han749dc692020-04-15 11:03:39 +09002324}
2325
2326func TestApexMinSdkVersion_Okay(t *testing.T) {
2327 testApex(t, `
2328 apex {
2329 name: "myapex",
2330 key: "myapex.key",
2331 native_shared_libs: ["libfoo"],
2332 java_libs: ["libbar"],
2333 min_sdk_version: "29",
2334 }
2335
2336 apex_key {
2337 name: "myapex.key",
2338 public_key: "testkey.avbpubkey",
2339 private_key: "testkey.pem",
2340 }
2341
2342 cc_library {
2343 name: "libfoo",
2344 srcs: ["mylib.cpp"],
2345 shared_libs: ["libfoo_dep"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
2349
2350 cc_library {
2351 name: "libfoo_dep",
2352 srcs: ["mylib.cpp"],
2353 apex_available: ["myapex"],
2354 min_sdk_version: "29",
2355 }
2356
2357 java_library {
2358 name: "libbar",
2359 sdk_version: "current",
2360 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002361 static_libs: [
2362 "libbar_dep",
2363 "libbar_import_dep",
2364 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002365 apex_available: ["myapex"],
2366 min_sdk_version: "29",
2367 }
2368
2369 java_library {
2370 name: "libbar_dep",
2371 sdk_version: "current",
2372 srcs: ["a.java"],
2373 apex_available: ["myapex"],
2374 min_sdk_version: "29",
2375 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002376
2377 java_import {
2378 name: "libbar_import_dep",
2379 jars: ["libbar.jar"],
2380 apex_available: ["myapex"],
2381 min_sdk_version: "29",
2382 }
Jooyung Han03b51852020-02-26 22:45:42 +09002383 `)
2384}
2385
Colin Cross8ca61c12022-10-06 21:00:14 -07002386func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2387 // Tests that an apex dependency with min_sdk_version higher than the
2388 // min_sdk_version of the apex is allowed as long as the dependency's
2389 // min_sdk_version is less than or equal to the api level that the
2390 // architecture was introduced in. In this case, arm64 didn't exist
2391 // until api level 21, so the arm64 code will never need to run on
2392 // an api level 20 device, even if other architectures of the apex
2393 // will.
2394 testApex(t, `
2395 apex {
2396 name: "myapex",
2397 key: "myapex.key",
2398 native_shared_libs: ["libfoo"],
2399 min_sdk_version: "20",
2400 }
2401
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407
2408 cc_library {
2409 name: "libfoo",
2410 srcs: ["mylib.cpp"],
2411 apex_available: ["myapex"],
2412 min_sdk_version: "21",
2413 stl: "none",
2414 }
2415 `)
2416}
2417
Artur Satayev8cf899a2020-04-15 17:29:42 +01002418func TestJavaStableSdkVersion(t *testing.T) {
2419 testCases := []struct {
2420 name string
2421 expectedError string
2422 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002423 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002424 }{
2425 {
2426 name: "Non-updatable apex with non-stable dep",
2427 bp: `
2428 apex {
2429 name: "myapex",
2430 java_libs: ["myjar"],
2431 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002432 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002433 }
2434 apex_key {
2435 name: "myapex.key",
2436 public_key: "testkey.avbpubkey",
2437 private_key: "testkey.pem",
2438 }
2439 java_library {
2440 name: "myjar",
2441 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002442 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002443 apex_available: ["myapex"],
2444 }
2445 `,
2446 },
2447 {
2448 name: "Updatable apex with stable dep",
2449 bp: `
2450 apex {
2451 name: "myapex",
2452 java_libs: ["myjar"],
2453 key: "myapex.key",
2454 updatable: true,
2455 min_sdk_version: "29",
2456 }
2457 apex_key {
2458 name: "myapex.key",
2459 public_key: "testkey.avbpubkey",
2460 private_key: "testkey.pem",
2461 }
2462 java_library {
2463 name: "myjar",
2464 srcs: ["foo/bar/MyClass.java"],
2465 sdk_version: "current",
2466 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002467 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002468 }
2469 `,
2470 },
2471 {
2472 name: "Updatable apex with non-stable dep",
2473 expectedError: "cannot depend on \"myjar\"",
2474 bp: `
2475 apex {
2476 name: "myapex",
2477 java_libs: ["myjar"],
2478 key: "myapex.key",
2479 updatable: true,
2480 }
2481 apex_key {
2482 name: "myapex.key",
2483 public_key: "testkey.avbpubkey",
2484 private_key: "testkey.pem",
2485 }
2486 java_library {
2487 name: "myjar",
2488 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002489 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002490 apex_available: ["myapex"],
2491 }
2492 `,
2493 },
2494 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002495 name: "Updatable apex with non-stable legacy core platform dep",
2496 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2497 bp: `
2498 apex {
2499 name: "myapex",
2500 java_libs: ["myjar-uses-legacy"],
2501 key: "myapex.key",
2502 updatable: true,
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 java_library {
2510 name: "myjar-uses-legacy",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "core_platform",
2513 apex_available: ["myapex"],
2514 }
2515 `,
2516 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2517 },
2518 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002519 name: "Updatable apex with non-stable transitive dep",
2520 // This is not actually detecting that the transitive dependency is unstable, rather it is
2521 // detecting that the transitive dependency is building against a wider API surface than the
2522 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002523 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002524 bp: `
2525 apex {
2526 name: "myapex",
2527 java_libs: ["myjar"],
2528 key: "myapex.key",
2529 updatable: true,
2530 }
2531 apex_key {
2532 name: "myapex.key",
2533 public_key: "testkey.avbpubkey",
2534 private_key: "testkey.pem",
2535 }
2536 java_library {
2537 name: "myjar",
2538 srcs: ["foo/bar/MyClass.java"],
2539 sdk_version: "current",
2540 apex_available: ["myapex"],
2541 static_libs: ["transitive-jar"],
2542 }
2543 java_library {
2544 name: "transitive-jar",
2545 srcs: ["foo/bar/MyClass.java"],
2546 sdk_version: "core_platform",
2547 apex_available: ["myapex"],
2548 }
2549 `,
2550 },
2551 }
2552
2553 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002554 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2555 continue
2556 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002557 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002558 errorHandler := android.FixtureExpectsNoErrors
2559 if test.expectedError != "" {
2560 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002561 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 android.GroupFixturePreparers(
2563 java.PrepareForTestWithJavaDefaultModules,
2564 PrepareForTestWithApexBuildComponents,
2565 prepareForTestWithMyapex,
2566 android.OptionalFixturePreparer(test.preparer),
2567 ).
2568 ExtendWithErrorHandler(errorHandler).
2569 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002570 })
2571 }
2572}
2573
Jooyung Han749dc692020-04-15 11:03:39 +09002574func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2575 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 native_shared_libs: ["mylib"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 cc_library {
2590 name: "mylib",
2591 srcs: ["mylib.cpp"],
2592 shared_libs: ["mylib2"],
2593 system_shared_libs: [],
2594 stl: "none",
2595 apex_available: [
2596 "myapex",
2597 ],
2598 min_sdk_version: "29",
2599 }
2600
2601 // indirect part of the apex
2602 cc_library {
2603 name: "mylib2",
2604 srcs: ["mylib.cpp"],
2605 system_shared_libs: [],
2606 stl: "none",
2607 apex_available: [
2608 "myapex",
2609 ],
2610 min_sdk_version: "30",
2611 }
2612 `)
2613}
2614
2615func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2616 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2617 apex {
2618 name: "myapex",
2619 key: "myapex.key",
2620 apps: ["AppFoo"],
2621 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002622 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002623 }
2624
2625 apex_key {
2626 name: "myapex.key",
2627 public_key: "testkey.avbpubkey",
2628 private_key: "testkey.pem",
2629 }
2630
2631 android_app {
2632 name: "AppFoo",
2633 srcs: ["foo/bar/MyClass.java"],
2634 sdk_version: "current",
2635 min_sdk_version: "29",
2636 system_modules: "none",
2637 stl: "none",
2638 static_libs: ["bar"],
2639 apex_available: [ "myapex" ],
2640 }
2641
2642 java_library {
2643 name: "bar",
2644 sdk_version: "current",
2645 srcs: ["a.java"],
2646 apex_available: [ "myapex" ],
2647 }
2648 `)
2649}
2650
2651func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002652 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002653 apex {
2654 name: "myapex",
2655 key: "myapex.key",
2656 native_shared_libs: ["mylib"],
2657 min_sdk_version: "29",
2658 }
2659
2660 apex_key {
2661 name: "myapex.key",
2662 public_key: "testkey.avbpubkey",
2663 private_key: "testkey.pem",
2664 }
2665
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002666 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002667 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2668 cc_library {
2669 name: "mylib",
2670 srcs: ["mylib.cpp"],
2671 shared_libs: ["mylib2"],
2672 system_shared_libs: [],
2673 stl: "none",
2674 apex_available: ["myapex", "otherapex"],
2675 min_sdk_version: "29",
2676 }
2677
2678 cc_library {
2679 name: "mylib2",
2680 srcs: ["mylib.cpp"],
2681 system_shared_libs: [],
2682 stl: "none",
2683 apex_available: ["otherapex"],
2684 stubs: { versions: ["29", "30"] },
2685 min_sdk_version: "30",
2686 }
2687
2688 apex {
2689 name: "otherapex",
2690 key: "myapex.key",
2691 native_shared_libs: ["mylib", "mylib2"],
2692 min_sdk_version: "30",
2693 }
2694 `)
2695 expectLink := func(from, from_variant, to, to_variant string) {
2696 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2697 libFlags := ld.Args["libFlags"]
2698 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2699 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002700 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002701 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002702}
2703
Jooyung Haned124c32021-01-26 11:43:46 +09002704func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002705 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2706 func(variables android.FixtureProductVariables) {
2707 variables.Platform_sdk_codename = proptools.StringPtr("S")
2708 variables.Platform_version_active_codenames = []string{"S"}
2709 },
2710 )
Jooyung Haned124c32021-01-26 11:43:46 +09002711 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2712 apex {
2713 name: "myapex",
2714 key: "myapex.key",
2715 native_shared_libs: ["libfoo"],
2716 min_sdk_version: "S",
2717 }
2718 apex_key {
2719 name: "myapex.key",
2720 public_key: "testkey.avbpubkey",
2721 private_key: "testkey.pem",
2722 }
2723 cc_library {
2724 name: "libfoo",
2725 shared_libs: ["libbar"],
2726 apex_available: ["myapex"],
2727 min_sdk_version: "29",
2728 }
2729 cc_library {
2730 name: "libbar",
2731 apex_available: ["myapex"],
2732 }
2733 `, withSAsActiveCodeNames)
2734}
2735
2736func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002737 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2738 variables.Platform_sdk_codename = proptools.StringPtr("S")
2739 variables.Platform_version_active_codenames = []string{"S", "T"}
2740 })
Colin Cross1c460562021-02-16 17:55:47 -08002741 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002742 apex {
2743 name: "myapex",
2744 key: "myapex.key",
2745 native_shared_libs: ["libfoo"],
2746 min_sdk_version: "S",
2747 }
2748 apex_key {
2749 name: "myapex.key",
2750 public_key: "testkey.avbpubkey",
2751 private_key: "testkey.pem",
2752 }
2753 cc_library {
2754 name: "libfoo",
2755 shared_libs: ["libbar"],
2756 apex_available: ["myapex"],
2757 min_sdk_version: "S",
2758 }
2759 cc_library {
2760 name: "libbar",
2761 stubs: {
2762 symbol_file: "libbar.map.txt",
2763 versions: ["30", "S", "T"],
2764 },
2765 }
2766 `, withSAsActiveCodeNames)
2767
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002768 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002769 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2770 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002771 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002772}
2773
Jiyong Park7c2ee712018-12-07 00:42:25 +09002774func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002775 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002776 apex {
2777 name: "myapex",
2778 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002779 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002780 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002781 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002782 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002783 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002784 }
2785
2786 apex_key {
2787 name: "myapex.key",
2788 public_key: "testkey.avbpubkey",
2789 private_key: "testkey.pem",
2790 }
2791
2792 prebuilt_etc {
2793 name: "myetc",
2794 src: "myprebuilt",
2795 sub_dir: "foo/bar",
2796 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002797
2798 cc_library {
2799 name: "mylib",
2800 srcs: ["mylib.cpp"],
2801 relative_install_path: "foo/bar",
2802 system_shared_libs: [],
2803 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002804 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002805 }
2806
2807 cc_binary {
2808 name: "mybin",
2809 srcs: ["mylib.cpp"],
2810 relative_install_path: "foo/bar",
2811 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002813 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002814 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002815
2816 rust_binary {
2817 name: "mybin.rust",
2818 srcs: ["foo.rs"],
2819 relative_install_path: "rust_subdir",
2820 apex_available: [ "myapex" ],
2821 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002822 `)
2823
Jooyung Hana0503a52023-08-23 13:12:50 +09002824 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002825 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002826
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002827 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002828 ensureContains(t, cmd, "/etc ")
2829 ensureContains(t, cmd, "/etc/foo ")
2830 ensureContains(t, cmd, "/etc/foo/bar ")
2831 ensureContains(t, cmd, "/lib64 ")
2832 ensureContains(t, cmd, "/lib64/foo ")
2833 ensureContains(t, cmd, "/lib64/foo/bar ")
2834 ensureContains(t, cmd, "/lib ")
2835 ensureContains(t, cmd, "/lib/foo ")
2836 ensureContains(t, cmd, "/lib/foo/bar ")
2837 ensureContains(t, cmd, "/bin ")
2838 ensureContains(t, cmd, "/bin/foo ")
2839 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002840 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002841}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002842
Jooyung Han35155c42020-02-06 17:33:20 +09002843func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002844 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 multilib: {
2849 both: {
2850 native_shared_libs: ["mylib"],
2851 binaries: ["mybin"],
2852 },
2853 },
2854 compile_multilib: "both",
2855 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002856 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002857 }
2858
2859 apex_key {
2860 name: "myapex.key",
2861 public_key: "testkey.avbpubkey",
2862 private_key: "testkey.pem",
2863 }
2864
2865 cc_library {
2866 name: "mylib",
2867 relative_install_path: "foo/bar",
2868 system_shared_libs: [],
2869 stl: "none",
2870 apex_available: [ "myapex" ],
2871 native_bridge_supported: true,
2872 }
2873
2874 cc_binary {
2875 name: "mybin",
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002878 stl: "none",
2879 apex_available: [ "myapex" ],
2880 native_bridge_supported: true,
2881 compile_multilib: "both", // default is "first" for binary
2882 multilib: {
2883 lib64: {
2884 suffix: "64",
2885 },
2886 },
2887 }
2888 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002889 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002890 "bin/foo/bar/mybin",
2891 "bin/foo/bar/mybin64",
2892 "bin/arm/foo/bar/mybin",
2893 "bin/arm64/foo/bar/mybin64",
2894 "lib/foo/bar/mylib.so",
2895 "lib/arm/foo/bar/mylib.so",
2896 "lib64/foo/bar/mylib.so",
2897 "lib64/arm64/foo/bar/mylib.so",
2898 })
2899}
2900
Jooyung Han85d61762020-06-24 23:50:26 +09002901func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002902 result := android.GroupFixturePreparers(
2903 prepareForApexTest,
2904 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2905 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 binaries: ["mybin"],
2910 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002911 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002912 }
2913 apex_key {
2914 name: "myapex.key",
2915 public_key: "testkey.avbpubkey",
2916 private_key: "testkey.pem",
2917 }
2918 cc_binary {
2919 name: "mybin",
2920 vendor: true,
2921 shared_libs: ["libfoo"],
2922 }
2923 cc_library {
2924 name: "libfoo",
2925 proprietary: true,
2926 }
2927 `)
2928
Jooyung Hana0503a52023-08-23 13:12:50 +09002929 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002930 "bin/mybin",
2931 "lib64/libfoo.so",
2932 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2933 "lib64/libc++.so",
2934 })
2935
Jooyung Hana0503a52023-08-23 13:12:50 +09002936 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002937 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002938 name := apexBundle.BaseModuleName()
2939 prefix := "TARGET_"
2940 var builder strings.Builder
2941 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002942 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002943 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002944 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002945
Jooyung Hana0503a52023-08-23 13:12:50 +09002946 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002947 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2948 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002949}
2950
Jooyung Hanc5a96762022-02-04 11:54:50 +09002951func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2952 testApexError(t, `Trying to include a VNDK library`, `
2953 apex {
2954 name: "myapex",
2955 key: "myapex.key",
2956 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2957 vendor: true,
2958 use_vndk_as_stable: true,
2959 updatable: false,
2960 }
2961 apex_key {
2962 name: "myapex.key",
2963 public_key: "testkey.avbpubkey",
2964 private_key: "testkey.pem",
2965 }`)
2966}
2967
Jooyung Handf78e212020-07-22 15:54:47 +09002968func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002969 // myapex myapex2
2970 // | |
2971 // mybin ------. mybin2
2972 // \ \ / |
2973 // (stable) .---\--------` |
2974 // \ / \ |
2975 // \ / \ /
2976 // libvndk libvendor
2977 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002978 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002979 apex {
2980 name: "myapex",
2981 key: "myapex.key",
2982 binaries: ["mybin"],
2983 vendor: true,
2984 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002985 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002986 }
2987 apex_key {
2988 name: "myapex.key",
2989 public_key: "testkey.avbpubkey",
2990 private_key: "testkey.pem",
2991 }
2992 cc_binary {
2993 name: "mybin",
2994 vendor: true,
2995 shared_libs: ["libvndk", "libvendor"],
2996 }
2997 cc_library {
2998 name: "libvndk",
2999 vndk: {
3000 enabled: true,
3001 },
3002 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003003 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003004 }
3005 cc_library {
3006 name: "libvendor",
3007 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003008 stl: "none",
3009 }
3010 apex {
3011 name: "myapex2",
3012 key: "myapex.key",
3013 binaries: ["mybin2"],
3014 vendor: true,
3015 use_vndk_as_stable: false,
3016 updatable: false,
3017 }
3018 cc_binary {
3019 name: "mybin2",
3020 vendor: true,
3021 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003022 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003023 `,
3024 android.FixtureModifyConfig(func(config android.Config) {
3025 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3026 }),
3027 )
Jooyung Handf78e212020-07-22 15:54:47 +09003028
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003029 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003030
Jooyung Han91f92032022-02-04 12:36:33 +09003031 for _, tc := range []struct {
3032 name string
3033 apexName string
3034 moduleName string
3035 moduleVariant string
3036 libs []string
3037 contents []string
3038 requireVndkNamespace bool
3039 }{
3040 {
3041 name: "use_vndk_as_stable",
3042 apexName: "myapex",
3043 moduleName: "mybin",
3044 moduleVariant: vendorVariant + "_apex10000",
3045 libs: []string{
3046 // should link with vendor variants of VNDK libs(libvndk/libc++)
3047 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3048 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3049 // unstable Vendor libs as APEX variant
3050 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3051 },
3052 contents: []string{
3053 "bin/mybin",
3054 "lib64/libvendor.so",
3055 // VNDK libs (libvndk/libc++) are not included
3056 },
3057 requireVndkNamespace: true,
3058 },
3059 {
3060 name: "!use_vndk_as_stable",
3061 apexName: "myapex2",
3062 moduleName: "mybin2",
3063 moduleVariant: vendorVariant + "_myapex2",
3064 libs: []string{
3065 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3066 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3067 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3068 // unstable vendor libs have "merged" APEX variants
3069 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3070 },
3071 contents: []string{
3072 "bin/mybin2",
3073 "lib64/libvendor.so",
3074 // VNDK libs are included as well
3075 "lib64/libvndk.so",
3076 "lib64/libc++.so",
3077 },
3078 requireVndkNamespace: false,
3079 },
3080 } {
3081 t.Run(tc.name, func(t *testing.T) {
3082 // Check linked libs
3083 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3084 libs := names(ldRule.Args["libFlags"])
3085 for _, lib := range tc.libs {
3086 ensureListContains(t, libs, lib)
3087 }
3088 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003089 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003090
Jooyung Han91f92032022-02-04 12:36:33 +09003091 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003092 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003093 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3094 if tc.requireVndkNamespace {
3095 ensureListContains(t, requireNativeLibs, ":vndk")
3096 } else {
3097 ensureListNotContains(t, requireNativeLibs, ":vndk")
3098 }
3099 })
3100 }
Jooyung Handf78e212020-07-22 15:54:47 +09003101}
3102
Justin Yun13decfb2021-03-08 19:25:55 +09003103func TestProductVariant(t *testing.T) {
3104 ctx := testApex(t, `
3105 apex {
3106 name: "myapex",
3107 key: "myapex.key",
3108 updatable: false,
3109 product_specific: true,
3110 binaries: ["foo"],
3111 }
3112
3113 apex_key {
3114 name: "myapex.key",
3115 public_key: "testkey.avbpubkey",
3116 private_key: "testkey.pem",
3117 }
3118
3119 cc_binary {
3120 name: "foo",
3121 product_available: true,
3122 apex_available: ["myapex"],
3123 srcs: ["foo.cpp"],
3124 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003125 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003126
3127 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003128 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003129 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3130 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3131 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3132 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3133}
3134
Jooyung Han8e5685d2020-09-21 11:02:57 +09003135func TestApex_withPrebuiltFirmware(t *testing.T) {
3136 testCases := []struct {
3137 name string
3138 additionalProp string
3139 }{
3140 {"system apex with prebuilt_firmware", ""},
3141 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3142 }
3143 for _, tc := range testCases {
3144 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003145 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003146 apex {
3147 name: "myapex",
3148 key: "myapex.key",
3149 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003151 `+tc.additionalProp+`
3152 }
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158 prebuilt_firmware {
3159 name: "myfirmware",
3160 src: "myfirmware.bin",
3161 filename_from_src: true,
3162 `+tc.additionalProp+`
3163 }
3164 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003165 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003166 "etc/firmware/myfirmware.bin",
3167 })
3168 })
3169 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003170}
3171
Jooyung Hanefb184e2020-06-25 17:14:25 +09003172func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003173 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003174 apex {
3175 name: "myapex",
3176 key: "myapex.key",
3177 vendor: true,
3178 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003179 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003180 }
3181
3182 apex_key {
3183 name: "myapex.key",
3184 public_key: "testkey.avbpubkey",
3185 private_key: "testkey.pem",
3186 }
3187
3188 cc_library {
3189 name: "mylib",
3190 vendor_available: true,
3191 }
3192 `)
3193
Jooyung Hana0503a52023-08-23 13:12:50 +09003194 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003195 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003196 name := apexBundle.BaseModuleName()
3197 prefix := "TARGET_"
3198 var builder strings.Builder
3199 data.Custom(&builder, name, prefix, "", data)
3200 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003201 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003202}
3203
Jooyung Han2ed99d02020-06-24 23:26:26 +09003204func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003205 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003206 apex {
3207 name: "myapex",
3208 key: "myapex.key",
3209 vintf_fragments: ["fragment.xml"],
3210 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003211 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003212 }
3213 apex_key {
3214 name: "myapex.key",
3215 public_key: "testkey.avbpubkey",
3216 private_key: "testkey.pem",
3217 }
3218 cc_binary {
3219 name: "mybin",
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003224 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003225 name := apexBundle.BaseModuleName()
3226 prefix := "TARGET_"
3227 var builder strings.Builder
3228 data.Custom(&builder, name, prefix, "", data)
3229 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003230 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003231 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003232}
3233
Jiyong Park16e91a02018-12-20 18:18:08 +09003234func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003235 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003236 apex {
3237 name: "myapex",
3238 key: "myapex.key",
3239 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003241 }
3242
3243 apex_key {
3244 name: "myapex.key",
3245 public_key: "testkey.avbpubkey",
3246 private_key: "testkey.pem",
3247 }
3248
3249 cc_library {
3250 name: "mylib",
3251 srcs: ["mylib.cpp"],
3252 system_shared_libs: [],
3253 stl: "none",
3254 stubs: {
3255 versions: ["1", "2", "3"],
3256 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003257 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003258 }
3259
3260 cc_binary {
3261 name: "not_in_apex",
3262 srcs: ["mylib.cpp"],
3263 static_libs: ["mylib"],
3264 static_executable: true,
3265 system_shared_libs: [],
3266 stl: "none",
3267 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003268 `)
3269
Colin Cross7113d202019-11-20 16:39:12 -08003270 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003271
3272 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003273 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003274}
Jiyong Park9335a262018-12-24 11:31:58 +09003275
3276func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003277 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003278 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003279 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003280 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003281 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003282 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003283 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003284 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003285 }
3286
3287 cc_library {
3288 name: "mylib",
3289 srcs: ["mylib.cpp"],
3290 system_shared_libs: [],
3291 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003292 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003293 }
3294
3295 apex_key {
3296 name: "myapex.key",
3297 public_key: "testkey.avbpubkey",
3298 private_key: "testkey.pem",
3299 }
3300
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003301 android_app_certificate {
3302 name: "myapex.certificate",
3303 certificate: "testkey",
3304 }
3305
3306 android_app_certificate {
3307 name: "myapex.certificate.override",
3308 certificate: "testkey.override",
3309 }
3310
Jiyong Park9335a262018-12-24 11:31:58 +09003311 `)
3312
3313 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003314 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003315
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003316 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3317 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003318 "vendor/foo/devkeys/testkey.avbpubkey")
3319 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003320 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3321 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003322 "vendor/foo/devkeys/testkey.pem")
3323 }
3324
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003325 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003326 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003327 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003328 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003329 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003330 }
3331}
Jiyong Park58e364a2019-01-19 19:24:06 +09003332
Jooyung Hanf121a652019-12-17 14:30:11 +09003333func TestCertificate(t *testing.T) {
3334 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003335 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003336 apex {
3337 name: "myapex",
3338 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 }
3341 apex_key {
3342 name: "myapex.key",
3343 public_key: "testkey.avbpubkey",
3344 private_key: "testkey.pem",
3345 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003346 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3348 if actual := rule.Args["certificates"]; actual != expected {
3349 t.Errorf("certificates should be %q, not %q", expected, actual)
3350 }
3351 })
3352 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003353 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003354 apex {
3355 name: "myapex_keytest",
3356 key: "myapex.key",
3357 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003358 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 }
3360 apex_key {
3361 name: "myapex.key",
3362 public_key: "testkey.avbpubkey",
3363 private_key: "testkey.pem",
3364 }
3365 android_app_certificate {
3366 name: "myapex.certificate.override",
3367 certificate: "testkey.override",
3368 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 expected := "testkey.override.x509.pem testkey.override.pk8"
3371 if actual := rule.Args["certificates"]; actual != expected {
3372 t.Errorf("certificates should be %q, not %q", expected, actual)
3373 }
3374 })
3375 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003376 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003377 apex {
3378 name: "myapex",
3379 key: "myapex.key",
3380 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003381 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003382 }
3383 apex_key {
3384 name: "myapex.key",
3385 public_key: "testkey.avbpubkey",
3386 private_key: "testkey.pem",
3387 }
3388 android_app_certificate {
3389 name: "myapex.certificate",
3390 certificate: "testkey",
3391 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003392 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 expected := "testkey.x509.pem testkey.pk8"
3394 if actual := rule.Args["certificates"]; actual != expected {
3395 t.Errorf("certificates should be %q, not %q", expected, actual)
3396 }
3397 })
3398 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003399 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003400 apex {
3401 name: "myapex_keytest",
3402 key: "myapex.key",
3403 file_contexts: ":myapex-file_contexts",
3404 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003405 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003406 }
3407 apex_key {
3408 name: "myapex.key",
3409 public_key: "testkey.avbpubkey",
3410 private_key: "testkey.pem",
3411 }
3412 android_app_certificate {
3413 name: "myapex.certificate.override",
3414 certificate: "testkey.override",
3415 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003416 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 expected := "testkey.override.x509.pem testkey.override.pk8"
3418 if actual := rule.Args["certificates"]; actual != expected {
3419 t.Errorf("certificates should be %q, not %q", expected, actual)
3420 }
3421 })
3422 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003423 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003424 apex {
3425 name: "myapex",
3426 key: "myapex.key",
3427 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003428 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003429 }
3430 apex_key {
3431 name: "myapex.key",
3432 public_key: "testkey.avbpubkey",
3433 private_key: "testkey.pem",
3434 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003435 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3437 if actual := rule.Args["certificates"]; actual != expected {
3438 t.Errorf("certificates should be %q, not %q", expected, actual)
3439 }
3440 })
3441 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003442 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003443 apex {
3444 name: "myapex_keytest",
3445 key: "myapex.key",
3446 file_contexts: ":myapex-file_contexts",
3447 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003448 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003449 }
3450 apex_key {
3451 name: "myapex.key",
3452 public_key: "testkey.avbpubkey",
3453 private_key: "testkey.pem",
3454 }
3455 android_app_certificate {
3456 name: "myapex.certificate.override",
3457 certificate: "testkey.override",
3458 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003459 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003460 expected := "testkey.override.x509.pem testkey.override.pk8"
3461 if actual := rule.Args["certificates"]; actual != expected {
3462 t.Errorf("certificates should be %q, not %q", expected, actual)
3463 }
3464 })
3465}
3466
Jiyong Park58e364a2019-01-19 19:24:06 +09003467func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003468 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003469 apex {
3470 name: "myapex",
3471 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003472 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003473 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003474 }
3475
3476 apex {
3477 name: "otherapex",
3478 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003479 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003480 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003481 }
3482
3483 apex_key {
3484 name: "myapex.key",
3485 public_key: "testkey.avbpubkey",
3486 private_key: "testkey.pem",
3487 }
3488
3489 cc_library {
3490 name: "mylib",
3491 srcs: ["mylib.cpp"],
3492 system_shared_libs: [],
3493 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003494 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003495 "myapex",
3496 "otherapex",
3497 ],
Jooyung Han24282772020-03-21 23:20:55 +09003498 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003499 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003500 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501 cc_library {
3502 name: "mylib2",
3503 srcs: ["mylib.cpp"],
3504 system_shared_libs: [],
3505 stl: "none",
3506 apex_available: [
3507 "myapex",
3508 "otherapex",
3509 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003510 static_libs: ["mylib3"],
3511 recovery_available: true,
3512 min_sdk_version: "29",
3513 }
3514 cc_library {
3515 name: "mylib3",
3516 srcs: ["mylib.cpp"],
3517 system_shared_libs: [],
3518 stl: "none",
3519 apex_available: [
3520 "myapex",
3521 "otherapex",
3522 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003523 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003524 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003525 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003526 `)
3527
Jooyung Hanc87a0592020-03-02 17:44:33 +09003528 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003529 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003530 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003531
Vinh Tranf9754732023-01-19 22:41:46 -05003532 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003533 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003534 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003535
Vinh Tranf9754732023-01-19 22:41:46 -05003536 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003537 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003539
Colin Crossaede88c2020-08-11 12:17:01 -07003540 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3541 // each variant defines additional macros to distinguish which apex variant it is built for
3542
3543 // non-APEX variant does not have __ANDROID_APEX__ defined
3544 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3545 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3546
Vinh Tranf9754732023-01-19 22:41:46 -05003547 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003548 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3549 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003550
Jooyung Hanc87a0592020-03-02 17:44:33 +09003551 // non-APEX variant does not have __ANDROID_APEX__ defined
3552 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3553 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3554
Vinh Tranf9754732023-01-19 22:41:46 -05003555 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003556 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003558}
Jiyong Park7e636d02019-01-28 16:16:54 +09003559
3560func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003561 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003562 apex {
3563 name: "myapex",
3564 key: "myapex.key",
3565 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003566 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003567 }
3568
3569 apex_key {
3570 name: "myapex.key",
3571 public_key: "testkey.avbpubkey",
3572 private_key: "testkey.pem",
3573 }
3574
3575 cc_library_headers {
3576 name: "mylib_headers",
3577 export_include_dirs: ["my_include"],
3578 system_shared_libs: [],
3579 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003580 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003581 }
3582
3583 cc_library {
3584 name: "mylib",
3585 srcs: ["mylib.cpp"],
3586 system_shared_libs: [],
3587 stl: "none",
3588 header_libs: ["mylib_headers"],
3589 export_header_lib_headers: ["mylib_headers"],
3590 stubs: {
3591 versions: ["1", "2", "3"],
3592 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003593 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003594 }
3595
3596 cc_library {
3597 name: "otherlib",
3598 srcs: ["mylib.cpp"],
3599 system_shared_libs: [],
3600 stl: "none",
3601 shared_libs: ["mylib"],
3602 }
3603 `)
3604
Colin Cross7113d202019-11-20 16:39:12 -08003605 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003606
3607 // Ensure that the include path of the header lib is exported to 'otherlib'
3608 ensureContains(t, cFlags, "-Imy_include")
3609}
Alex Light9670d332019-01-29 18:07:33 -08003610
Jiyong Park7cd10e32020-01-14 09:22:18 +09003611type fileInApex struct {
3612 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003613 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 isLink bool
3615}
3616
Jooyung Han1724d582022-12-21 10:17:44 +09003617func (f fileInApex) String() string {
3618 return f.src + ":" + f.path
3619}
3620
3621func (f fileInApex) match(expectation string) bool {
3622 parts := strings.Split(expectation, ":")
3623 if len(parts) == 1 {
3624 match, _ := path.Match(parts[0], f.path)
3625 return match
3626 }
3627 if len(parts) == 2 {
3628 matchSrc, _ := path.Match(parts[0], f.src)
3629 matchDst, _ := path.Match(parts[1], f.path)
3630 return matchSrc && matchDst
3631 }
3632 panic("invalid expected file specification: " + expectation)
3633}
3634
Jooyung Hana57af4a2020-01-23 05:36:59 +00003635func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003636 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003637 module := ctx.ModuleForTests(moduleName, variant)
3638 apexRule := module.MaybeRule("apexRule")
3639 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003641 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 for _, cmd := range strings.Split(copyCmds, "&&") {
3643 cmd = strings.TrimSpace(cmd)
3644 if cmd == "" {
3645 continue
3646 }
3647 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003648 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003649 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 switch terms[0] {
3651 case "mkdir":
3652 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 t.Fatal("copyCmds contains invalid cp command", cmd)
3655 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003656 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003657 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003658 isLink = false
3659 case "ln":
3660 if len(terms) != 3 && len(terms) != 4 {
3661 // ln LINK TARGET or ln -s LINK TARGET
3662 t.Fatal("copyCmds contains invalid ln command", cmd)
3663 }
3664 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003665 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003666 isLink = true
3667 default:
3668 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3669 }
3670 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003671 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003672 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003673 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 }
Jooyung Han1724d582022-12-21 10:17:44 +09003675 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003676 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003677 }
3678 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003679 return ret
3680}
3681
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003682func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003683 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003684 var failed bool
3685 var surplus []string
3686 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003687 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003688 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003689 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003690 if file.match(expected) {
3691 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003692 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003693 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003694 }
3695 }
Jooyung Han1724d582022-12-21 10:17:44 +09003696 if !matchFound {
3697 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003698 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003699 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003700
Jooyung Han31c470b2019-10-18 16:26:59 +09003701 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003702 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003703 t.Log("surplus files", surplus)
3704 failed = true
3705 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003707 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003708 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003709 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003710 if !filesMatched[expected] {
3711 missing = append(missing, expected)
3712 }
3713 }
3714 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 t.Log("missing files", missing)
3716 failed = true
3717 }
3718 if failed {
3719 t.Fail()
3720 }
3721}
3722
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003723func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3724 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3725}
3726
3727func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003728 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003729 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3730 if deapexer.Output != nil {
3731 outputs = append(outputs, deapexer.Output.String())
3732 }
3733 for _, output := range deapexer.ImplicitOutputs {
3734 outputs = append(outputs, output.String())
3735 }
3736 actualFiles := make([]fileInApex, 0, len(outputs))
3737 for _, output := range outputs {
3738 dir := "/deapexer/"
3739 pos := strings.LastIndex(output, dir)
3740 if pos == -1 {
3741 t.Fatal("Unknown deapexer output ", output)
3742 }
3743 path := output[pos+len(dir):]
3744 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3745 }
3746 assertFileListEquals(t, files, actualFiles)
3747}
3748
Jooyung Han344d5432019-08-23 11:17:39 +09003749func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003750 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003751 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003752 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003753 "etc/llndk.libraries.29.txt",
3754 "etc/vndkcore.libraries.29.txt",
3755 "etc/vndksp.libraries.29.txt",
3756 "etc/vndkprivate.libraries.29.txt",
3757 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003758 }
3759 testCases := []struct {
3760 vndkVersion string
3761 expectedFiles []string
3762 }{
3763 {
3764 vndkVersion: "current",
3765 expectedFiles: append(commonFiles,
3766 "lib/libvndk.so",
3767 "lib/libvndksp.so",
3768 "lib64/libvndk.so",
3769 "lib64/libvndksp.so"),
3770 },
3771 {
3772 vndkVersion: "",
3773 expectedFiles: append(commonFiles,
3774 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3775 "lib/libvndksp.so",
3776 "lib64/libvndksp.so"),
3777 },
3778 }
3779 for _, tc := range testCases {
3780 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3781 ctx := testApex(t, `
3782 apex_vndk {
3783 name: "com.android.vndk.current",
3784 key: "com.android.vndk.current.key",
3785 updatable: false,
3786 }
3787
3788 apex_key {
3789 name: "com.android.vndk.current.key",
3790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
3793
3794 cc_library {
3795 name: "libvndk",
3796 srcs: ["mylib.cpp"],
3797 vendor_available: true,
3798 product_available: true,
3799 vndk: {
3800 enabled: true,
3801 },
3802 system_shared_libs: [],
3803 stl: "none",
3804 apex_available: [ "com.android.vndk.current" ],
3805 }
3806
3807 cc_library {
3808 name: "libvndksp",
3809 srcs: ["mylib.cpp"],
3810 vendor_available: true,
3811 product_available: true,
3812 vndk: {
3813 enabled: true,
3814 support_system_process: true,
3815 },
3816 system_shared_libs: [],
3817 stl: "none",
3818 apex_available: [ "com.android.vndk.current" ],
3819 }
3820
3821 // VNDK-Ext should not cause any problems
3822
3823 cc_library {
3824 name: "libvndk.ext",
3825 srcs: ["mylib2.cpp"],
3826 vendor: true,
3827 vndk: {
3828 enabled: true,
3829 extends: "libvndk",
3830 },
3831 system_shared_libs: [],
3832 stl: "none",
3833 }
3834
3835 cc_library {
3836 name: "libvndksp.ext",
3837 srcs: ["mylib2.cpp"],
3838 vendor: true,
3839 vndk: {
3840 enabled: true,
3841 support_system_process: true,
3842 extends: "libvndksp",
3843 },
3844 system_shared_libs: [],
3845 stl: "none",
3846 }
3847 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3848 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003849 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003850 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003851 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003852 })
3853 }
Jooyung Han344d5432019-08-23 11:17:39 +09003854}
3855
3856func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003857 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003858 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003859 name: "com.android.vndk.current",
3860 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003861 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003862 }
3863
3864 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003865 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003866 public_key: "testkey.avbpubkey",
3867 private_key: "testkey.pem",
3868 }
3869
3870 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003871 name: "libvndk",
3872 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003873 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003874 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003875 vndk: {
3876 enabled: true,
3877 },
3878 system_shared_libs: [],
3879 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003880 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003881 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003882
3883 cc_prebuilt_library_shared {
3884 name: "libvndk.arm",
3885 srcs: ["libvndk.arm.so"],
3886 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003887 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003888 vndk: {
3889 enabled: true,
3890 },
3891 enabled: false,
3892 arch: {
3893 arm: {
3894 enabled: true,
3895 },
3896 },
3897 system_shared_libs: [],
3898 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003899 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003900 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003901 `+vndkLibrariesTxtFiles("current"),
3902 withFiles(map[string][]byte{
3903 "libvndk.so": nil,
3904 "libvndk.arm.so": nil,
3905 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003906 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003907 "lib/libvndk.so",
3908 "lib/libvndk.arm.so",
3909 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003910 "lib/libc++.so",
3911 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003912 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003913 })
Jooyung Han344d5432019-08-23 11:17:39 +09003914}
3915
Jooyung Han39edb6c2019-11-06 16:53:07 +09003916func vndkLibrariesTxtFiles(vers ...string) (result string) {
3917 for _, v := range vers {
3918 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003919 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003920 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003921 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003922 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003923 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003924 }
3925 `
3926 }
Justin Yund5784122023-10-25 13:25:32 +09003927 result += `
3928 llndk_libraries_txt {
3929 name: "llndk.libraries.txt",
3930 }
3931 llndk_libraries_txt_for_apex {
3932 name: "llndk.libraries.txt.apex",
3933 stem: "llndk.libraries.txt",
3934 insert_vndk_version: true,
3935 }
3936 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003937 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003938 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003939 result += `
3940 prebuilt_etc {
3941 name: "` + txt + `.libraries.` + v + `.txt",
3942 src: "dummy.txt",
3943 }
3944 `
3945 }
3946 }
3947 }
3948 return
3949}
3950
Jooyung Han344d5432019-08-23 11:17:39 +09003951func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003952 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003953 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003954 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003955 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003956 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003957 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003958 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 apex_key {
3962 name: "myapex.key",
3963 public_key: "testkey.avbpubkey",
3964 private_key: "testkey.pem",
3965 }
3966
Jooyung Han31c470b2019-10-18 16:26:59 +09003967 vndk_prebuilt_shared {
3968 name: "libvndk27",
3969 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003971 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003972 vndk: {
3973 enabled: true,
3974 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003975 target_arch: "arm64",
3976 arch: {
3977 arm: {
3978 srcs: ["libvndk27_arm.so"],
3979 },
3980 arm64: {
3981 srcs: ["libvndk27_arm64.so"],
3982 },
3983 },
Colin Cross2807f002021-03-02 10:15:29 -08003984 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003985 }
3986
3987 vndk_prebuilt_shared {
3988 name: "libvndk27",
3989 version: "27",
3990 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003991 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003992 vndk: {
3993 enabled: true,
3994 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003995 target_arch: "x86_64",
3996 arch: {
3997 x86: {
3998 srcs: ["libvndk27_x86.so"],
3999 },
4000 x86_64: {
4001 srcs: ["libvndk27_x86_64.so"],
4002 },
4003 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004004 }
4005 `+vndkLibrariesTxtFiles("27"),
4006 withFiles(map[string][]byte{
4007 "libvndk27_arm.so": nil,
4008 "libvndk27_arm64.so": nil,
4009 "libvndk27_x86.so": nil,
4010 "libvndk27_x86_64.so": nil,
4011 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004012
Jooyung Hana0503a52023-08-23 13:12:50 +09004013 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 "lib/libvndk27_arm.so",
4015 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004016 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004017 })
Jooyung Han344d5432019-08-23 11:17:39 +09004018}
4019
Jooyung Han90eee022019-10-01 20:02:42 +09004020func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004021 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004022 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004023 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004024 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004026 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004027 }
4028 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004029 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004030 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004031 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004032 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004033 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004034 }
4035 apex_key {
4036 name: "myapex.key",
4037 public_key: "testkey.avbpubkey",
4038 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004039 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004040
4041 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004042 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004043 apexManifestRule := module.Rule("apexManifestRule")
4044 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004045 }
4046
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004047 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004048 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004049}
4050
Jooyung Han344d5432019-08-23 11:17:39 +09004051func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004052 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004053 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004054 name: "com.android.vndk.current",
4055 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004056 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004057 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004058 }
4059
4060 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004061 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004062 public_key: "testkey.avbpubkey",
4063 private_key: "testkey.pem",
4064 }
4065
4066 cc_library {
4067 name: "libvndk",
4068 srcs: ["mylib.cpp"],
4069 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004070 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004071 native_bridge_supported: true,
4072 host_supported: true,
4073 vndk: {
4074 enabled: true,
4075 },
4076 system_shared_libs: [],
4077 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004078 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004079 }
Colin Cross2807f002021-03-02 10:15:29 -08004080 `+vndkLibrariesTxtFiles("current"),
4081 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004082
Jooyung Hana0503a52023-08-23 13:12:50 +09004083 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 "lib/libvndk.so",
4085 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004086 "lib/libc++.so",
4087 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004088 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 })
Jooyung Han344d5432019-08-23 11:17:39 +09004090}
4091
4092func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004093 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004094 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004095 name: "com.android.vndk.current",
4096 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004097 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004098 native_bridge_supported: true,
4099 }
4100
4101 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004102 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004103 public_key: "testkey.avbpubkey",
4104 private_key: "testkey.pem",
4105 }
4106
4107 cc_library {
4108 name: "libvndk",
4109 srcs: ["mylib.cpp"],
4110 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004111 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004112 native_bridge_supported: true,
4113 host_supported: true,
4114 vndk: {
4115 enabled: true,
4116 },
4117 system_shared_libs: [],
4118 stl: "none",
4119 }
4120 `)
4121}
4122
Jooyung Han31c470b2019-10-18 16:26:59 +09004123func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004124 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004126 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004127 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004128 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004130 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004131 }
4132
4133 apex_key {
4134 name: "myapex.key",
4135 public_key: "testkey.avbpubkey",
4136 private_key: "testkey.pem",
4137 }
4138
4139 vndk_prebuilt_shared {
4140 name: "libvndk27",
4141 version: "27",
4142 target_arch: "arm",
4143 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004144 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 vndk: {
4146 enabled: true,
4147 },
4148 arch: {
4149 arm: {
4150 srcs: ["libvndk27.so"],
4151 }
4152 },
4153 }
4154
4155 vndk_prebuilt_shared {
4156 name: "libvndk27",
4157 version: "27",
4158 target_arch: "arm",
4159 binder32bit: true,
4160 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004161 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004162 vndk: {
4163 enabled: true,
4164 },
4165 arch: {
4166 arm: {
4167 srcs: ["libvndk27binder32.so"],
4168 }
4169 },
Colin Cross2807f002021-03-02 10:15:29 -08004170 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004171 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004172 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004173 withFiles(map[string][]byte{
4174 "libvndk27.so": nil,
4175 "libvndk27binder32.so": nil,
4176 }),
4177 withBinder32bit,
4178 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004179 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004180 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4181 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004182 },
4183 }),
4184 )
4185
Jooyung Hana0503a52023-08-23 13:12:50 +09004186 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004187 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004188 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004189 })
4190}
4191
Jooyung Han45a96772020-06-15 14:59:42 +09004192func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004193 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004194 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004195 name: "com.android.vndk.current",
4196 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004197 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004198 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004199 }
4200
4201 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004202 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004203 public_key: "testkey.avbpubkey",
4204 private_key: "testkey.pem",
4205 }
4206
4207 cc_library {
4208 name: "libz",
4209 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004210 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004211 vndk: {
4212 enabled: true,
4213 },
4214 stubs: {
4215 symbol_file: "libz.map.txt",
4216 versions: ["30"],
4217 }
4218 }
4219 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4220 "libz.map.txt": nil,
4221 }))
4222
Jooyung Hana0503a52023-08-23 13:12:50 +09004223 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004224 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4225 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004226 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004227 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4228 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4229 "*/*",
4230 })
Jooyung Han45a96772020-06-15 14:59:42 +09004231}
4232
Jooyung Hane3f02812023-05-08 13:54:50 +09004233func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4234 ctx := testApex(t, "",
4235 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4236 variables.DeviceVndkVersion = proptools.StringPtr("27")
4237 }),
4238 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4239 cc.RegisterVendorSnapshotModules(ctx)
4240 }),
4241 withFiles(map[string][]byte{
4242 "vendor/foo/Android.bp": []byte(`
4243 apex {
4244 name: "myapex",
4245 binaries: ["foo"],
4246 key: "myapex.key",
4247 min_sdk_version: "27",
4248 vendor: true,
4249 }
4250
4251 cc_binary {
4252 name: "foo",
4253 vendor: true,
4254 srcs: ["abc.cpp"],
4255 shared_libs: [
4256 "libllndk",
4257 "libvndk",
4258 ],
4259 nocrt: true,
4260 system_shared_libs: [],
4261 min_sdk_version: "27",
4262 }
4263
4264 apex_key {
4265 name: "myapex.key",
4266 public_key: "testkey.avbpubkey",
4267 private_key: "testkey.pem",
4268 }
4269 `),
4270 // Simulate VNDK prebuilts with vendor_snapshot
4271 "prebuilts/vndk/Android.bp": []byte(`
4272 vndk_prebuilt_shared {
4273 name: "libllndk",
4274 version: "27",
4275 vendor_available: true,
4276 product_available: true,
4277 target_arch: "arm64",
4278 arch: {
4279 arm64: {
4280 srcs: ["libllndk.so"],
4281 },
4282 },
4283 }
4284
4285 vndk_prebuilt_shared {
4286 name: "libvndk",
4287 version: "27",
4288 vendor_available: true,
4289 product_available: true,
4290 target_arch: "arm64",
4291 arch: {
4292 arm64: {
4293 srcs: ["libvndk.so"],
4294 },
4295 },
4296 vndk: {
4297 enabled: true,
4298 },
4299 min_sdk_version: "27",
4300 }
4301
4302 vndk_prebuilt_shared {
4303 name: "libc++",
4304 version: "27",
4305 target_arch: "arm64",
4306 vendor_available: true,
4307 product_available: true,
4308 vndk: {
4309 enabled: true,
4310 support_system_process: true,
4311 },
4312 arch: {
4313 arm64: {
4314 srcs: ["libc++.so"],
4315 },
4316 },
4317 min_sdk_version: "apex_inherit",
4318 }
4319
4320 vendor_snapshot {
4321 name: "vendor_snapshot",
4322 version: "27",
4323 arch: {
4324 arm64: {
4325 vndk_libs: [
4326 "libc++",
4327 "libllndk",
4328 "libvndk",
4329 ],
4330 static_libs: [
4331 "libc++demangle",
4332 "libclang_rt.builtins",
4333 "libunwind",
4334 ],
4335 },
4336 }
4337 }
4338
4339 vendor_snapshot_static {
4340 name: "libclang_rt.builtins",
4341 version: "27",
4342 target_arch: "arm64",
4343 vendor: true,
4344 arch: {
4345 arm64: {
4346 src: "libclang_rt.builtins-aarch64-android.a",
4347 },
4348 },
4349 }
4350
4351 vendor_snapshot_static {
4352 name: "libc++demangle",
4353 version: "27",
4354 target_arch: "arm64",
4355 compile_multilib: "64",
4356 vendor: true,
4357 arch: {
4358 arm64: {
4359 src: "libc++demangle.a",
4360 },
4361 },
4362 min_sdk_version: "apex_inherit",
4363 }
4364
4365 vendor_snapshot_static {
4366 name: "libunwind",
4367 version: "27",
4368 target_arch: "arm64",
4369 compile_multilib: "64",
4370 vendor: true,
4371 arch: {
4372 arm64: {
4373 src: "libunwind.a",
4374 },
4375 },
4376 min_sdk_version: "apex_inherit",
4377 }
4378 `),
4379 }))
4380
4381 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004382 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004383 "bin/foo",
4384 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4385 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4386 })
4387
4388 // Should link foo with prebuilt libraries (shared/static)
4389 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4390 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4391 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4392 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4393 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4394
4395 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004396 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004397 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4398 ensureListContains(t, requireNativeLibs, "libllndk.so")
4399}
4400
Jooyung Hane1633032019-08-01 17:41:43 +09004401func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004402 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004403 apex {
4404 name: "myapex_nodep",
4405 key: "myapex.key",
4406 native_shared_libs: ["lib_nodep"],
4407 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004408 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004410 }
4411
4412 apex {
4413 name: "myapex_dep",
4414 key: "myapex.key",
4415 native_shared_libs: ["lib_dep"],
4416 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004417 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004418 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 apex {
4422 name: "myapex_provider",
4423 key: "myapex.key",
4424 native_shared_libs: ["libfoo"],
4425 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004426 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004427 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004428 }
4429
4430 apex {
4431 name: "myapex_selfcontained",
4432 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004433 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004434 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004435 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004436 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 apex_key {
4440 name: "myapex.key",
4441 public_key: "testkey.avbpubkey",
4442 private_key: "testkey.pem",
4443 }
4444
4445 cc_library {
4446 name: "lib_nodep",
4447 srcs: ["mylib.cpp"],
4448 system_shared_libs: [],
4449 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004450 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004451 }
4452
4453 cc_library {
4454 name: "lib_dep",
4455 srcs: ["mylib.cpp"],
4456 shared_libs: ["libfoo"],
4457 system_shared_libs: [],
4458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004459 apex_available: [
4460 "myapex_dep",
4461 "myapex_provider",
4462 "myapex_selfcontained",
4463 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004464 }
4465
4466 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004467 name: "lib_dep_on_bar",
4468 srcs: ["mylib.cpp"],
4469 shared_libs: ["libbar"],
4470 system_shared_libs: [],
4471 stl: "none",
4472 apex_available: [
4473 "myapex_selfcontained",
4474 ],
4475 }
4476
4477
4478 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004479 name: "libfoo",
4480 srcs: ["mytest.cpp"],
4481 stubs: {
4482 versions: ["1"],
4483 },
4484 system_shared_libs: [],
4485 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004486 apex_available: [
4487 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004488 ],
4489 }
4490
4491 cc_library {
4492 name: "libbar",
4493 srcs: ["mytest.cpp"],
4494 stubs: {
4495 versions: ["1"],
4496 },
4497 system_shared_libs: [],
4498 stl: "none",
4499 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004500 "myapex_selfcontained",
4501 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004502 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004503
Jooyung Hane1633032019-08-01 17:41:43 +09004504 `)
4505
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004506 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004507 var provideNativeLibs, requireNativeLibs []string
4508
Jooyung Hana0503a52023-08-23 13:12:50 +09004509 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004510 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4511 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004512 ensureListEmpty(t, provideNativeLibs)
4513 ensureListEmpty(t, requireNativeLibs)
4514
Jooyung Hana0503a52023-08-23 13:12:50 +09004515 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004516 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4517 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004518 ensureListEmpty(t, provideNativeLibs)
4519 ensureListContains(t, requireNativeLibs, "libfoo.so")
4520
Jooyung Hana0503a52023-08-23 13:12:50 +09004521 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004522 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4523 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004524 ensureListContains(t, provideNativeLibs, "libfoo.so")
4525 ensureListEmpty(t, requireNativeLibs)
4526
Jooyung Hana0503a52023-08-23 13:12:50 +09004527 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004528 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4529 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004530 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004531 ensureListEmpty(t, requireNativeLibs)
4532}
4533
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004534func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4535 ctx := testApex(t, `
4536 apex {
4537 name: "myapex",
4538 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004539 native_shared_libs: ["mylib"],
4540 updatable: false,
4541 }
4542
4543 apex_key {
4544 name: "myapex.key",
4545 public_key: "testkey.avbpubkey",
4546 private_key: "testkey.pem",
4547 }
4548
4549 cc_library {
4550 name: "mylib",
4551 srcs: ["mylib.cpp"],
4552 system_shared_libs: [],
4553 stl: "none",
4554 apex_available: [
4555 "//apex_available:platform",
4556 "myapex",
4557 ],
4558 }
4559 `, android.FixtureMergeEnv(map[string]string{
4560 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4561 }))
4562
Jooyung Hana0503a52023-08-23 13:12:50 +09004563 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004564 apexManifestRule := module.Rule("apexManifestRule")
4565 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4566}
4567
Vinh Tran8f5310f2022-10-07 18:16:47 -04004568func TestCompileMultilibProp(t *testing.T) {
4569 testCases := []struct {
4570 compileMultiLibProp string
4571 containedLibs []string
4572 notContainedLibs []string
4573 }{
4574 {
4575 containedLibs: []string{
4576 "image.apex/lib64/mylib.so",
4577 "image.apex/lib/mylib.so",
4578 },
4579 compileMultiLibProp: `compile_multilib: "both",`,
4580 },
4581 {
4582 containedLibs: []string{"image.apex/lib64/mylib.so"},
4583 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4584 compileMultiLibProp: `compile_multilib: "first",`,
4585 },
4586 {
4587 containedLibs: []string{"image.apex/lib64/mylib.so"},
4588 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4589 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4590 },
4591 {
4592 containedLibs: []string{"image.apex/lib64/mylib.so"},
4593 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4594 compileMultiLibProp: `compile_multilib: "64",`,
4595 },
4596 {
4597 containedLibs: []string{"image.apex/lib/mylib.so"},
4598 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4599 compileMultiLibProp: `compile_multilib: "32",`,
4600 },
4601 }
4602 for _, testCase := range testCases {
4603 ctx := testApex(t, fmt.Sprintf(`
4604 apex {
4605 name: "myapex",
4606 key: "myapex.key",
4607 %s
4608 native_shared_libs: ["mylib"],
4609 updatable: false,
4610 }
4611 apex_key {
4612 name: "myapex.key",
4613 public_key: "testkey.avbpubkey",
4614 private_key: "testkey.pem",
4615 }
4616 cc_library {
4617 name: "mylib",
4618 srcs: ["mylib.cpp"],
4619 apex_available: [
4620 "//apex_available:platform",
4621 "myapex",
4622 ],
4623 }
4624 `, testCase.compileMultiLibProp),
4625 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004626 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004627 apexRule := module.Rule("apexRule")
4628 copyCmds := apexRule.Args["copy_commands"]
4629 for _, containedLib := range testCase.containedLibs {
4630 ensureContains(t, copyCmds, containedLib)
4631 }
4632 for _, notContainedLib := range testCase.notContainedLibs {
4633 ensureNotContains(t, copyCmds, notContainedLib)
4634 }
4635 }
4636}
4637
Alex Light0851b882019-02-07 13:20:53 -08004638func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004639 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004640 apex {
4641 name: "myapex",
4642 key: "myapex.key",
4643 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004644 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004645 }
4646
4647 apex_key {
4648 name: "myapex.key",
4649 public_key: "testkey.avbpubkey",
4650 private_key: "testkey.pem",
4651 }
4652
4653 cc_library {
4654 name: "mylib_common",
4655 srcs: ["mylib.cpp"],
4656 system_shared_libs: [],
4657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004658 apex_available: [
4659 "//apex_available:platform",
4660 "myapex",
4661 ],
Alex Light0851b882019-02-07 13:20:53 -08004662 }
4663 `)
4664
Jooyung Hana0503a52023-08-23 13:12:50 +09004665 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004666 apexRule := module.Rule("apexRule")
4667 copyCmds := apexRule.Args["copy_commands"]
4668
4669 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4670 t.Log("Apex was a test apex!")
4671 t.Fail()
4672 }
4673 // Ensure that main rule creates an output
4674 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4675
4676 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004677 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004678
4679 // Ensure that both direct and indirect deps are copied into apex
4680 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4681
Colin Cross7113d202019-11-20 16:39:12 -08004682 // Ensure that the platform variant ends with _shared
4683 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004684
Colin Cross56a83212020-09-15 18:30:11 -07004685 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004686 t.Log("Found mylib_common not in any apex!")
4687 t.Fail()
4688 }
4689}
4690
4691func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004692 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004693 apex_test {
4694 name: "myapex",
4695 key: "myapex.key",
4696 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004697 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004698 }
4699
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705
4706 cc_library {
4707 name: "mylib_common_test",
4708 srcs: ["mylib.cpp"],
4709 system_shared_libs: [],
4710 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004711 // TODO: remove //apex_available:platform
4712 apex_available: [
4713 "//apex_available:platform",
4714 "myapex",
4715 ],
Alex Light0851b882019-02-07 13:20:53 -08004716 }
4717 `)
4718
Jooyung Hana0503a52023-08-23 13:12:50 +09004719 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004720 apexRule := module.Rule("apexRule")
4721 copyCmds := apexRule.Args["copy_commands"]
4722
4723 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4724 t.Log("Apex was not a test apex!")
4725 t.Fail()
4726 }
4727 // Ensure that main rule creates an output
4728 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4729
4730 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004731 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004732
4733 // Ensure that both direct and indirect deps are copied into apex
4734 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4735
Colin Cross7113d202019-11-20 16:39:12 -08004736 // Ensure that the platform variant ends with _shared
4737 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004738}
4739
Jooyung Han85707de2023-12-01 14:21:13 +09004740func TestLibzVendorIsntStable(t *testing.T) {
4741 ctx := testApex(t, `
4742 apex {
4743 name: "myapex",
4744 key: "myapex.key",
4745 updatable: false,
4746 binaries: ["mybin"],
4747 }
4748 apex {
4749 name: "myvendorapex",
4750 key: "myapex.key",
4751 file_contexts: "myvendorapex_file_contexts",
4752 vendor: true,
4753 updatable: false,
4754 binaries: ["mybin"],
4755 }
4756 apex_key {
4757 name: "myapex.key",
4758 public_key: "testkey.avbpubkey",
4759 private_key: "testkey.pem",
4760 }
4761 cc_binary {
4762 name: "mybin",
4763 vendor_available: true,
4764 system_shared_libs: [],
4765 stl: "none",
4766 shared_libs: ["libz"],
4767 apex_available: ["//apex_available:anyapex"],
4768 }
4769 cc_library {
4770 name: "libz",
4771 vendor_available: true,
4772 system_shared_libs: [],
4773 stl: "none",
4774 stubs: {
4775 versions: ["28", "30"],
4776 },
4777 target: {
4778 vendor: {
4779 no_stubs: true,
4780 },
4781 },
4782 }
4783 `, withFiles(map[string][]byte{
4784 "myvendorapex_file_contexts": nil,
4785 }))
4786
4787 // libz provides stubs for core variant.
4788 {
4789 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4790 "bin/mybin",
4791 })
4792 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4793 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4794 }
4795 // libz doesn't provide stubs for vendor variant.
4796 {
4797 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4798 "bin/mybin",
4799 "lib64/libz.so",
4800 })
4801 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4802 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4803 }
4804}
4805
Alex Light9670d332019-01-29 18:07:33 -08004806func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004807 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004808 apex {
4809 name: "myapex",
4810 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004811 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004812 multilib: {
4813 first: {
4814 native_shared_libs: ["mylib_common"],
4815 }
4816 },
4817 target: {
4818 android: {
4819 multilib: {
4820 first: {
4821 native_shared_libs: ["mylib"],
4822 }
4823 }
4824 },
4825 host: {
4826 multilib: {
4827 first: {
4828 native_shared_libs: ["mylib2"],
4829 }
4830 }
4831 }
4832 }
4833 }
4834
4835 apex_key {
4836 name: "myapex.key",
4837 public_key: "testkey.avbpubkey",
4838 private_key: "testkey.pem",
4839 }
4840
4841 cc_library {
4842 name: "mylib",
4843 srcs: ["mylib.cpp"],
4844 system_shared_libs: [],
4845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004846 // TODO: remove //apex_available:platform
4847 apex_available: [
4848 "//apex_available:platform",
4849 "myapex",
4850 ],
Alex Light9670d332019-01-29 18:07:33 -08004851 }
4852
4853 cc_library {
4854 name: "mylib_common",
4855 srcs: ["mylib.cpp"],
4856 system_shared_libs: [],
4857 stl: "none",
4858 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004859 // TODO: remove //apex_available:platform
4860 apex_available: [
4861 "//apex_available:platform",
4862 "myapex",
4863 ],
Alex Light9670d332019-01-29 18:07:33 -08004864 }
4865
4866 cc_library {
4867 name: "mylib2",
4868 srcs: ["mylib.cpp"],
4869 system_shared_libs: [],
4870 stl: "none",
4871 compile_multilib: "first",
4872 }
4873 `)
4874
Jooyung Hana0503a52023-08-23 13:12:50 +09004875 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004876 copyCmds := apexRule.Args["copy_commands"]
4877
4878 // Ensure that main rule creates an output
4879 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4880
4881 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004882 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4884 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004885
4886 // Ensure that both direct and indirect deps are copied into apex
4887 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4888 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4889 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4890
Colin Cross7113d202019-11-20 16:39:12 -08004891 // Ensure that the platform variant ends with _shared
4892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4893 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4894 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004895}
Jiyong Park04480cf2019-02-06 00:16:29 +09004896
Jiyong Park59140302020-12-14 18:44:04 +09004897func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004898 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004899 apex {
4900 name: "myapex",
4901 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004902 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004903 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004904 arch: {
4905 arm64: {
4906 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004907 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004908 },
4909 x86_64: {
4910 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004911 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004912 },
4913 }
4914 }
4915
4916 apex_key {
4917 name: "myapex.key",
4918 public_key: "testkey.avbpubkey",
4919 private_key: "testkey.pem",
4920 }
4921
4922 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004923 name: "mylib.generic",
4924 srcs: ["mylib.cpp"],
4925 system_shared_libs: [],
4926 stl: "none",
4927 // TODO: remove //apex_available:platform
4928 apex_available: [
4929 "//apex_available:platform",
4930 "myapex",
4931 ],
4932 }
4933
4934 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004935 name: "mylib.arm64",
4936 srcs: ["mylib.cpp"],
4937 system_shared_libs: [],
4938 stl: "none",
4939 // TODO: remove //apex_available:platform
4940 apex_available: [
4941 "//apex_available:platform",
4942 "myapex",
4943 ],
4944 }
4945
4946 cc_library {
4947 name: "mylib.x64",
4948 srcs: ["mylib.cpp"],
4949 system_shared_libs: [],
4950 stl: "none",
4951 // TODO: remove //apex_available:platform
4952 apex_available: [
4953 "//apex_available:platform",
4954 "myapex",
4955 ],
4956 }
4957 `)
4958
Jooyung Hana0503a52023-08-23 13:12:50 +09004959 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004960 copyCmds := apexRule.Args["copy_commands"]
4961
4962 // Ensure that apex variant is created for the direct dep
4963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004964 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004965 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4966
4967 // Ensure that both direct and indirect deps are copied into apex
4968 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4969 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4970}
4971
Jiyong Park04480cf2019-02-06 00:16:29 +09004972func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004973 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004974 apex {
4975 name: "myapex",
4976 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004977 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004978 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004979 }
4980
4981 apex_key {
4982 name: "myapex.key",
4983 public_key: "testkey.avbpubkey",
4984 private_key: "testkey.pem",
4985 }
4986
4987 sh_binary {
4988 name: "myscript",
4989 src: "mylib.cpp",
4990 filename: "myscript.sh",
4991 sub_dir: "script",
4992 }
4993 `)
4994
Jooyung Hana0503a52023-08-23 13:12:50 +09004995 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004996 copyCmds := apexRule.Args["copy_commands"]
4997
4998 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4999}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005000
Jooyung Han91df2082019-11-20 01:49:42 +09005001func TestApexInVariousPartition(t *testing.T) {
5002 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005003 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005004 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005005 {"", "system"},
5006 {"product_specific: true", "product"},
5007 {"soc_specific: true", "vendor"},
5008 {"proprietary: true", "vendor"},
5009 {"vendor: true", "vendor"},
5010 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005011 }
5012 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005013 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005014 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005018 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005019 `+tc.propName+`
5020 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005021
Jooyung Han91df2082019-11-20 01:49:42 +09005022 apex_key {
5023 name: "myapex.key",
5024 public_key: "testkey.avbpubkey",
5025 private_key: "testkey.pem",
5026 }
5027 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005028
Jooyung Hana0503a52023-08-23 13:12:50 +09005029 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005030 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005031 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005032 if actual != expected {
5033 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5034 }
Jooyung Han91df2082019-11-20 01:49:42 +09005035 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005036 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005037}
Jiyong Park67882562019-03-21 01:11:21 +09005038
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005040 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 apex {
5042 name: "myapex",
5043 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005044 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex_key {
5048 name: "myapex.key",
5049 public_key: "testkey.avbpubkey",
5050 private_key: "testkey.pem",
5051 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005052 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005053 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054 rule := module.Output("file_contexts")
5055 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5056}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005057
Jooyung Han580eb4f2020-06-24 19:33:06 +09005058func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060 apex {
5061 name: "myapex",
5062 key: "myapex.key",
5063 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005064 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005065 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005066
Jooyung Han580eb4f2020-06-24 19:33:06 +09005067 apex_key {
5068 name: "myapex.key",
5069 public_key: "testkey.avbpubkey",
5070 private_key: "testkey.pem",
5071 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005072 `, withFiles(map[string][]byte{
5073 "my_own_file_contexts": nil,
5074 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005075}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079 apex {
5080 name: "myapex",
5081 key: "myapex.key",
5082 product_specific: true,
5083 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005084 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086
Jooyung Han580eb4f2020-06-24 19:33:06 +09005087 apex_key {
5088 name: "myapex.key",
5089 public_key: "testkey.avbpubkey",
5090 private_key: "testkey.pem",
5091 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005092 `)
5093
Colin Cross1c460562021-02-16 17:55:47 -08005094 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005095 apex {
5096 name: "myapex",
5097 key: "myapex.key",
5098 product_specific: true,
5099 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005100 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005102
Jooyung Han580eb4f2020-06-24 19:33:06 +09005103 apex_key {
5104 name: "myapex.key",
5105 public_key: "testkey.avbpubkey",
5106 private_key: "testkey.pem",
5107 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005108 `, withFiles(map[string][]byte{
5109 "product_specific_file_contexts": nil,
5110 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 rule := module.Output("file_contexts")
5113 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5114}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005115
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005117 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005118 apex {
5119 name: "myapex",
5120 key: "myapex.key",
5121 product_specific: true,
5122 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005123 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005124 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005125
Jooyung Han580eb4f2020-06-24 19:33:06 +09005126 apex_key {
5127 name: "myapex.key",
5128 public_key: "testkey.avbpubkey",
5129 private_key: "testkey.pem",
5130 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005131
Jooyung Han580eb4f2020-06-24 19:33:06 +09005132 filegroup {
5133 name: "my-file-contexts",
5134 srcs: ["product_specific_file_contexts"],
5135 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005136 `, withFiles(map[string][]byte{
5137 "product_specific_file_contexts": nil,
5138 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005139 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005140 rule := module.Output("file_contexts")
5141 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005142}
5143
Jiyong Park67882562019-03-21 01:11:21 +09005144func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005145 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005146 apex_key {
5147 name: "myapex.key",
5148 public_key: ":my.avbpubkey",
5149 private_key: ":my.pem",
5150 product_specific: true,
5151 }
5152
5153 filegroup {
5154 name: "my.avbpubkey",
5155 srcs: ["testkey2.avbpubkey"],
5156 }
5157
5158 filegroup {
5159 name: "my.pem",
5160 srcs: ["testkey2.pem"],
5161 }
5162 `)
5163
5164 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5165 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005166 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005167 if actual_pubkey != expected_pubkey {
5168 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5169 }
5170 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005171 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005172 if actual_privkey != expected_privkey {
5173 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5174 }
5175}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005176
5177func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005178 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005179 prebuilt_apex {
5180 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005181 arch: {
5182 arm64: {
5183 src: "myapex-arm64.apex",
5184 },
5185 arm: {
5186 src: "myapex-arm.apex",
5187 },
5188 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005189 }
5190 `)
5191
Wei Li340ee8e2022-03-18 17:33:24 -07005192 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5193 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005194
Jiyong Parkc95714e2019-03-29 14:23:10 +09005195 expectedInput := "myapex-arm64.apex"
5196 if prebuilt.inputApex.String() != expectedInput {
5197 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5198 }
Wei Li340ee8e2022-03-18 17:33:24 -07005199 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5200 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5201 rule := testingModule.Rule("genProvenanceMetaData")
5202 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5203 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5204 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5205 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005206
5207 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5208 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005209}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005210
Paul Duffinc0609c62021-03-01 17:27:16 +00005211func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005212 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005213 prebuilt_apex {
5214 name: "myapex",
5215 }
5216 `)
5217}
5218
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005219func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005220 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005221 prebuilt_apex {
5222 name: "myapex",
5223 src: "myapex-arm.apex",
5224 filename: "notmyapex.apex",
5225 }
5226 `)
5227
Wei Li340ee8e2022-03-18 17:33:24 -07005228 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5229 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005230
5231 expected := "notmyapex.apex"
5232 if p.installFilename != expected {
5233 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5234 }
Wei Li340ee8e2022-03-18 17:33:24 -07005235 rule := testingModule.Rule("genProvenanceMetaData")
5236 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5237 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5238 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5239 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005240}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005241
Samiul Islam7c02e262021-09-08 17:48:28 +01005242func TestApexSetFilenameOverride(t *testing.T) {
5243 testApex(t, `
5244 apex_set {
5245 name: "com.company.android.myapex",
5246 apex_name: "com.android.myapex",
5247 set: "company-myapex.apks",
5248 filename: "com.company.android.myapex.apex"
5249 }
5250 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5251
5252 testApex(t, `
5253 apex_set {
5254 name: "com.company.android.myapex",
5255 apex_name: "com.android.myapex",
5256 set: "company-myapex.apks",
5257 filename: "com.company.android.myapex.capex"
5258 }
5259 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5260
5261 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5262 apex_set {
5263 name: "com.company.android.myapex",
5264 apex_name: "com.android.myapex",
5265 set: "company-myapex.apks",
5266 filename: "some-random-suffix"
5267 }
5268 `)
5269}
5270
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005271func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005272 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005273 prebuilt_apex {
5274 name: "myapex.prebuilt",
5275 src: "myapex-arm.apex",
5276 overrides: [
5277 "myapex",
5278 ],
5279 }
5280 `)
5281
Wei Li340ee8e2022-03-18 17:33:24 -07005282 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5283 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005284
5285 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005286 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005287 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005288 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005289 }
Wei Li340ee8e2022-03-18 17:33:24 -07005290 rule := testingModule.Rule("genProvenanceMetaData")
5291 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5292 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5293 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5294 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005295}
5296
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005297func TestPrebuiltApexName(t *testing.T) {
5298 testApex(t, `
5299 prebuilt_apex {
5300 name: "com.company.android.myapex",
5301 apex_name: "com.android.myapex",
5302 src: "company-myapex-arm.apex",
5303 }
5304 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5305
5306 testApex(t, `
5307 apex_set {
5308 name: "com.company.android.myapex",
5309 apex_name: "com.android.myapex",
5310 set: "company-myapex.apks",
5311 }
5312 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5313}
5314
5315func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5316 _ = android.GroupFixturePreparers(
5317 java.PrepareForTestWithJavaDefaultModules,
5318 PrepareForTestWithApexBuildComponents,
5319 android.FixtureWithRootAndroidBp(`
5320 platform_bootclasspath {
5321 name: "platform-bootclasspath",
5322 fragments: [
5323 {
5324 apex: "com.android.art",
5325 module: "art-bootclasspath-fragment",
5326 },
5327 ],
5328 }
5329
5330 prebuilt_apex {
5331 name: "com.company.android.art",
5332 apex_name: "com.android.art",
5333 src: "com.company.android.art-arm.apex",
5334 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5335 }
5336
5337 prebuilt_bootclasspath_fragment {
5338 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005339 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005340 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005341 hidden_api: {
5342 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5343 metadata: "my-bootclasspath-fragment/metadata.csv",
5344 index: "my-bootclasspath-fragment/index.csv",
5345 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5346 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5347 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005348 }
5349
5350 java_import {
5351 name: "core-oj",
5352 jars: ["prebuilt.jar"],
5353 }
5354 `),
5355 ).RunTest(t)
5356}
5357
Spandan Das59a4a2b2024-01-09 21:35:56 +00005358// A minimal context object for use with DexJarBuildPath
5359type moduleErrorfTestCtx struct {
5360}
5361
5362func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5363}
5364
Paul Duffin092153d2021-01-26 11:42:39 +00005365// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5366// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005367func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005368 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005369
Paul Duffin89886cb2021-02-05 16:44:03 +00005370 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005371 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005372 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005373 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005374 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005375 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005376 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005377 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005378 android.NormalizePathForTesting(dexJarBuildPath))
5379 }
5380
5381 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005382 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005383 // Make sure the import has been given the correct path to the dex jar.
5384 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5385 dexJarBuildPath := p.DexJarInstallPath()
5386 stem := android.RemoveOptionalPrebuiltPrefix(name)
5387 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5388 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5389 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005390 }
5391
Paul Duffin39853512021-02-26 11:09:39 +00005392 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005393 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005394 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005395 android.AssertArrayString(t, "Check if there is no source variant",
5396 []string{"android_common"},
5397 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005398 }
5399
5400 t.Run("prebuilt only", func(t *testing.T) {
5401 bp := `
5402 prebuilt_apex {
5403 name: "myapex",
5404 arch: {
5405 arm64: {
5406 src: "myapex-arm64.apex",
5407 },
5408 arm: {
5409 src: "myapex-arm.apex",
5410 },
5411 },
Paul Duffin39853512021-02-26 11:09:39 +00005412 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005413 }
5414
5415 java_import {
5416 name: "libfoo",
5417 jars: ["libfoo.jar"],
5418 }
Paul Duffin39853512021-02-26 11:09:39 +00005419
5420 java_sdk_library_import {
5421 name: "libbar",
5422 public: {
5423 jars: ["libbar.jar"],
5424 },
5425 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005426 `
5427
5428 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5429 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5430
Spandan Das3576e762024-01-03 18:57:03 +00005431 deapexerName := deapexerModuleName("prebuilt_myapex")
5432 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005433
Paul Duffinf6932af2021-02-26 18:21:56 +00005434 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005435 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005436 rule := deapexer.Rule("deapexer")
5437 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5438 t.Errorf("expected: %q, found: %q", expected, actual)
5439 }
5440
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005441 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005442 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005443 rule = prebuiltApex.Rule("android/soong/android.Cp")
5444 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5445 t.Errorf("expected: %q, found: %q", expected, actual)
5446 }
5447
Paul Duffin89886cb2021-02-05 16:44:03 +00005448 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005450
5451 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005452 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005453 })
5454
5455 t.Run("prebuilt with source preferred", func(t *testing.T) {
5456
5457 bp := `
5458 prebuilt_apex {
5459 name: "myapex",
5460 arch: {
5461 arm64: {
5462 src: "myapex-arm64.apex",
5463 },
5464 arm: {
5465 src: "myapex-arm.apex",
5466 },
5467 },
Paul Duffin39853512021-02-26 11:09:39 +00005468 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005469 }
5470
5471 java_import {
5472 name: "libfoo",
5473 jars: ["libfoo.jar"],
5474 }
5475
5476 java_library {
5477 name: "libfoo",
5478 }
Paul Duffin39853512021-02-26 11:09:39 +00005479
5480 java_sdk_library_import {
5481 name: "libbar",
5482 public: {
5483 jars: ["libbar.jar"],
5484 },
5485 }
5486
5487 java_sdk_library {
5488 name: "libbar",
5489 srcs: ["foo/bar/MyClass.java"],
5490 unsafe_ignore_missing_latest_api: true,
5491 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005492 `
5493
5494 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5495 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5496
Paul Duffin89886cb2021-02-05 16:44:03 +00005497 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005498 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005499 ensureNoSourceVariant(t, ctx, "libfoo")
5500
5501 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005502 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005503 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005504 })
5505
5506 t.Run("prebuilt preferred with source", func(t *testing.T) {
5507 bp := `
5508 prebuilt_apex {
5509 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005510 arch: {
5511 arm64: {
5512 src: "myapex-arm64.apex",
5513 },
5514 arm: {
5515 src: "myapex-arm.apex",
5516 },
5517 },
Paul Duffin39853512021-02-26 11:09:39 +00005518 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005519 }
5520
5521 java_import {
5522 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005523 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005524 jars: ["libfoo.jar"],
5525 }
5526
5527 java_library {
5528 name: "libfoo",
5529 }
Paul Duffin39853512021-02-26 11:09:39 +00005530
5531 java_sdk_library_import {
5532 name: "libbar",
5533 prefer: true,
5534 public: {
5535 jars: ["libbar.jar"],
5536 },
5537 }
5538
5539 java_sdk_library {
5540 name: "libbar",
5541 srcs: ["foo/bar/MyClass.java"],
5542 unsafe_ignore_missing_latest_api: true,
5543 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005544 `
5545
5546 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5547 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5548
Paul Duffin89886cb2021-02-05 16:44:03 +00005549 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005550 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005551 ensureNoSourceVariant(t, ctx, "libfoo")
5552
5553 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005554 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005555 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005556 })
5557}
5558
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005559func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005560 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005561 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005562 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5563 // is disabled.
5564 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5565 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005566
Paul Duffin37856732021-02-26 14:24:15 +00005567 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5568 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005569 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005570 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005571 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005572 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005573 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 foundLibfooJar = true
5575 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005576 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005577 }
5578 }
5579 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005580 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
5582 }
5583
Paul Duffin40a3f652021-07-19 13:11:24 +01005584 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005585 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005586 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005587 var rule android.TestingBuildParams
5588
5589 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5590 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005591 }
5592
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5594 t.Helper()
5595 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5596 var rule android.TestingBuildParams
5597
5598 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5599 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5600 }
5601
Paul Duffin89f570a2021-06-16 01:42:33 +01005602 fragment := java.ApexVariantReference{
5603 Apex: proptools.StringPtr("myapex"),
5604 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5605 }
5606
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 t.Run("prebuilt only", func(t *testing.T) {
5608 bp := `
5609 prebuilt_apex {
5610 name: "myapex",
5611 arch: {
5612 arm64: {
5613 src: "myapex-arm64.apex",
5614 },
5615 arm: {
5616 src: "myapex-arm.apex",
5617 },
5618 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005619 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5620 }
5621
5622 prebuilt_bootclasspath_fragment {
5623 name: "my-bootclasspath-fragment",
5624 contents: ["libfoo", "libbar"],
5625 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005626 hidden_api: {
5627 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5628 metadata: "my-bootclasspath-fragment/metadata.csv",
5629 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005630 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5631 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5632 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005633 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 }
5635
5636 java_import {
5637 name: "libfoo",
5638 jars: ["libfoo.jar"],
5639 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005640 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005641 }
Paul Duffin37856732021-02-26 14:24:15 +00005642
5643 java_sdk_library_import {
5644 name: "libbar",
5645 public: {
5646 jars: ["libbar.jar"],
5647 },
5648 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005649 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005650 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005651 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005652 `
5653
Paul Duffin89f570a2021-06-16 01:42:33 +01005654 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005655 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5656 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005657
Paul Duffin537ea3d2021-05-14 10:38:00 +01005658 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005659 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005660 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005661 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005662 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005663 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005664 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005665 })
5666
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005667 t.Run("apex_set only", func(t *testing.T) {
5668 bp := `
5669 apex_set {
5670 name: "myapex",
5671 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005672 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005673 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005674 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5675 }
5676
5677 java_import {
5678 name: "myjavalib",
5679 jars: ["myjavalib.jar"],
5680 apex_available: ["myapex"],
5681 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005682 }
5683
5684 prebuilt_bootclasspath_fragment {
5685 name: "my-bootclasspath-fragment",
5686 contents: ["libfoo", "libbar"],
5687 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005688 hidden_api: {
5689 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5690 metadata: "my-bootclasspath-fragment/metadata.csv",
5691 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005692 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5693 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5694 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005695 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 }
5697
Liz Kammer2dc72442023-04-20 10:10:48 -04005698 prebuilt_systemserverclasspath_fragment {
5699 name: "my-systemserverclasspath-fragment",
5700 contents: ["libbaz"],
5701 apex_available: ["myapex"],
5702 }
5703
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005704 java_import {
5705 name: "libfoo",
5706 jars: ["libfoo.jar"],
5707 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005708 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005709 }
5710
5711 java_sdk_library_import {
5712 name: "libbar",
5713 public: {
5714 jars: ["libbar.jar"],
5715 },
5716 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005717 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005718 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005719 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005720
5721 java_sdk_library_import {
5722 name: "libbaz",
5723 public: {
5724 jars: ["libbaz.jar"],
5725 },
5726 apex_available: ["myapex"],
5727 shared_library: false,
5728 permitted_packages: ["baz"],
5729 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005730 `
5731
Paul Duffin89f570a2021-06-16 01:42:33 +01005732 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005733 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5734 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005735
Paul Duffin537ea3d2021-05-14 10:38:00 +01005736 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005737 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005738 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005739 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005740 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005741 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005742 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005743
5744 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5745
5746 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005747 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005748 "myjavalib.myapex",
5749 "libfoo.myapex",
5750 "libbar.myapex",
5751 "libbaz.myapex",
5752 }
5753 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5754 for i, e := range mkEntries {
5755 g := e.OverrideName
5756 if w := overrideNames[i]; w != g {
5757 t.Errorf("Expected override name %q, got %q", w, g)
5758 }
5759 }
5760
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005761 })
5762
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005763 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5764 bp := `
5765 prebuilt_apex {
5766 name: "myapex",
5767 arch: {
5768 arm64: {
5769 src: "myapex-arm64.apex",
5770 },
5771 arm: {
5772 src: "myapex-arm.apex",
5773 },
5774 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005775 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5776 }
5777
5778 prebuilt_bootclasspath_fragment {
5779 name: "my-bootclasspath-fragment",
5780 contents: ["libfoo", "libbar"],
5781 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005782 hidden_api: {
5783 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5784 metadata: "my-bootclasspath-fragment/metadata.csv",
5785 index: "my-bootclasspath-fragment/index.csv",
5786 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5787 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5788 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005789 }
5790
5791 java_import {
5792 name: "libfoo",
5793 jars: ["libfoo.jar"],
5794 apex_available: ["myapex"],
5795 }
5796
5797 java_library {
5798 name: "libfoo",
5799 srcs: ["foo/bar/MyClass.java"],
5800 apex_available: ["myapex"],
5801 }
Paul Duffin37856732021-02-26 14:24:15 +00005802
5803 java_sdk_library_import {
5804 name: "libbar",
5805 public: {
5806 jars: ["libbar.jar"],
5807 },
5808 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005809 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005810 }
5811
5812 java_sdk_library {
5813 name: "libbar",
5814 srcs: ["foo/bar/MyClass.java"],
5815 unsafe_ignore_missing_latest_api: true,
5816 apex_available: ["myapex"],
5817 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005818 `
5819
5820 // In this test the source (java_library) libfoo is active since the
5821 // prebuilt (java_import) defaults to prefer:false. However the
5822 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5823 // find the dex boot jar in it. We either need to disable the source libfoo
5824 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005825 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005826 // dexbootjar check is skipped if AllowMissingDependencies is true
5827 preparerAllowMissingDeps := android.GroupFixturePreparers(
5828 preparer,
5829 android.PrepareForTestWithAllowMissingDependencies,
5830 )
5831 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005832 })
5833
5834 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5835 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005836 apex {
5837 name: "myapex",
5838 key: "myapex.key",
5839 updatable: false,
5840 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5841 }
5842
5843 apex_key {
5844 name: "myapex.key",
5845 public_key: "testkey.avbpubkey",
5846 private_key: "testkey.pem",
5847 }
5848
5849 bootclasspath_fragment {
5850 name: "my-bootclasspath-fragment",
5851 contents: ["libfoo", "libbar"],
5852 apex_available: ["myapex"],
5853 hidden_api: {
5854 split_packages: ["*"],
5855 },
5856 }
5857
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005873 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005874 contents: ["libfoo", "libbar"],
5875 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005876 hidden_api: {
5877 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5878 metadata: "my-bootclasspath-fragment/metadata.csv",
5879 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005880 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5881 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5882 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005883 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005884 }
5885
5886 java_import {
5887 name: "libfoo",
5888 prefer: true,
5889 jars: ["libfoo.jar"],
5890 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005891 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005892 }
5893
5894 java_library {
5895 name: "libfoo",
5896 srcs: ["foo/bar/MyClass.java"],
5897 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005898 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005899 }
Paul Duffin37856732021-02-26 14:24:15 +00005900
5901 java_sdk_library_import {
5902 name: "libbar",
5903 prefer: true,
5904 public: {
5905 jars: ["libbar.jar"],
5906 },
5907 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005908 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005909 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005910 }
5911
5912 java_sdk_library {
5913 name: "libbar",
5914 srcs: ["foo/bar/MyClass.java"],
5915 unsafe_ignore_missing_latest_api: true,
5916 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005917 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005918 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005919 `
5920
Paul Duffin89f570a2021-06-16 01:42:33 +01005921 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005922 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5923 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005924
Paul Duffin537ea3d2021-05-14 10:38:00 +01005925 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005926 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005927 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005928 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005929 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005930 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005931 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005932 })
5933
5934 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5935 bp := `
5936 apex {
5937 name: "myapex",
5938 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005939 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005940 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005941 }
5942
5943 apex_key {
5944 name: "myapex.key",
5945 public_key: "testkey.avbpubkey",
5946 private_key: "testkey.pem",
5947 }
5948
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005949 bootclasspath_fragment {
5950 name: "my-bootclasspath-fragment",
5951 contents: ["libfoo", "libbar"],
5952 apex_available: ["myapex"],
5953 hidden_api: {
5954 split_packages: ["*"],
5955 },
5956 }
5957
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005958 prebuilt_apex {
5959 name: "myapex",
5960 arch: {
5961 arm64: {
5962 src: "myapex-arm64.apex",
5963 },
5964 arm: {
5965 src: "myapex-arm.apex",
5966 },
5967 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005968 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5969 }
5970
5971 prebuilt_bootclasspath_fragment {
5972 name: "my-bootclasspath-fragment",
5973 contents: ["libfoo", "libbar"],
5974 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005975 hidden_api: {
5976 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5977 metadata: "my-bootclasspath-fragment/metadata.csv",
5978 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005979 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5980 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5981 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005982 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005983 }
5984
5985 java_import {
5986 name: "libfoo",
5987 jars: ["libfoo.jar"],
5988 apex_available: ["myapex"],
5989 }
5990
5991 java_library {
5992 name: "libfoo",
5993 srcs: ["foo/bar/MyClass.java"],
5994 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005995 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005996 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005997 }
Paul Duffin37856732021-02-26 14:24:15 +00005998
5999 java_sdk_library_import {
6000 name: "libbar",
6001 public: {
6002 jars: ["libbar.jar"],
6003 },
6004 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006005 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006006 }
6007
6008 java_sdk_library {
6009 name: "libbar",
6010 srcs: ["foo/bar/MyClass.java"],
6011 unsafe_ignore_missing_latest_api: true,
6012 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006013 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006014 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006015 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006016 `
6017
Paul Duffin89f570a2021-06-16 01:42:33 +01006018 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006019 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6020 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006021
Paul Duffin537ea3d2021-05-14 10:38:00 +01006022 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006023 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006024 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6025 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006026 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6027 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006028 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006029 })
6030
6031 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6032 bp := `
6033 apex {
6034 name: "myapex",
6035 enabled: false,
6036 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006037 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006038 }
6039
6040 apex_key {
6041 name: "myapex.key",
6042 public_key: "testkey.avbpubkey",
6043 private_key: "testkey.pem",
6044 }
6045
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006046 bootclasspath_fragment {
6047 name: "my-bootclasspath-fragment",
6048 enabled: false,
6049 contents: ["libfoo", "libbar"],
6050 apex_available: ["myapex"],
6051 hidden_api: {
6052 split_packages: ["*"],
6053 },
6054 }
6055
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006056 prebuilt_apex {
6057 name: "myapex",
6058 arch: {
6059 arm64: {
6060 src: "myapex-arm64.apex",
6061 },
6062 arm: {
6063 src: "myapex-arm.apex",
6064 },
6065 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006066 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6067 }
6068
6069 prebuilt_bootclasspath_fragment {
6070 name: "my-bootclasspath-fragment",
6071 contents: ["libfoo", "libbar"],
6072 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006073 hidden_api: {
6074 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6075 metadata: "my-bootclasspath-fragment/metadata.csv",
6076 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006077 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6078 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6079 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006080 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006081 }
6082
6083 java_import {
6084 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006085 jars: ["libfoo.jar"],
6086 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006087 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006088 }
6089
6090 java_library {
6091 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006092 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006093 srcs: ["foo/bar/MyClass.java"],
6094 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006095 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006096 }
Paul Duffin37856732021-02-26 14:24:15 +00006097
6098 java_sdk_library_import {
6099 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006100 public: {
6101 jars: ["libbar.jar"],
6102 },
6103 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006104 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006105 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006106 }
6107
6108 java_sdk_library {
6109 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006110 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006111 srcs: ["foo/bar/MyClass.java"],
6112 unsafe_ignore_missing_latest_api: true,
6113 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006114 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006115 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006116 `
6117
Paul Duffin89f570a2021-06-16 01:42:33 +01006118 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006119 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6120 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006121
Paul Duffin537ea3d2021-05-14 10:38:00 +01006122 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006123 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006124 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006125 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006126 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006127 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006128 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006129 })
Spandan Das3a392012024-01-17 18:26:27 +00006130
6131 t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
6132 bp := `
6133 // Source
6134 apex {
6135 name: "myapex",
6136 enabled: false,
6137 key: "myapex.key",
6138 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6139 }
6140
6141 apex_key {
6142 name: "myapex.key",
6143 public_key: "testkey.avbpubkey",
6144 private_key: "testkey.pem",
6145 }
6146
6147 // Prebuilt
6148 prebuilt_apex {
6149 name: "myapex.v1",
6150 source_apex_name: "myapex",
6151 arch: {
6152 arm64: {
6153 src: "myapex-arm64.apex",
6154 },
6155 arm: {
6156 src: "myapex-arm.apex",
6157 },
6158 },
6159 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6160 prefer: true,
6161 }
6162 prebuilt_apex {
6163 name: "myapex.v2",
6164 source_apex_name: "myapex",
6165 arch: {
6166 arm64: {
6167 src: "myapex-arm64.apex",
6168 },
6169 arm: {
6170 src: "myapex-arm.apex",
6171 },
6172 },
6173 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6174 prefer: true,
6175 }
6176
6177 prebuilt_bootclasspath_fragment {
6178 name: "my-bootclasspath-fragment",
6179 contents: ["libfoo", "libbar"],
6180 apex_available: ["myapex"],
6181 hidden_api: {
6182 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6183 metadata: "my-bootclasspath-fragment/metadata.csv",
6184 index: "my-bootclasspath-fragment/index.csv",
6185 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6186 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6187 },
6188 prefer: true,
6189 }
6190
6191 java_import {
6192 name: "libfoo",
6193 jars: ["libfoo.jar"],
6194 apex_available: ["myapex"],
6195 prefer: true,
6196 }
6197 java_import {
6198 name: "libbar",
6199 jars: ["libbar.jar"],
6200 apex_available: ["myapex"],
6201 prefer: true,
6202 }
6203 `
6204
6205 testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
6206 })
6207
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006208}
6209
Roland Levillain630846d2019-06-26 12:48:34 +01006210func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006211 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006212 apex_test {
6213 name: "myapex",
6214 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006215 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006216 tests: [
6217 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006218 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006219 ],
6220 }
6221
6222 apex_key {
6223 name: "myapex.key",
6224 public_key: "testkey.avbpubkey",
6225 private_key: "testkey.pem",
6226 }
6227
Liz Kammer1c14a212020-05-12 15:26:55 -07006228 filegroup {
6229 name: "fg",
6230 srcs: [
6231 "baz",
6232 "bar/baz"
6233 ],
6234 }
6235
Roland Levillain630846d2019-06-26 12:48:34 +01006236 cc_test {
6237 name: "mytest",
6238 gtest: false,
6239 srcs: ["mytest.cpp"],
6240 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006241 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006242 system_shared_libs: [],
6243 static_executable: true,
6244 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006245 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006246 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006247
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006248 cc_library {
6249 name: "mylib",
6250 srcs: ["mylib.cpp"],
6251 system_shared_libs: [],
6252 stl: "none",
6253 }
6254
Liz Kammer5bd365f2020-05-27 15:15:11 -07006255 filegroup {
6256 name: "fg2",
6257 srcs: [
6258 "testdata/baz"
6259 ],
6260 }
6261
Roland Levillain9b5fde92019-06-28 15:41:19 +01006262 cc_test {
6263 name: "mytests",
6264 gtest: false,
6265 srcs: [
6266 "mytest1.cpp",
6267 "mytest2.cpp",
6268 "mytest3.cpp",
6269 ],
6270 test_per_src: true,
6271 relative_install_path: "test",
6272 system_shared_libs: [],
6273 static_executable: true,
6274 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006275 data: [
6276 ":fg",
6277 ":fg2",
6278 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006279 }
Roland Levillain630846d2019-06-26 12:48:34 +01006280 `)
6281
Jooyung Hana0503a52023-08-23 13:12:50 +09006282 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006283 copyCmds := apexRule.Args["copy_commands"]
6284
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006285 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006286 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006287 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006288
Liz Kammer1c14a212020-05-12 15:26:55 -07006289 //Ensure that test data are copied into apex.
6290 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6291 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6292
Roland Levillain9b5fde92019-06-28 15:41:19 +01006293 // Ensure that test deps built with `test_per_src` are copied into apex.
6294 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6295 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6296 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006297
6298 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006299 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006300 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006301 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006302 prefix := "TARGET_"
6303 var builder strings.Builder
6304 data.Custom(&builder, name, prefix, "", data)
6305 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006306 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6307 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6308 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6309 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006310 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006311}
6312
Jooyung Hand48f3c32019-08-23 11:18:57 +09006313func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6314 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6315 apex {
6316 name: "myapex",
6317 key: "myapex.key",
6318 native_shared_libs: ["libfoo"],
6319 }
6320
6321 apex_key {
6322 name: "myapex.key",
6323 public_key: "testkey.avbpubkey",
6324 private_key: "testkey.pem",
6325 }
6326
6327 cc_library {
6328 name: "libfoo",
6329 stl: "none",
6330 system_shared_libs: [],
6331 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006332 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006333 }
6334 `)
6335 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6336 apex {
6337 name: "myapex",
6338 key: "myapex.key",
6339 java_libs: ["myjar"],
6340 }
6341
6342 apex_key {
6343 name: "myapex.key",
6344 public_key: "testkey.avbpubkey",
6345 private_key: "testkey.pem",
6346 }
6347
6348 java_library {
6349 name: "myjar",
6350 srcs: ["foo/bar/MyClass.java"],
6351 sdk_version: "none",
6352 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006353 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006354 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006355 }
6356 `)
6357}
6358
Bill Peckhama41a6962021-01-11 10:58:54 -08006359func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006360 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006361 apex {
6362 name: "myapex",
6363 key: "myapex.key",
6364 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006365 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006366 }
6367
6368 apex_key {
6369 name: "myapex.key",
6370 public_key: "testkey.avbpubkey",
6371 private_key: "testkey.pem",
6372 }
6373
6374 java_import {
6375 name: "myjavaimport",
6376 apex_available: ["myapex"],
6377 jars: ["my.jar"],
6378 compile_dex: true,
6379 }
6380 `)
6381
Jooyung Hana0503a52023-08-23 13:12:50 +09006382 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006383 apexRule := module.Rule("apexRule")
6384 copyCmds := apexRule.Args["copy_commands"]
6385 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6386}
6387
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006388func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006389 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006390 apex {
6391 name: "myapex",
6392 key: "myapex.key",
6393 apps: [
6394 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006395 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006396 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006397 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006398 }
6399
6400 apex_key {
6401 name: "myapex.key",
6402 public_key: "testkey.avbpubkey",
6403 private_key: "testkey.pem",
6404 }
6405
6406 android_app {
6407 name: "AppFoo",
6408 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006409 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006410 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006411 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006412 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006413 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006414 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006415
6416 android_app {
6417 name: "AppFooPriv",
6418 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006419 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006420 system_modules: "none",
6421 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006422 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006423 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006424 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006425 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006426
6427 cc_library_shared {
6428 name: "libjni",
6429 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006430 shared_libs: ["libfoo"],
6431 stl: "none",
6432 system_shared_libs: [],
6433 apex_available: [ "myapex" ],
6434 sdk_version: "current",
6435 }
6436
6437 cc_library_shared {
6438 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006439 stl: "none",
6440 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006441 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006442 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006443 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006444 `)
6445
Jooyung Hana0503a52023-08-23 13:12:50 +09006446 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006447 apexRule := module.Rule("apexRule")
6448 copyCmds := apexRule.Args["copy_commands"]
6449
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006450 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6451 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006452 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006453
Colin Crossaede88c2020-08-11 12:17:01 -07006454 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006455 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006456 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006457 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006458 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006459 // JNI libraries including transitive deps are
6460 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006461 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006462 // ... embedded inside APK (jnilibs.zip)
6463 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6464 // ... and not directly inside the APEX
6465 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6466 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006467
6468 apexBundle := module.Module().(*apexBundle)
6469 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6470 var builder strings.Builder
6471 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6472 androidMk := builder.String()
6473 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6474 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6475 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6476 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6477 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6478 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 +01006479}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006480
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006481func TestApexWithAppImportBuildId(t *testing.T) {
6482 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6483 for _, id := range invalidBuildIds {
6484 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6485 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6486 variables.BuildId = proptools.StringPtr(id)
6487 })
6488 testApexError(t, message, `apex {
6489 name: "myapex",
6490 key: "myapex.key",
6491 apps: ["AppFooPrebuilt"],
6492 updatable: false,
6493 }
6494
6495 apex_key {
6496 name: "myapex.key",
6497 public_key: "testkey.avbpubkey",
6498 private_key: "testkey.pem",
6499 }
6500
6501 android_app_import {
6502 name: "AppFooPrebuilt",
6503 apk: "PrebuiltAppFoo.apk",
6504 presigned: true,
6505 apex_available: ["myapex"],
6506 }
6507 `, fixture)
6508 }
6509}
6510
Dario Frenicde2a032019-10-27 00:29:22 +01006511func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006512 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006513 apex {
6514 name: "myapex",
6515 key: "myapex.key",
6516 apps: [
6517 "AppFooPrebuilt",
6518 "AppFooPrivPrebuilt",
6519 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006520 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006521 }
6522
6523 apex_key {
6524 name: "myapex.key",
6525 public_key: "testkey.avbpubkey",
6526 private_key: "testkey.pem",
6527 }
6528
6529 android_app_import {
6530 name: "AppFooPrebuilt",
6531 apk: "PrebuiltAppFoo.apk",
6532 presigned: true,
6533 dex_preopt: {
6534 enabled: false,
6535 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006536 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006537 }
6538
6539 android_app_import {
6540 name: "AppFooPrivPrebuilt",
6541 apk: "PrebuiltAppFooPriv.apk",
6542 privileged: true,
6543 presigned: true,
6544 dex_preopt: {
6545 enabled: false,
6546 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006547 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006548 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006549 }
6550 `)
6551
Jooyung Hana0503a52023-08-23 13:12:50 +09006552 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006553 apexRule := module.Rule("apexRule")
6554 copyCmds := apexRule.Args["copy_commands"]
6555
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006556 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6557 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006558}
6559
6560func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006561 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006562 apex {
6563 name: "myapex",
6564 key: "myapex.key",
6565 apps: [
6566 "AppFoo",
6567 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006568 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006569 }
6570
6571 apex_key {
6572 name: "myapex.key",
6573 public_key: "testkey.avbpubkey",
6574 private_key: "testkey.pem",
6575 }
6576
6577 android_app {
6578 name: "AppFoo",
6579 srcs: ["foo/bar/MyClass.java"],
6580 sdk_version: "none",
6581 system_modules: "none",
6582 apex_available: [ "myapex" ],
6583 }
6584
6585 android_app_import {
6586 name: "AppFoo",
6587 apk: "AppFooPrebuilt.apk",
6588 filename: "AppFooPrebuilt.apk",
6589 presigned: true,
6590 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006591 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006592 }
6593 `, withFiles(map[string][]byte{
6594 "AppFooPrebuilt.apk": nil,
6595 }))
6596
Jooyung Hana0503a52023-08-23 13:12:50 +09006597 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006598 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006599 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006600}
6601
Dario Freni6f3937c2019-12-20 22:58:03 +00006602func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006603 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006604 apex {
6605 name: "myapex",
6606 key: "myapex.key",
6607 apps: [
6608 "TesterHelpAppFoo",
6609 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006610 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006611 }
6612
6613 apex_key {
6614 name: "myapex.key",
6615 public_key: "testkey.avbpubkey",
6616 private_key: "testkey.pem",
6617 }
6618
6619 android_test_helper_app {
6620 name: "TesterHelpAppFoo",
6621 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006622 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006623 }
6624
6625 `)
6626
Jooyung Hana0503a52023-08-23 13:12:50 +09006627 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006628 apexRule := module.Rule("apexRule")
6629 copyCmds := apexRule.Args["copy_commands"]
6630
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006631 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006632}
6633
Jooyung Han18020ea2019-11-13 10:50:48 +09006634func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6635 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006636 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006637 apex {
6638 name: "myapex",
6639 key: "myapex.key",
6640 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006641 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006642 }
6643
6644 apex_key {
6645 name: "myapex.key",
6646 public_key: "testkey.avbpubkey",
6647 private_key: "testkey.pem",
6648 }
6649
6650 apex {
6651 name: "otherapex",
6652 key: "myapex.key",
6653 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006654 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006655 }
6656
6657 cc_defaults {
6658 name: "libfoo-defaults",
6659 apex_available: ["otherapex"],
6660 }
6661
6662 cc_library {
6663 name: "libfoo",
6664 defaults: ["libfoo-defaults"],
6665 stl: "none",
6666 system_shared_libs: [],
6667 }`)
6668}
6669
Paul Duffine52e66f2020-03-30 17:54:29 +01006670func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006671 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006672 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006673 apex {
6674 name: "myapex",
6675 key: "myapex.key",
6676 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006677 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006678 }
6679
6680 apex_key {
6681 name: "myapex.key",
6682 public_key: "testkey.avbpubkey",
6683 private_key: "testkey.pem",
6684 }
6685
6686 apex {
6687 name: "otherapex",
6688 key: "otherapex.key",
6689 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006690 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006691 }
6692
6693 apex_key {
6694 name: "otherapex.key",
6695 public_key: "testkey.avbpubkey",
6696 private_key: "testkey.pem",
6697 }
6698
6699 cc_library {
6700 name: "libfoo",
6701 stl: "none",
6702 system_shared_libs: [],
6703 apex_available: ["otherapex"],
6704 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006705}
Jiyong Park127b40b2019-09-30 16:04:35 +09006706
Paul Duffine52e66f2020-03-30 17:54:29 +01006707func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006708 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006709 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006710.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006711.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006712.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006713.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006714.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006715.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006716 apex {
6717 name: "myapex",
6718 key: "myapex.key",
6719 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006720 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006721 }
6722
6723 apex_key {
6724 name: "myapex.key",
6725 public_key: "testkey.avbpubkey",
6726 private_key: "testkey.pem",
6727 }
6728
Jiyong Park127b40b2019-09-30 16:04:35 +09006729 cc_library {
6730 name: "libfoo",
6731 stl: "none",
6732 shared_libs: ["libbar"],
6733 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006734 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006735 }
6736
6737 cc_library {
6738 name: "libbar",
6739 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006740 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006741 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006742 apex_available: ["myapex"],
6743 }
6744
6745 cc_library {
6746 name: "libbaz",
6747 stl: "none",
6748 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006749 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006750}
Jiyong Park127b40b2019-09-30 16:04:35 +09006751
Liz Kammer5f108fa2023-05-11 14:33:17 -04006752func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6753 testApex(t, `
6754 apex {
6755 name: "myapex",
6756 key: "myapex.key",
6757 native_shared_libs: ["libfoo"],
6758 updatable: false,
6759 }
6760
6761 apex_key {
6762 name: "myapex.key",
6763 public_key: "testkey.avbpubkey",
6764 private_key: "testkey.pem",
6765 }
6766
6767 cc_library {
6768 name: "libfoo",
6769 stl: "none",
6770 static_libs: ["libbar"],
6771 system_shared_libs: [],
6772 apex_available: ["myapex"],
6773 }
6774
6775 cc_library {
6776 name: "libbar",
6777 stl: "none",
6778 shared_libs: ["libbaz"],
6779 system_shared_libs: [],
6780 apex_available: ["myapex"],
6781 }
6782
6783 cc_library {
6784 name: "libbaz",
6785 stl: "none",
6786 system_shared_libs: [],
6787 }`)
6788
6789 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6790 apex {
6791 name: "myapex",
6792 key: "myapex.key",
6793 native_shared_libs: ["libfoo"],
6794 updatable: false,
6795 }
6796
6797 apex_key {
6798 name: "myapex.key",
6799 public_key: "testkey.avbpubkey",
6800 private_key: "testkey.pem",
6801 }
6802
6803 cc_library {
6804 name: "libfoo",
6805 stl: "none",
6806 static_libs: ["libbar"],
6807 system_shared_libs: [],
6808 apex_available: ["myapex"],
6809 }
6810
6811 cc_library {
6812 name: "libbar",
6813 stl: "none",
6814 system_shared_libs: [],
6815 }`)
6816}
6817
Paul Duffine52e66f2020-03-30 17:54:29 +01006818func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006819 testApexError(t, "\"otherapex\" is not a valid module name", `
6820 apex {
6821 name: "myapex",
6822 key: "myapex.key",
6823 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006824 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006825 }
6826
6827 apex_key {
6828 name: "myapex.key",
6829 public_key: "testkey.avbpubkey",
6830 private_key: "testkey.pem",
6831 }
6832
6833 cc_library {
6834 name: "libfoo",
6835 stl: "none",
6836 system_shared_libs: [],
6837 apex_available: ["otherapex"],
6838 }`)
6839
Paul Duffine52e66f2020-03-30 17:54:29 +01006840 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006841 apex {
6842 name: "myapex",
6843 key: "myapex.key",
6844 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006845 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006846 }
6847
6848 apex_key {
6849 name: "myapex.key",
6850 public_key: "testkey.avbpubkey",
6851 private_key: "testkey.pem",
6852 }
6853
6854 cc_library {
6855 name: "libfoo",
6856 stl: "none",
6857 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006858 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006859 apex_available: ["myapex"],
6860 }
6861
6862 cc_library {
6863 name: "libbar",
6864 stl: "none",
6865 system_shared_libs: [],
6866 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006867 }
6868
6869 cc_library {
6870 name: "libbaz",
6871 stl: "none",
6872 system_shared_libs: [],
6873 stubs: {
6874 versions: ["10", "20", "30"],
6875 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006876 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006877}
Jiyong Park127b40b2019-09-30 16:04:35 +09006878
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006879func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6880 t.Run("negative variant_version produces error", func(t *testing.T) {
6881 testApexError(t, "expected an integer between 0-9; got -1", `
6882 apex {
6883 name: "myapex",
6884 key: "myapex.key",
6885 apex_available_name: "com.android.foo",
6886 variant_version: "-1",
6887 updatable: false,
6888 }
6889 apex_key {
6890 name: "myapex.key",
6891 public_key: "testkey.avbpubkey",
6892 private_key: "testkey.pem",
6893 }
6894 `)
6895 })
6896
6897 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6898 testApexError(t, "expected an integer between 0-9; got 10", `
6899 apex {
6900 name: "myapex",
6901 key: "myapex.key",
6902 apex_available_name: "com.android.foo",
6903 variant_version: "10",
6904 updatable: false,
6905 }
6906 apex_key {
6907 name: "myapex.key",
6908 public_key: "testkey.avbpubkey",
6909 private_key: "testkey.pem",
6910 }
6911 `)
6912 })
6913}
6914
6915func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6916 context := android.GroupFixturePreparers(
6917 android.PrepareForIntegrationTestWithAndroid,
6918 PrepareForTestWithApexBuildComponents,
6919 android.FixtureMergeMockFs(android.MockFS{
6920 "system/sepolicy/apex/foo-file_contexts": nil,
6921 "system/sepolicy/apex/bar-file_contexts": nil,
6922 }),
6923 )
6924 result := context.RunTestWithBp(t, `
6925 apex {
6926 name: "foo",
6927 key: "myapex.key",
6928 apex_available_name: "com.android.foo",
6929 variant_version: "0",
6930 updatable: false,
6931 }
6932 apex {
6933 name: "bar",
6934 key: "myapex.key",
6935 apex_available_name: "com.android.foo",
6936 variant_version: "3",
6937 updatable: false,
6938 }
6939 apex_key {
6940 name: "myapex.key",
6941 public_key: "testkey.avbpubkey",
6942 private_key: "testkey.pem",
6943 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006944 override_apex {
6945 name: "myoverrideapex",
6946 base: "bar",
6947 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006948 `)
6949
Jooyung Hana0503a52023-08-23 13:12:50 +09006950 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006951 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6952 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6953 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6954 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6955 }
6956
Jooyung Hana0503a52023-08-23 13:12:50 +09006957 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006958 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6959 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6960 barActualDefaultVersion := barManifestRule.Args["default_version"]
6961 if barActualDefaultVersion != barExpectedDefaultVersion {
6962 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6963 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006964
Jooyung Hana0503a52023-08-23 13:12:50 +09006965 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006966 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6967 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6968 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6969 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006970}
6971
Sam Delmericoca816532023-06-02 14:09:50 -04006972func TestApexAvailable_ApexAvailableName(t *testing.T) {
6973 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6974 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6975 apex {
6976 name: "myapex_sminus",
6977 key: "myapex.key",
6978 apps: ["AppFoo"],
6979 apex_available_name: "myapex",
6980 updatable: false,
6981 }
6982 apex {
6983 name: "myapex",
6984 key: "myapex.key",
6985 apps: ["AppFoo"],
6986 updatable: false,
6987 }
6988 apex_key {
6989 name: "myapex.key",
6990 public_key: "testkey.avbpubkey",
6991 private_key: "testkey.pem",
6992 }
6993 android_app {
6994 name: "AppFoo",
6995 srcs: ["foo/bar/MyClass.java"],
6996 sdk_version: "none",
6997 system_modules: "none",
6998 apex_available: [ "myapex_sminus" ],
6999 }`,
7000 android.FixtureMergeMockFs(android.MockFS{
7001 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7002 }),
7003 )
7004 })
7005
7006 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7007 testApex(t, `
7008 apex {
7009 name: "myapex_sminus",
7010 key: "myapex.key",
7011 apps: ["AppFoo"],
7012 apex_available_name: "myapex",
7013 updatable: false,
7014 }
7015 apex {
7016 name: "myapex",
7017 key: "myapex.key",
7018 apps: ["AppFoo"],
7019 updatable: false,
7020 }
7021 apex_key {
7022 name: "myapex.key",
7023 public_key: "testkey.avbpubkey",
7024 private_key: "testkey.pem",
7025 }
7026 android_app {
7027 name: "AppFoo",
7028 srcs: ["foo/bar/MyClass.java"],
7029 sdk_version: "none",
7030 system_modules: "none",
7031 apex_available: [ "myapex" ],
7032 }`,
7033 android.FixtureMergeMockFs(android.MockFS{
7034 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7035 }),
7036 )
7037 })
7038
7039 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7040 testApex(t, `
7041 override_apex {
7042 name: "myoverrideapex_sminus",
7043 base: "myapex_sminus",
7044 key: "myapex.key",
7045 apps: ["AppFooOverride"],
7046 }
7047 override_apex {
7048 name: "myoverrideapex",
7049 base: "myapex",
7050 key: "myapex.key",
7051 apps: ["AppFooOverride"],
7052 }
7053 apex {
7054 name: "myapex_sminus",
7055 key: "myapex.key",
7056 apps: ["AppFoo"],
7057 apex_available_name: "myapex",
7058 updatable: false,
7059 }
7060 apex {
7061 name: "myapex",
7062 key: "myapex.key",
7063 apps: ["AppFoo"],
7064 updatable: false,
7065 }
7066 apex_key {
7067 name: "myapex.key",
7068 public_key: "testkey.avbpubkey",
7069 private_key: "testkey.pem",
7070 }
7071 android_app {
7072 name: "AppFooOverride",
7073 srcs: ["foo/bar/MyClass.java"],
7074 sdk_version: "none",
7075 system_modules: "none",
7076 apex_available: [ "myapex" ],
7077 }
7078 android_app {
7079 name: "AppFoo",
7080 srcs: ["foo/bar/MyClass.java"],
7081 sdk_version: "none",
7082 system_modules: "none",
7083 apex_available: [ "myapex" ],
7084 }`,
7085 android.FixtureMergeMockFs(android.MockFS{
7086 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7087 }),
7088 )
7089 })
7090}
7091
7092func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7093 context := android.GroupFixturePreparers(
7094 android.PrepareForIntegrationTestWithAndroid,
7095 PrepareForTestWithApexBuildComponents,
7096 java.PrepareForTestWithDexpreopt,
7097 android.FixtureMergeMockFs(android.MockFS{
7098 "system/sepolicy/apex/myapex-file_contexts": nil,
7099 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7100 }),
7101 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7102 variables.BuildId = proptools.StringPtr("buildid")
7103 }),
7104 )
7105 context.RunTestWithBp(t, `
7106 override_apex {
7107 name: "myoverrideapex_sminus",
7108 base: "myapex_sminus",
7109 }
7110 override_apex {
7111 name: "myoverrideapex",
7112 base: "myapex",
7113 }
7114 apex {
7115 name: "myapex",
7116 key: "myapex.key",
7117 apps: ["AppFoo"],
7118 updatable: false,
7119 }
7120 apex {
7121 name: "myapex_sminus",
7122 apex_available_name: "myapex",
7123 key: "myapex.key",
7124 apps: ["AppFoo_sminus"],
7125 updatable: false,
7126 }
7127 apex_key {
7128 name: "myapex.key",
7129 public_key: "testkey.avbpubkey",
7130 private_key: "testkey.pem",
7131 }
7132 android_app {
7133 name: "AppFoo",
7134 srcs: ["foo/bar/MyClass.java"],
7135 sdk_version: "none",
7136 system_modules: "none",
7137 apex_available: [ "myapex" ],
7138 }
7139 android_app {
7140 name: "AppFoo_sminus",
7141 srcs: ["foo/bar/MyClass.java"],
7142 sdk_version: "none",
7143 min_sdk_version: "29",
7144 system_modules: "none",
7145 apex_available: [ "myapex" ],
7146 }`)
7147}
7148
Jiyong Park89e850a2020-04-07 16:37:39 +09007149func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007150 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007151 apex {
7152 name: "myapex",
7153 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007154 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007155 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007156 }
7157
7158 apex_key {
7159 name: "myapex.key",
7160 public_key: "testkey.avbpubkey",
7161 private_key: "testkey.pem",
7162 }
7163
7164 cc_library {
7165 name: "libfoo",
7166 stl: "none",
7167 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007168 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007169 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007170 }
7171
7172 cc_library {
7173 name: "libfoo2",
7174 stl: "none",
7175 system_shared_libs: [],
7176 shared_libs: ["libbaz"],
7177 apex_available: ["//apex_available:platform"],
7178 }
7179
7180 cc_library {
7181 name: "libbar",
7182 stl: "none",
7183 system_shared_libs: [],
7184 apex_available: ["myapex"],
7185 }
7186
7187 cc_library {
7188 name: "libbaz",
7189 stl: "none",
7190 system_shared_libs: [],
7191 apex_available: ["myapex"],
7192 stubs: {
7193 versions: ["1"],
7194 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007195 }`)
7196
Jiyong Park89e850a2020-04-07 16:37:39 +09007197 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7198 // because it depends on libbar which isn't available to platform
7199 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7200 if libfoo.NotAvailableForPlatform() != true {
7201 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7202 }
7203
7204 // libfoo2 however can be available to platform because it depends on libbaz which provides
7205 // stubs
7206 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7207 if libfoo2.NotAvailableForPlatform() == true {
7208 t.Errorf("%q should be available to platform", libfoo2.String())
7209 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007210}
Jiyong Parka90ca002019-10-07 15:47:24 +09007211
Paul Duffine52e66f2020-03-30 17:54:29 +01007212func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007213 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007214 apex {
7215 name: "myapex",
7216 key: "myapex.key",
7217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007218 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007219 }
7220
7221 apex_key {
7222 name: "myapex.key",
7223 public_key: "testkey.avbpubkey",
7224 private_key: "testkey.pem",
7225 }
7226
7227 cc_library {
7228 name: "libfoo",
7229 stl: "none",
7230 system_shared_libs: [],
7231 apex_available: ["myapex"],
7232 static: {
7233 apex_available: ["//apex_available:platform"],
7234 },
7235 }`)
7236
Jiyong Park89e850a2020-04-07 16:37:39 +09007237 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7238 if libfooShared.NotAvailableForPlatform() != true {
7239 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7240 }
7241 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7242 if libfooStatic.NotAvailableForPlatform() != false {
7243 t.Errorf("%q should be available to platform", libfooStatic.String())
7244 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007245}
7246
Jiyong Park5d790c32019-11-15 18:40:32 +09007247func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007248 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007249 apex {
7250 name: "myapex",
7251 key: "myapex.key",
7252 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007253 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007254 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007255 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007256 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007257 }
7258
7259 override_apex {
7260 name: "override_myapex",
7261 base: "myapex",
7262 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007263 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007264 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007265 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007266 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007267 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007268 key: "mynewapex.key",
7269 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007270 }
7271
7272 apex_key {
7273 name: "myapex.key",
7274 public_key: "testkey.avbpubkey",
7275 private_key: "testkey.pem",
7276 }
7277
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007278 apex_key {
7279 name: "mynewapex.key",
7280 public_key: "testkey2.avbpubkey",
7281 private_key: "testkey2.pem",
7282 }
7283
7284 android_app_certificate {
7285 name: "myapex.certificate",
7286 certificate: "testkey",
7287 }
7288
Jiyong Park5d790c32019-11-15 18:40:32 +09007289 android_app {
7290 name: "app",
7291 srcs: ["foo/bar/MyClass.java"],
7292 package_name: "foo",
7293 sdk_version: "none",
7294 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007295 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007296 }
7297
7298 override_android_app {
7299 name: "override_app",
7300 base: "app",
7301 package_name: "bar",
7302 }
markchien7c803b82021-08-26 22:10:06 +08007303
7304 bpf {
7305 name: "bpf",
7306 srcs: ["bpf.c"],
7307 }
7308
7309 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007310 name: "overrideBpf",
7311 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007312 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007313
7314 prebuilt_etc {
7315 name: "myetc",
7316 src: "myprebuilt",
7317 }
7318
7319 prebuilt_etc {
7320 name: "override_myetc",
7321 src: "override_myprebuilt",
7322 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007323 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007324
Jooyung Hana0503a52023-08-23 13:12:50 +09007325 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7326 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007327 if originalVariant.GetOverriddenBy() != "" {
7328 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7329 }
7330 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7331 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7332 }
7333
Jooyung Hana0503a52023-08-23 13:12:50 +09007334 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007335 apexRule := module.Rule("apexRule")
7336 copyCmds := apexRule.Args["copy_commands"]
7337
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007338 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7339 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007340
markchien7c803b82021-08-26 22:10:06 +08007341 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007342 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007343
Daniel Norman5a3ce132021-08-26 15:44:43 -07007344 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7345 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7346
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007347 apexBundle := module.Module().(*apexBundle)
7348 name := apexBundle.Name()
7349 if name != "override_myapex" {
7350 t.Errorf("name should be \"override_myapex\", but was %q", name)
7351 }
7352
Baligh Uddin004d7172020-02-19 21:29:28 -08007353 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7354 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7355 }
7356
Jiyong Park20bacab2020-03-03 11:45:41 +09007357 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007358 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007359 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7360
7361 signApkRule := module.Rule("signapk")
7362 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007363
Colin Crossaa255532020-07-03 13:18:24 -07007364 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007365 var builder strings.Builder
7366 data.Custom(&builder, name, "TARGET_", "", data)
7367 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007368 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7369 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007370 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007371 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007372 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007373 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007374 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007375 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007376}
7377
Albert Martineefabcf2022-03-21 20:11:16 +00007378func TestMinSdkVersionOverride(t *testing.T) {
7379 // Override from 29 to 31
7380 minSdkOverride31 := "31"
7381 ctx := testApex(t, `
7382 apex {
7383 name: "myapex",
7384 key: "myapex.key",
7385 native_shared_libs: ["mylib"],
7386 updatable: true,
7387 min_sdk_version: "29"
7388 }
7389
7390 override_apex {
7391 name: "override_myapex",
7392 base: "myapex",
7393 logging_parent: "com.foo.bar",
7394 package_name: "test.overridden.package"
7395 }
7396
7397 apex_key {
7398 name: "myapex.key",
7399 public_key: "testkey.avbpubkey",
7400 private_key: "testkey.pem",
7401 }
7402
7403 cc_library {
7404 name: "mylib",
7405 srcs: ["mylib.cpp"],
7406 runtime_libs: ["libbar"],
7407 system_shared_libs: [],
7408 stl: "none",
7409 apex_available: [ "myapex" ],
7410 min_sdk_version: "apex_inherit"
7411 }
7412
7413 cc_library {
7414 name: "libbar",
7415 srcs: ["mylib.cpp"],
7416 system_shared_libs: [],
7417 stl: "none",
7418 apex_available: [ "myapex" ],
7419 min_sdk_version: "apex_inherit"
7420 }
7421
7422 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7423
Jooyung Hana0503a52023-08-23 13:12:50 +09007424 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007425 copyCmds := apexRule.Args["copy_commands"]
7426
7427 // Ensure that direct non-stubs dep is always included
7428 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7429
7430 // Ensure that runtime_libs dep in included
7431 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7432
7433 // Ensure libraries target overridden min_sdk_version value
7434 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7435}
7436
7437func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7438 // Attempt to override from 31 to 29, should be a NOOP
7439 minSdkOverride29 := "29"
7440 ctx := testApex(t, `
7441 apex {
7442 name: "myapex",
7443 key: "myapex.key",
7444 native_shared_libs: ["mylib"],
7445 updatable: true,
7446 min_sdk_version: "31"
7447 }
7448
7449 override_apex {
7450 name: "override_myapex",
7451 base: "myapex",
7452 logging_parent: "com.foo.bar",
7453 package_name: "test.overridden.package"
7454 }
7455
7456 apex_key {
7457 name: "myapex.key",
7458 public_key: "testkey.avbpubkey",
7459 private_key: "testkey.pem",
7460 }
7461
7462 cc_library {
7463 name: "mylib",
7464 srcs: ["mylib.cpp"],
7465 runtime_libs: ["libbar"],
7466 system_shared_libs: [],
7467 stl: "none",
7468 apex_available: [ "myapex" ],
7469 min_sdk_version: "apex_inherit"
7470 }
7471
7472 cc_library {
7473 name: "libbar",
7474 srcs: ["mylib.cpp"],
7475 system_shared_libs: [],
7476 stl: "none",
7477 apex_available: [ "myapex" ],
7478 min_sdk_version: "apex_inherit"
7479 }
7480
7481 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7482
Jooyung Hana0503a52023-08-23 13:12:50 +09007483 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007484 copyCmds := apexRule.Args["copy_commands"]
7485
7486 // Ensure that direct non-stubs dep is always included
7487 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7488
7489 // Ensure that runtime_libs dep in included
7490 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7491
7492 // Ensure libraries target the original min_sdk_version value rather than the overridden
7493 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7494}
7495
Jooyung Han214bf372019-11-12 13:03:50 +09007496func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007497 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007498 apex {
7499 name: "myapex",
7500 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007501 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007502 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007503 }
7504
7505 apex_key {
7506 name: "myapex.key",
7507 public_key: "testkey.avbpubkey",
7508 private_key: "testkey.pem",
7509 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007510
7511 cc_library {
7512 name: "mylib",
7513 srcs: ["mylib.cpp"],
7514 stl: "libc++",
7515 system_shared_libs: [],
7516 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007517 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007518 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007519 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007520
Jooyung Hana0503a52023-08-23 13:12:50 +09007521 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007522 args := module.Rule("apexRule").Args
7523 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007524 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007525
7526 // The copies of the libraries in the apex should have one more dependency than
7527 // the ones outside the apex, namely the unwinder. Ideally we should check
7528 // the dependency names directly here but for some reason the names are blank in
7529 // this test.
7530 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007531 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007532 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7533 if len(apexImplicits) != len(nonApexImplicits)+1 {
7534 t.Errorf("%q missing unwinder dep", lib)
7535 }
7536 }
Jooyung Han214bf372019-11-12 13:03:50 +09007537}
7538
Paul Duffine05480a2021-03-08 15:07:14 +00007539var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007540 "api/current.txt": nil,
7541 "api/removed.txt": nil,
7542 "api/system-current.txt": nil,
7543 "api/system-removed.txt": nil,
7544 "api/test-current.txt": nil,
7545 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007546
Anton Hanssondff2c782020-12-21 17:10:01 +00007547 "100/public/api/foo.txt": nil,
7548 "100/public/api/foo-removed.txt": nil,
7549 "100/system/api/foo.txt": nil,
7550 "100/system/api/foo-removed.txt": nil,
7551
Paul Duffineedc5d52020-06-12 17:46:39 +01007552 // For java_sdk_library_import
7553 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007554}
7555
Jooyung Han58f26ab2019-12-18 15:34:32 +09007556func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007557 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007558 apex {
7559 name: "myapex",
7560 key: "myapex.key",
7561 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007562 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007563 }
7564
7565 apex_key {
7566 name: "myapex.key",
7567 public_key: "testkey.avbpubkey",
7568 private_key: "testkey.pem",
7569 }
7570
7571 java_sdk_library {
7572 name: "foo",
7573 srcs: ["a.java"],
7574 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007575 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007576 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007577
7578 prebuilt_apis {
7579 name: "sdk",
7580 api_dirs: ["100"],
7581 }
Paul Duffin9b879592020-05-26 13:21:35 +01007582 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007583
7584 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007585 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007586 "javalib/foo.jar",
7587 "etc/permissions/foo.xml",
7588 })
7589 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007590 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007591 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 +09007592}
7593
Paul Duffin9b879592020-05-26 13:21:35 +01007594func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007595 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007596 apex {
7597 name: "myapex",
7598 key: "myapex.key",
7599 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007600 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007601 }
7602
7603 apex_key {
7604 name: "myapex.key",
7605 public_key: "testkey.avbpubkey",
7606 private_key: "testkey.pem",
7607 }
7608
7609 java_sdk_library {
7610 name: "foo",
7611 srcs: ["a.java"],
7612 api_packages: ["foo"],
7613 apex_available: ["myapex"],
7614 sdk_version: "none",
7615 system_modules: "none",
7616 }
7617
7618 java_library {
7619 name: "bar",
7620 srcs: ["a.java"],
7621 libs: ["foo"],
7622 apex_available: ["myapex"],
7623 sdk_version: "none",
7624 system_modules: "none",
7625 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007626
7627 prebuilt_apis {
7628 name: "sdk",
7629 api_dirs: ["100"],
7630 }
Paul Duffin9b879592020-05-26 13:21:35 +01007631 `, withFiles(filesForSdkLibrary))
7632
7633 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007634 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007635 "javalib/bar.jar",
7636 "javalib/foo.jar",
7637 "etc/permissions/foo.xml",
7638 })
7639
7640 // The bar library should depend on the implementation jar.
7641 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007642 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007643 t.Errorf("expected %q, found %#q", expected, actual)
7644 }
7645}
7646
7647func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007648 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007649 apex {
7650 name: "myapex",
7651 key: "myapex.key",
7652 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007653 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007654 }
7655
7656 apex_key {
7657 name: "myapex.key",
7658 public_key: "testkey.avbpubkey",
7659 private_key: "testkey.pem",
7660 }
7661
7662 java_sdk_library {
7663 name: "foo",
7664 srcs: ["a.java"],
7665 api_packages: ["foo"],
7666 apex_available: ["myapex"],
7667 sdk_version: "none",
7668 system_modules: "none",
7669 }
7670
7671 java_library {
7672 name: "bar",
7673 srcs: ["a.java"],
7674 libs: ["foo"],
7675 sdk_version: "none",
7676 system_modules: "none",
7677 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007678
7679 prebuilt_apis {
7680 name: "sdk",
7681 api_dirs: ["100"],
7682 }
Paul Duffin9b879592020-05-26 13:21:35 +01007683 `, withFiles(filesForSdkLibrary))
7684
7685 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007686 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007687 "javalib/foo.jar",
7688 "etc/permissions/foo.xml",
7689 })
7690
7691 // The bar library should depend on the stubs jar.
7692 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007693 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007694 t.Errorf("expected %q, found %#q", expected, actual)
7695 }
7696}
7697
Paul Duffineedc5d52020-06-12 17:46:39 +01007698func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007699 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007700 prebuilt_apis {
7701 name: "sdk",
7702 api_dirs: ["100"],
7703 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007704 withFiles(map[string][]byte{
7705 "apex/a.java": nil,
7706 "apex/apex_manifest.json": nil,
7707 "apex/Android.bp": []byte(`
7708 package {
7709 default_visibility: ["//visibility:private"],
7710 }
7711
7712 apex {
7713 name: "myapex",
7714 key: "myapex.key",
7715 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007716 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007717 }
7718
7719 apex_key {
7720 name: "myapex.key",
7721 public_key: "testkey.avbpubkey",
7722 private_key: "testkey.pem",
7723 }
7724
7725 java_library {
7726 name: "bar",
7727 srcs: ["a.java"],
7728 libs: ["foo"],
7729 apex_available: ["myapex"],
7730 sdk_version: "none",
7731 system_modules: "none",
7732 }
7733`),
7734 "source/a.java": nil,
7735 "source/api/current.txt": nil,
7736 "source/api/removed.txt": nil,
7737 "source/Android.bp": []byte(`
7738 package {
7739 default_visibility: ["//visibility:private"],
7740 }
7741
7742 java_sdk_library {
7743 name: "foo",
7744 visibility: ["//apex"],
7745 srcs: ["a.java"],
7746 api_packages: ["foo"],
7747 apex_available: ["myapex"],
7748 sdk_version: "none",
7749 system_modules: "none",
7750 public: {
7751 enabled: true,
7752 },
7753 }
7754`),
7755 "prebuilt/a.jar": nil,
7756 "prebuilt/Android.bp": []byte(`
7757 package {
7758 default_visibility: ["//visibility:private"],
7759 }
7760
7761 java_sdk_library_import {
7762 name: "foo",
7763 visibility: ["//apex", "//source"],
7764 apex_available: ["myapex"],
7765 prefer: true,
7766 public: {
7767 jars: ["a.jar"],
7768 },
7769 }
7770`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007771 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007772 )
7773
7774 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007775 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007776 "javalib/bar.jar",
7777 "javalib/foo.jar",
7778 "etc/permissions/foo.xml",
7779 })
7780
7781 // The bar library should depend on the implementation jar.
7782 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007783 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007784 t.Errorf("expected %q, found %#q", expected, actual)
7785 }
7786}
7787
7788func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7789 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7790 apex {
7791 name: "myapex",
7792 key: "myapex.key",
7793 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007794 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007795 }
7796
7797 apex_key {
7798 name: "myapex.key",
7799 public_key: "testkey.avbpubkey",
7800 private_key: "testkey.pem",
7801 }
7802
7803 java_sdk_library_import {
7804 name: "foo",
7805 apex_available: ["myapex"],
7806 prefer: true,
7807 public: {
7808 jars: ["a.jar"],
7809 },
7810 }
7811
7812 `, withFiles(filesForSdkLibrary))
7813}
7814
atrost6e126252020-01-27 17:01:16 +00007815func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007816 result := android.GroupFixturePreparers(
7817 prepareForApexTest,
7818 java.PrepareForTestWithPlatformCompatConfig,
7819 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007820 apex {
7821 name: "myapex",
7822 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007823 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007824 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007825 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007826 }
7827
7828 apex_key {
7829 name: "myapex.key",
7830 public_key: "testkey.avbpubkey",
7831 private_key: "testkey.pem",
7832 }
7833
7834 platform_compat_config {
7835 name: "myjar-platform-compat-config",
7836 src: ":myjar",
7837 }
7838
7839 java_library {
7840 name: "myjar",
7841 srcs: ["foo/bar/MyClass.java"],
7842 sdk_version: "none",
7843 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007844 apex_available: [ "myapex" ],
7845 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007846
7847 // Make sure that a preferred prebuilt does not affect the apex contents.
7848 prebuilt_platform_compat_config {
7849 name: "myjar-platform-compat-config",
7850 metadata: "compat-config/metadata.xml",
7851 prefer: true,
7852 }
atrost6e126252020-01-27 17:01:16 +00007853 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007854 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007855 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007856 "etc/compatconfig/myjar-platform-compat-config.xml",
7857 "javalib/myjar.jar",
7858 })
7859}
7860
Jooyung Han862c0d62022-12-21 10:15:37 +09007861func TestNoDupeApexFiles(t *testing.T) {
7862 android.GroupFixturePreparers(
7863 android.PrepareForTestWithAndroidBuildComponents,
7864 PrepareForTestWithApexBuildComponents,
7865 prepareForTestWithMyapex,
7866 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7867 ).
7868 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7869 RunTestWithBp(t, `
7870 apex {
7871 name: "myapex",
7872 key: "myapex.key",
7873 prebuilts: ["foo", "bar"],
7874 updatable: false,
7875 }
7876
7877 apex_key {
7878 name: "myapex.key",
7879 public_key: "testkey.avbpubkey",
7880 private_key: "testkey.pem",
7881 }
7882
7883 prebuilt_etc {
7884 name: "foo",
7885 src: "myprebuilt",
7886 filename_from_src: true,
7887 }
7888
7889 prebuilt_etc {
7890 name: "bar",
7891 src: "myprebuilt",
7892 filename_from_src: true,
7893 }
7894 `)
7895}
7896
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007897func TestApexUnwantedTransitiveDeps(t *testing.T) {
7898 bp := `
7899 apex {
7900 name: "myapex",
7901 key: "myapex.key",
7902 native_shared_libs: ["libfoo"],
7903 updatable: false,
7904 unwanted_transitive_deps: ["libbar"],
7905 }
7906
7907 apex_key {
7908 name: "myapex.key",
7909 public_key: "testkey.avbpubkey",
7910 private_key: "testkey.pem",
7911 }
7912
7913 cc_library {
7914 name: "libfoo",
7915 srcs: ["foo.cpp"],
7916 shared_libs: ["libbar"],
7917 apex_available: ["myapex"],
7918 }
7919
7920 cc_library {
7921 name: "libbar",
7922 srcs: ["bar.cpp"],
7923 apex_available: ["myapex"],
7924 }`
7925 ctx := testApex(t, bp)
7926 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7927 "*/libc++.so",
7928 "*/libfoo.so",
7929 // not libbar.so
7930 })
7931}
7932
Jiyong Park479321d2019-12-16 11:47:12 +09007933func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7934 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7935 apex {
7936 name: "myapex",
7937 key: "myapex.key",
7938 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007939 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007940 }
7941
7942 apex_key {
7943 name: "myapex.key",
7944 public_key: "testkey.avbpubkey",
7945 private_key: "testkey.pem",
7946 }
7947
7948 java_library {
7949 name: "myjar",
7950 srcs: ["foo/bar/MyClass.java"],
7951 sdk_version: "none",
7952 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007953 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007954 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007955 }
7956 `)
7957}
7958
Jiyong Park7afd1072019-12-30 16:56:33 +09007959func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007960 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007961 apex {
7962 name: "myapex",
7963 key: "myapex.key",
7964 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007965 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007966 }
7967
7968 apex_key {
7969 name: "myapex.key",
7970 public_key: "testkey.avbpubkey",
7971 private_key: "testkey.pem",
7972 }
7973
7974 cc_library {
7975 name: "mylib",
7976 srcs: ["mylib.cpp"],
7977 system_shared_libs: [],
7978 stl: "none",
7979 required: ["a", "b"],
7980 host_required: ["c", "d"],
7981 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007982 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007983 }
7984 `)
7985
Jooyung Hana0503a52023-08-23 13:12:50 +09007986 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007987 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007988 name := apexBundle.BaseModuleName()
7989 prefix := "TARGET_"
7990 var builder strings.Builder
7991 data.Custom(&builder, name, prefix, "", data)
7992 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007993 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007994 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7995 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007996}
7997
Jiyong Park7cd10e32020-01-14 09:22:18 +09007998func TestSymlinksFromApexToSystem(t *testing.T) {
7999 bp := `
8000 apex {
8001 name: "myapex",
8002 key: "myapex.key",
8003 native_shared_libs: ["mylib"],
8004 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008005 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008006 }
8007
Jiyong Park9d677202020-02-19 16:29:35 +09008008 apex {
8009 name: "myapex.updatable",
8010 key: "myapex.key",
8011 native_shared_libs: ["mylib"],
8012 java_libs: ["myjar"],
8013 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008014 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008015 }
8016
Jiyong Park7cd10e32020-01-14 09:22:18 +09008017 apex_key {
8018 name: "myapex.key",
8019 public_key: "testkey.avbpubkey",
8020 private_key: "testkey.pem",
8021 }
8022
8023 cc_library {
8024 name: "mylib",
8025 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008026 shared_libs: [
8027 "myotherlib",
8028 "myotherlib_ext",
8029 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008030 system_shared_libs: [],
8031 stl: "none",
8032 apex_available: [
8033 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008034 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008035 "//apex_available:platform",
8036 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008037 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008038 }
8039
8040 cc_library {
8041 name: "myotherlib",
8042 srcs: ["mylib.cpp"],
8043 system_shared_libs: [],
8044 stl: "none",
8045 apex_available: [
8046 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008047 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008048 "//apex_available:platform",
8049 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008050 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008051 }
8052
Jiyong Parkce243632023-02-17 18:22:25 +09008053 cc_library {
8054 name: "myotherlib_ext",
8055 srcs: ["mylib.cpp"],
8056 system_shared_libs: [],
8057 system_ext_specific: true,
8058 stl: "none",
8059 apex_available: [
8060 "myapex",
8061 "myapex.updatable",
8062 "//apex_available:platform",
8063 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008064 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008065 }
8066
Jiyong Park7cd10e32020-01-14 09:22:18 +09008067 java_library {
8068 name: "myjar",
8069 srcs: ["foo/bar/MyClass.java"],
8070 sdk_version: "none",
8071 system_modules: "none",
8072 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008073 apex_available: [
8074 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008075 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008076 "//apex_available:platform",
8077 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008078 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008079 }
8080
8081 java_library {
8082 name: "myotherjar",
8083 srcs: ["foo/bar/MyClass.java"],
8084 sdk_version: "none",
8085 system_modules: "none",
8086 apex_available: [
8087 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008088 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008089 "//apex_available:platform",
8090 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008091 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008092 }
8093 `
8094
8095 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8096 for _, f := range files {
8097 if f.path == file {
8098 if f.isLink {
8099 t.Errorf("%q is not a real file", file)
8100 }
8101 return
8102 }
8103 }
8104 t.Errorf("%q is not found", file)
8105 }
8106
Jiyong Parkce243632023-02-17 18:22:25 +09008107 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008108 for _, f := range files {
8109 if f.path == file {
8110 if !f.isLink {
8111 t.Errorf("%q is not a symlink", file)
8112 }
Jiyong Parkce243632023-02-17 18:22:25 +09008113 if f.src != target {
8114 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8115 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008116 return
8117 }
8118 }
8119 t.Errorf("%q is not found", file)
8120 }
8121
Jiyong Park9d677202020-02-19 16:29:35 +09008122 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8123 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008124 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008125 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008126 ensureRealfileExists(t, files, "javalib/myjar.jar")
8127 ensureRealfileExists(t, files, "lib64/mylib.so")
8128 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008129 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008130
Jooyung Hana0503a52023-08-23 13:12:50 +09008131 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008132 ensureRealfileExists(t, files, "javalib/myjar.jar")
8133 ensureRealfileExists(t, files, "lib64/mylib.so")
8134 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008135 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008136
8137 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008138 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008139 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008140 ensureRealfileExists(t, files, "javalib/myjar.jar")
8141 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008142 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8143 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008144
Jooyung Hana0503a52023-08-23 13:12:50 +09008145 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008146 ensureRealfileExists(t, files, "javalib/myjar.jar")
8147 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008148 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8149 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008150}
8151
Yo Chiange8128052020-07-23 20:09:18 +08008152func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008153 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008154 apex {
8155 name: "myapex",
8156 key: "myapex.key",
8157 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008158 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008159 }
8160
8161 apex_key {
8162 name: "myapex.key",
8163 public_key: "testkey.avbpubkey",
8164 private_key: "testkey.pem",
8165 }
8166
8167 cc_library_shared {
8168 name: "mylib",
8169 srcs: ["mylib.cpp"],
8170 shared_libs: ["myotherlib"],
8171 system_shared_libs: [],
8172 stl: "none",
8173 apex_available: [
8174 "myapex",
8175 "//apex_available:platform",
8176 ],
8177 }
8178
8179 cc_prebuilt_library_shared {
8180 name: "myotherlib",
8181 srcs: ["prebuilt.so"],
8182 system_shared_libs: [],
8183 stl: "none",
8184 apex_available: [
8185 "myapex",
8186 "//apex_available:platform",
8187 ],
8188 }
8189 `)
8190
Jooyung Hana0503a52023-08-23 13:12:50 +09008191 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008192 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008193 var builder strings.Builder
8194 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8195 androidMk := builder.String()
8196 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008197 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008198 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8199 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8200 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008201 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008202}
8203
Jooyung Han643adc42020-02-27 13:50:06 +09008204func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008205 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008206 apex {
8207 name: "myapex",
8208 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008209 binaries: ["mybin"],
8210 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008211 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008212 }
8213
8214 apex_key {
8215 name: "myapex.key",
8216 public_key: "testkey.avbpubkey",
8217 private_key: "testkey.pem",
8218 }
8219
8220 cc_library {
8221 name: "mylib",
8222 srcs: ["mylib.cpp"],
8223 shared_libs: ["mylib2"],
8224 system_shared_libs: [],
8225 stl: "none",
8226 apex_available: [ "myapex" ],
8227 }
8228
8229 cc_library {
8230 name: "mylib2",
8231 srcs: ["mylib.cpp"],
8232 system_shared_libs: [],
8233 stl: "none",
8234 apex_available: [ "myapex" ],
8235 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008236
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008237 // Used as both a JNI library and a regular shared library.
8238 cc_library {
8239 name: "mylib3",
8240 srcs: ["mylib.cpp"],
8241 system_shared_libs: [],
8242 stl: "none",
8243 apex_available: [ "myapex" ],
8244 }
8245
8246 cc_binary {
8247 name: "mybin",
8248 srcs: ["mybin.cpp"],
8249 shared_libs: ["mylib3"],
8250 system_shared_libs: [],
8251 stl: "none",
8252 apex_available: [ "myapex" ],
8253 }
8254
Jiyong Park34d5c332022-02-24 18:02:44 +09008255 rust_ffi_shared {
8256 name: "libfoo.rust",
8257 crate_name: "foo",
8258 srcs: ["foo.rs"],
8259 shared_libs: ["libfoo.shared_from_rust"],
8260 prefer_rlib: true,
8261 apex_available: ["myapex"],
8262 }
8263
8264 cc_library_shared {
8265 name: "libfoo.shared_from_rust",
8266 srcs: ["mylib.cpp"],
8267 system_shared_libs: [],
8268 stl: "none",
8269 stubs: {
8270 versions: ["10", "11", "12"],
8271 },
8272 }
8273
Jooyung Han643adc42020-02-27 13:50:06 +09008274 `)
8275
Jooyung Hana0503a52023-08-23 13:12:50 +09008276 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008277 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008278 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008279 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008280 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008281 "lib64/mylib.so",
8282 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008283 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008284 "lib64/libfoo.rust.so",
8285 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8286 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008287 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008288
8289 // b/220397949
8290 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008291}
8292
Jooyung Han49f67012020-04-17 13:43:10 +09008293func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008294 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008295 apex {
8296 name: "myapex",
8297 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008298 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008299 }
8300 apex_key {
8301 name: "myapex.key",
8302 public_key: "testkey.avbpubkey",
8303 private_key: "testkey.pem",
8304 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008305 `,
8306 android.FixtureModifyConfig(func(config android.Config) {
8307 delete(config.Targets, android.Android)
8308 config.AndroidCommonTarget = android.Target{}
8309 }),
8310 )
Jooyung Han49f67012020-04-17 13:43:10 +09008311
8312 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8313 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8314 }
8315}
8316
Jiyong Parkbd159612020-02-28 15:22:21 +09008317func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008318 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008319 apex {
8320 name: "myapex",
8321 key: "myapex.key",
8322 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008323 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008324 }
8325
8326 apex_key {
8327 name: "myapex.key",
8328 public_key: "testkey.avbpubkey",
8329 private_key: "testkey.pem",
8330 }
8331
8332 android_app {
8333 name: "AppFoo",
8334 srcs: ["foo/bar/MyClass.java"],
8335 sdk_version: "none",
8336 system_modules: "none",
8337 apex_available: [ "myapex" ],
8338 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008339 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008340
Jooyung Hana0503a52023-08-23 13:12:50 +09008341 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008342 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008343
8344 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008345 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 +09008346}
8347
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008348func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008349 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008350 apex {
8351 name: "myapex",
8352 key: "myapex.key",
8353 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008354 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008355 }
8356
8357 apex_key {
8358 name: "myapex.key",
8359 public_key: "testkey.avbpubkey",
8360 private_key: "testkey.pem",
8361 }
8362
8363 android_app_set {
8364 name: "AppSet",
8365 set: "AppSet.apks",
8366 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008367 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008368 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008369 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008370 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8371 s := mod.Rule("apexRule").Args["copy_commands"]
8372 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008373 if len(copyCmds) != 4 {
8374 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008375 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008376 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8377 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008378 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8379 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008380
8381 // Ensure that canned_fs_config has an entry for the app set zip file
8382 generateFsRule := mod.Rule("generateFsConfig")
8383 cmd := generateFsRule.RuleParams.Command
8384 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008385}
8386
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008387func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008388 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008389 apex_set {
8390 name: "myapex",
8391 filename: "foo_v2.apex",
8392 sanitized: {
8393 none: { set: "myapex.apks", },
8394 hwaddress: { set: "myapex.hwasan.apks", },
8395 },
Paul Duffin24704672021-04-06 16:09:30 +01008396 }
8397 `
8398 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008399
Paul Duffin24704672021-04-06 16:09:30 +01008400 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008401 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008402
Spandan Das3576e762024-01-03 18:57:03 +00008403 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008404 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008405
Paul Duffin24704672021-04-06 16:09:30 +01008406 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8407
8408 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008409 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8410 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008411
8412 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008413}
8414
Pranav Guptaeba03b02022-09-27 00:27:08 +00008415func TestApexSetApksModuleAssignment(t *testing.T) {
8416 ctx := testApex(t, `
8417 apex_set {
8418 name: "myapex",
8419 set: ":myapex_apks_file",
8420 }
8421
8422 filegroup {
8423 name: "myapex_apks_file",
8424 srcs: ["myapex.apks"],
8425 }
8426 `)
8427
Spandan Das3576e762024-01-03 18:57:03 +00008428 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008429
8430 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008431 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008432 extractedApex := m.Output(extractorOutput)
8433
8434 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8435}
8436
Paul Duffin89f570a2021-06-16 01:42:33 +01008437func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008438 t.Helper()
8439
Paul Duffin55607122021-03-30 23:32:51 +01008440 fs := android.MockFS{
8441 "a.java": nil,
8442 "a.jar": nil,
8443 "apex_manifest.json": nil,
8444 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008445 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008446 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8447 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8448 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008449 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008450 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008451
Paul Duffin55607122021-03-30 23:32:51 +01008452 errorHandler := android.FixtureExpectsNoErrors
8453 if errmsg != "" {
8454 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008455 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008456
Paul Duffin55607122021-03-30 23:32:51 +01008457 result := android.GroupFixturePreparers(
8458 cc.PrepareForTestWithCcDefaultModules,
8459 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008460 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008461 java.PrepareForTestWithJavaSdkLibraryFiles,
8462 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008463 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008464 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008465 android.FixtureModifyMockFS(func(fs android.MockFS) {
8466 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8467 insert := ""
8468 for _, fragment := range fragments {
8469 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8470 }
8471 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8472 platform_bootclasspath {
8473 name: "platform-bootclasspath",
8474 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008475 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008476 %s
8477 ],
8478 }
8479 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008480 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008481 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008482 // Dexpreopt for boot jars requires the ART boot image profile.
8483 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8484 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008485 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008486 ).
8487 ExtendWithErrorHandler(errorHandler).
8488 RunTestWithBp(t, bp)
8489
8490 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008491}
8492
Paul Duffin5556c5f2022-06-09 17:32:21 +00008493func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008494 preparers := android.GroupFixturePreparers(
8495 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008496 prepareForTestWithBootclasspathFragment,
8497 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008498 PrepareForTestWithApexBuildComponents,
8499 ).
8500 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008501 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008502
8503 bpBase := `
8504 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008505 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008506 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008507 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008508 set: "myapex.apks",
8509 }
8510
8511 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008512 name: "com.mycompany.android.art",
8513 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008514 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008515 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008516 set: "company-myapex.apks",
8517 }
8518
8519 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008520 name: "art-bootclasspath-fragment",
8521 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008522 hidden_api: {
8523 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8524 metadata: "my-bootclasspath-fragment/metadata.csv",
8525 index: "my-bootclasspath-fragment/index.csv",
8526 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8527 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8528 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008529 %s
8530 }
8531 `
8532
8533 t.Run("java_import", func(t *testing.T) {
8534 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8535 java_import {
8536 name: "libfoo",
8537 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008538 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008539 }
8540 `)
8541 })
8542
8543 t.Run("java_sdk_library_import", func(t *testing.T) {
8544 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8545 java_sdk_library_import {
8546 name: "libfoo",
8547 public: {
8548 jars: ["libbar.jar"],
8549 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008550 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008551 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008552 }
8553 `)
8554 })
8555
8556 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8557 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8558 image_name: "art",
8559 contents: ["libfoo"],
8560 `)+`
8561 java_sdk_library_import {
8562 name: "libfoo",
8563 public: {
8564 jars: ["libbar.jar"],
8565 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008566 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008567 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008568 }
8569 `)
8570 })
8571}
8572
Paul Duffin5556c5f2022-06-09 17:32:21 +00008573func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8574 preparers := android.GroupFixturePreparers(
8575 java.PrepareForTestWithJavaDefaultModules,
8576 PrepareForTestWithApexBuildComponents,
8577 )
8578
Spandan Das59a4a2b2024-01-09 21:35:56 +00008579 errCtx := moduleErrorfTestCtx{}
8580
Paul Duffin5556c5f2022-06-09 17:32:21 +00008581 bpBase := `
8582 apex_set {
8583 name: "com.android.myapex",
8584 installable: true,
8585 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8586 set: "myapex.apks",
8587 }
8588
8589 apex_set {
8590 name: "com.android.myapex_compressed",
8591 apex_name: "com.android.myapex",
8592 installable: true,
8593 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8594 set: "myapex_compressed.apks",
8595 }
8596
8597 prebuilt_bootclasspath_fragment {
8598 name: "my-bootclasspath-fragment",
8599 apex_available: [
8600 "com.android.myapex",
8601 "com.android.myapex_compressed",
8602 ],
8603 hidden_api: {
8604 annotation_flags: "annotation-flags.csv",
8605 metadata: "metadata.csv",
8606 index: "index.csv",
8607 signature_patterns: "signature_patterns.csv",
8608 },
8609 %s
8610 }
8611 `
8612
8613 t.Run("java_import", func(t *testing.T) {
8614 result := preparers.RunTestWithBp(t,
8615 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8616 java_import {
8617 name: "libfoo",
8618 jars: ["libfoo.jar"],
8619 apex_available: [
8620 "com.android.myapex",
8621 "com.android.myapex_compressed",
8622 ],
8623 }
8624 `)
8625
8626 module := result.Module("libfoo", "android_common_com.android.myapex")
8627 usesLibraryDep := module.(java.UsesLibraryDependency)
8628 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008629 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008630 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008631 })
8632
8633 t.Run("java_sdk_library_import", func(t *testing.T) {
8634 result := preparers.RunTestWithBp(t,
8635 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8636 java_sdk_library_import {
8637 name: "libfoo",
8638 public: {
8639 jars: ["libbar.jar"],
8640 },
8641 apex_available: [
8642 "com.android.myapex",
8643 "com.android.myapex_compressed",
8644 ],
8645 compile_dex: true,
8646 }
8647 `)
8648
8649 module := result.Module("libfoo", "android_common_com.android.myapex")
8650 usesLibraryDep := module.(java.UsesLibraryDependency)
8651 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008652 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008653 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008654 })
8655
8656 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8657 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8658 image_name: "art",
8659 contents: ["libfoo"],
8660 `)+`
8661 java_sdk_library_import {
8662 name: "libfoo",
8663 public: {
8664 jars: ["libbar.jar"],
8665 },
8666 apex_available: [
8667 "com.android.myapex",
8668 "com.android.myapex_compressed",
8669 ],
8670 compile_dex: true,
8671 }
8672 `)
8673 })
8674}
8675
Jooyung Han548640b2020-04-27 12:10:30 +09008676func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8677 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8678 apex {
8679 name: "myapex",
8680 key: "myapex.key",
8681 updatable: true,
8682 }
8683
8684 apex_key {
8685 name: "myapex.key",
8686 public_key: "testkey.avbpubkey",
8687 private_key: "testkey.pem",
8688 }
8689 `)
8690}
8691
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008692func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8693 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8694 apex {
8695 name: "myapex",
8696 key: "myapex.key",
8697 }
8698
8699 apex_key {
8700 name: "myapex.key",
8701 public_key: "testkey.avbpubkey",
8702 private_key: "testkey.pem",
8703 }
8704 `)
8705}
8706
Jooyung Handfc864c2023-03-20 18:19:07 +09008707func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8708 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008709 apex {
8710 name: "myapex",
8711 key: "myapex.key",
8712 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008713 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008714 soc_specific: true,
8715 }
8716
8717 apex_key {
8718 name: "myapex.key",
8719 public_key: "testkey.avbpubkey",
8720 private_key: "testkey.pem",
8721 }
8722 `)
8723}
8724
Jooyung Han02873da2023-03-22 17:41:03 +09008725func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8726 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 updatable: false,
8731 min_sdk_version: "29",
8732 use_vndk_as_stable: true,
8733 vendor: true,
8734 }
8735
8736 apex_key {
8737 name: "myapex.key",
8738 public_key: "testkey.avbpubkey",
8739 private_key: "testkey.pem",
8740 }
8741 `)
8742}
8743
Jooyung Handfc864c2023-03-20 18:19:07 +09008744func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8745 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8746 apex {
8747 name: "myapex",
8748 key: "myapex.key",
8749 updatable: false,
8750 use_vndk_as_stable: true,
8751 }
8752
8753 apex_key {
8754 name: "myapex.key",
8755 public_key: "testkey.avbpubkey",
8756 private_key: "testkey.pem",
8757 }
8758 `)
8759}
8760
satayevb98371c2021-06-15 16:49:50 +01008761func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8762 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8763 apex {
8764 name: "myapex",
8765 key: "myapex.key",
8766 systemserverclasspath_fragments: [
8767 "mysystemserverclasspathfragment",
8768 ],
8769 min_sdk_version: "29",
8770 updatable: true,
8771 }
8772
8773 apex_key {
8774 name: "myapex.key",
8775 public_key: "testkey.avbpubkey",
8776 private_key: "testkey.pem",
8777 }
8778
8779 java_library {
8780 name: "foo",
8781 srcs: ["b.java"],
8782 min_sdk_version: "29",
8783 installable: true,
8784 apex_available: [
8785 "myapex",
8786 ],
8787 }
8788
8789 systemserverclasspath_fragment {
8790 name: "mysystemserverclasspathfragment",
8791 generate_classpaths_proto: false,
8792 contents: [
8793 "foo",
8794 ],
8795 apex_available: [
8796 "myapex",
8797 ],
8798 }
satayevabcd5972021-08-06 17:49:46 +01008799 `,
8800 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8801 )
satayevb98371c2021-06-15 16:49:50 +01008802}
8803
Paul Duffin064b70c2020-11-02 17:32:38 +00008804func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008805 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008806 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008807 fragment := java.ApexVariantReference{
8808 Apex: proptools.StringPtr("myapex"),
8809 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8810 }
8811
Paul Duffin064b70c2020-11-02 17:32:38 +00008812 testDexpreoptWithApexes(t, `
8813 prebuilt_apex {
8814 name: "myapex" ,
8815 arch: {
8816 arm64: {
8817 src: "myapex-arm64.apex",
8818 },
8819 arm: {
8820 src: "myapex-arm.apex",
8821 },
8822 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008823 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8824 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008825
Paul Duffin89f570a2021-06-16 01:42:33 +01008826 prebuilt_bootclasspath_fragment {
8827 name: "my-bootclasspath-fragment",
8828 contents: ["libfoo"],
8829 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008830 hidden_api: {
8831 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8832 metadata: "my-bootclasspath-fragment/metadata.csv",
8833 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008834 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8835 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8836 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008837 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008838 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008839
Paul Duffin89f570a2021-06-16 01:42:33 +01008840 java_import {
8841 name: "libfoo",
8842 jars: ["libfoo.jar"],
8843 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008844 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008845 }
8846 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008847 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008848}
8849
Spandan Dasf14e2542021-11-12 00:01:37 +00008850func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008851 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008852 bp += `
8853 apex_key {
8854 name: "myapex.key",
8855 public_key: "testkey.avbpubkey",
8856 private_key: "testkey.pem",
8857 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008858 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008859 "lib1/src/A.java": nil,
8860 "lib2/src/B.java": nil,
8861 "system/sepolicy/apex/myapex-file_contexts": nil,
8862 }
8863
Paul Duffin45338f02021-03-30 23:07:52 +01008864 errorHandler := android.FixtureExpectsNoErrors
8865 if errmsg != "" {
8866 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008867 }
Colin Crossae8600b2020-10-29 17:09:13 -07008868
Paul Duffin45338f02021-03-30 23:07:52 +01008869 android.GroupFixturePreparers(
8870 android.PrepareForTestWithAndroidBuildComponents,
8871 java.PrepareForTestWithJavaBuildComponents,
8872 PrepareForTestWithApexBuildComponents,
8873 android.PrepareForTestWithNeverallowRules(rules),
8874 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008875 apexBootJars := make([]string, 0, len(bootJars))
8876 for _, apexBootJar := range bootJars {
8877 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008878 }
satayevd604b212021-07-21 14:23:52 +01008879 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008880 }),
8881 fs.AddToFixture(),
8882 ).
8883 ExtendWithErrorHandler(errorHandler).
8884 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008885}
8886
8887func TestApexPermittedPackagesRules(t *testing.T) {
8888 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008889 name string
8890 expectedError string
8891 bp string
8892 bootJars []string
8893 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008894 }{
8895
8896 {
8897 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8898 expectedError: "",
8899 bp: `
8900 java_library {
8901 name: "bcp_lib1",
8902 srcs: ["lib1/src/*.java"],
8903 permitted_packages: ["foo.bar"],
8904 apex_available: ["myapex"],
8905 sdk_version: "none",
8906 system_modules: "none",
8907 }
8908 java_library {
8909 name: "nonbcp_lib2",
8910 srcs: ["lib2/src/*.java"],
8911 apex_available: ["myapex"],
8912 permitted_packages: ["a.b"],
8913 sdk_version: "none",
8914 system_modules: "none",
8915 }
8916 apex {
8917 name: "myapex",
8918 key: "myapex.key",
8919 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008920 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008921 }`,
8922 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008923 bcpPermittedPackages: map[string][]string{
8924 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008925 "foo.bar",
8926 },
8927 },
8928 },
8929 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008930 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008931 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 +01008932 bp: `
8933 java_library {
8934 name: "bcp_lib1",
8935 srcs: ["lib1/src/*.java"],
8936 apex_available: ["myapex"],
8937 permitted_packages: ["foo.bar"],
8938 sdk_version: "none",
8939 system_modules: "none",
8940 }
8941 java_library {
8942 name: "bcp_lib2",
8943 srcs: ["lib2/src/*.java"],
8944 apex_available: ["myapex"],
8945 permitted_packages: ["foo.bar", "bar.baz"],
8946 sdk_version: "none",
8947 system_modules: "none",
8948 }
8949 apex {
8950 name: "myapex",
8951 key: "myapex.key",
8952 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008953 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008954 }
8955 `,
8956 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008957 bcpPermittedPackages: map[string][]string{
8958 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008959 "foo.bar",
8960 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008961 "bcp_lib2": []string{
8962 "foo.bar",
8963 },
8964 },
8965 },
8966 {
8967 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8968 expectedError: "",
8969 bp: `
8970 java_library {
8971 name: "bcp_lib_restricted",
8972 srcs: ["lib1/src/*.java"],
8973 apex_available: ["myapex"],
8974 permitted_packages: ["foo.bar"],
8975 sdk_version: "none",
8976 min_sdk_version: "29",
8977 system_modules: "none",
8978 }
8979 java_library {
8980 name: "bcp_lib_unrestricted",
8981 srcs: ["lib2/src/*.java"],
8982 apex_available: ["myapex"],
8983 permitted_packages: ["foo.bar", "bar.baz"],
8984 sdk_version: "none",
8985 min_sdk_version: "29",
8986 system_modules: "none",
8987 }
8988 apex {
8989 name: "myapex",
8990 key: "myapex.key",
8991 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8992 updatable: true,
8993 min_sdk_version: "29",
8994 }
8995 `,
8996 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8997 bcpPermittedPackages: map[string][]string{
8998 "bcp_lib1_non_updateable": []string{
8999 "foo.bar",
9000 },
9001 // 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 +01009002 },
9003 },
9004 }
9005 for _, tc := range testcases {
9006 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009007 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9008 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009009 })
9010 }
9011}
9012
Jiyong Park62304bb2020-04-13 16:19:48 +09009013func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009014 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009015 apex {
9016 name: "myapex",
9017 key: "myapex.key",
9018 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009019 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009020 }
9021
9022 apex_key {
9023 name: "myapex.key",
9024 public_key: "testkey.avbpubkey",
9025 private_key: "testkey.pem",
9026 }
9027
9028 cc_library {
9029 name: "mylib",
9030 srcs: ["mylib.cpp"],
9031 system_shared_libs: [],
9032 stl: "none",
9033 stubs: {
9034 versions: ["1"],
9035 },
9036 apex_available: ["myapex"],
9037 }
9038
9039 cc_library {
9040 name: "myprivlib",
9041 srcs: ["mylib.cpp"],
9042 system_shared_libs: [],
9043 stl: "none",
9044 apex_available: ["myapex"],
9045 }
9046
9047
9048 cc_test {
9049 name: "mytest",
9050 gtest: false,
9051 srcs: ["mylib.cpp"],
9052 system_shared_libs: [],
9053 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009054 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009055 test_for: ["myapex"]
9056 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009057
9058 cc_library {
9059 name: "mytestlib",
9060 srcs: ["mylib.cpp"],
9061 system_shared_libs: [],
9062 shared_libs: ["mylib", "myprivlib"],
9063 stl: "none",
9064 test_for: ["myapex"],
9065 }
9066
9067 cc_benchmark {
9068 name: "mybench",
9069 srcs: ["mylib.cpp"],
9070 system_shared_libs: [],
9071 shared_libs: ["mylib", "myprivlib"],
9072 stl: "none",
9073 test_for: ["myapex"],
9074 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009075 `)
9076
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009077 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009078 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009079 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9080 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9081 }
9082
9083 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009084 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009085 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9086 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9087 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9088}
Jiyong Park46a512f2020-12-04 18:02:13 +09009089
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009090func TestIndirectTestFor(t *testing.T) {
9091 ctx := testApex(t, `
9092 apex {
9093 name: "myapex",
9094 key: "myapex.key",
9095 native_shared_libs: ["mylib", "myprivlib"],
9096 updatable: false,
9097 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009098
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009099 apex_key {
9100 name: "myapex.key",
9101 public_key: "testkey.avbpubkey",
9102 private_key: "testkey.pem",
9103 }
9104
9105 cc_library {
9106 name: "mylib",
9107 srcs: ["mylib.cpp"],
9108 system_shared_libs: [],
9109 stl: "none",
9110 stubs: {
9111 versions: ["1"],
9112 },
9113 apex_available: ["myapex"],
9114 }
9115
9116 cc_library {
9117 name: "myprivlib",
9118 srcs: ["mylib.cpp"],
9119 system_shared_libs: [],
9120 stl: "none",
9121 shared_libs: ["mylib"],
9122 apex_available: ["myapex"],
9123 }
9124
9125 cc_library {
9126 name: "mytestlib",
9127 srcs: ["mylib.cpp"],
9128 system_shared_libs: [],
9129 shared_libs: ["myprivlib"],
9130 stl: "none",
9131 test_for: ["myapex"],
9132 }
9133 `)
9134
9135 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009136 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009137 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9138 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9139 }
9140
9141 // The platform variant of mytestlib links to the platform variant of the
9142 // internal myprivlib.
9143 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9144
9145 // The platform variant of myprivlib links to the platform variant of mylib
9146 // and bypasses its stubs.
9147 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 +09009148}
9149
Martin Stjernholmec009002021-03-27 15:18:31 +00009150func TestTestForForLibInOtherApex(t *testing.T) {
9151 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9152 _ = testApex(t, `
9153 apex {
9154 name: "com.android.art",
9155 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009156 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009157 updatable: false,
9158 }
9159
9160 apex {
9161 name: "com.android.art.debug",
9162 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009163 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009164 updatable: false,
9165 }
9166
9167 apex_key {
9168 name: "myapex.key",
9169 public_key: "testkey.avbpubkey",
9170 private_key: "testkey.pem",
9171 }
9172
9173 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009174 name: "libnativebridge",
9175 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009176 system_shared_libs: [],
9177 stl: "none",
9178 stubs: {
9179 versions: ["1"],
9180 },
9181 apex_available: ["com.android.art", "com.android.art.debug"],
9182 }
9183
9184 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009185 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009186 srcs: ["mylib.cpp"],
9187 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009188 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009189 stl: "none",
9190 apex_available: ["com.android.art.debug"],
9191 test_for: ["com.android.art"],
9192 }
9193 `,
9194 android.MockFS{
9195 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9196 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9197 }.AddToFixture())
9198}
9199
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009200// TODO(jungjw): Move this to proptools
9201func intPtr(i int) *int {
9202 return &i
9203}
9204
9205func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009206 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009207 apex_set {
9208 name: "myapex",
9209 set: "myapex.apks",
9210 filename: "foo_v2.apex",
9211 overrides: ["foo"],
9212 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009213 `,
9214 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9215 variables.Platform_sdk_version = intPtr(30)
9216 }),
9217 android.FixtureModifyConfig(func(config android.Config) {
9218 config.Targets[android.Android] = []android.Target{
9219 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9220 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9221 }
9222 }),
9223 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009224
Spandan Das3576e762024-01-03 18:57:03 +00009225 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009226
9227 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009228 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009229 actual := extractedApex.Args["abis"]
9230 expected := "ARMEABI_V7A,ARM64_V8A"
9231 if actual != expected {
9232 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9233 }
9234 actual = extractedApex.Args["sdk-version"]
9235 expected = "30"
9236 if actual != expected {
9237 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9238 }
9239
Paul Duffin6717d882021-06-15 19:09:41 +01009240 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009241 a := m.Module().(*ApexSet)
9242 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009243 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009244 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9245 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9246 }
9247}
9248
Anton Hansson805e0a52022-11-25 14:06:46 +00009249func TestApexSet_NativeBridge(t *testing.T) {
9250 ctx := testApex(t, `
9251 apex_set {
9252 name: "myapex",
9253 set: "myapex.apks",
9254 filename: "foo_v2.apex",
9255 overrides: ["foo"],
9256 }
9257 `,
9258 android.FixtureModifyConfig(func(config android.Config) {
9259 config.Targets[android.Android] = []android.Target{
9260 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9261 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9262 }
9263 }),
9264 )
9265
Spandan Das3576e762024-01-03 18:57:03 +00009266 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009267
9268 // Check extract_apks tool parameters. No native bridge arch expected
9269 extractedApex := m.Output("extracted/myapex.apks")
9270 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9271}
9272
Jiyong Park7d95a512020-05-10 15:16:24 +09009273func TestNoStaticLinkingToStubsLib(t *testing.T) {
9274 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9275 apex {
9276 name: "myapex",
9277 key: "myapex.key",
9278 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009279 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009280 }
9281
9282 apex_key {
9283 name: "myapex.key",
9284 public_key: "testkey.avbpubkey",
9285 private_key: "testkey.pem",
9286 }
9287
9288 cc_library {
9289 name: "mylib",
9290 srcs: ["mylib.cpp"],
9291 static_libs: ["otherlib"],
9292 system_shared_libs: [],
9293 stl: "none",
9294 apex_available: [ "myapex" ],
9295 }
9296
9297 cc_library {
9298 name: "otherlib",
9299 srcs: ["mylib.cpp"],
9300 system_shared_libs: [],
9301 stl: "none",
9302 stubs: {
9303 versions: ["1", "2", "3"],
9304 },
9305 apex_available: [ "myapex" ],
9306 }
9307 `)
9308}
9309
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009310func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009311 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009312 apex {
9313 name: "myapex",
9314 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009315 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009316 custom_sign_tool: "sign_myapex",
9317 }
9318
9319 apex_key {
9320 name: "myapex.key",
9321 public_key: "testkey.avbpubkey",
9322 private_key: "testkey.pem",
9323 }
9324 `)
9325
Jooyung Han286957d2023-10-30 16:17:56 +09009326 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009327 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009328 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 +09009329}
9330
9331func TestApexKeysTxtOverrides(t *testing.T) {
9332 ctx := testApex(t, `
9333 apex {
9334 name: "myapex",
9335 key: "myapex.key",
9336 updatable: false,
9337 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009338 }
9339
9340 apex_key {
9341 name: "myapex.key",
9342 public_key: "testkey.avbpubkey",
9343 private_key: "testkey.pem",
9344 }
9345
9346 prebuilt_apex {
9347 name: "myapex",
9348 prefer: true,
9349 arch: {
9350 arm64: {
9351 src: "myapex-arm64.apex",
9352 },
9353 arm: {
9354 src: "myapex-arm.apex",
9355 },
9356 },
9357 }
9358
9359 apex_set {
9360 name: "myapex_set",
9361 set: "myapex.apks",
9362 filename: "myapex_set.apex",
9363 overrides: ["myapex"],
9364 }
9365 `)
9366
Colin Crossf61d03d2023-11-02 16:56:39 -07009367 content := android.ContentFromFileRuleForTests(t, ctx,
9368 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009369 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 -07009370 content = android.ContentFromFileRuleForTests(t, ctx,
9371 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009372 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 +09009373}
9374
Jooyung Han938b5932020-06-20 12:47:47 +09009375func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009376 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009377 apex {
9378 name: "myapex",
9379 key: "myapex.key",
9380 apps: ["app"],
9381 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009382 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009383 }
9384
9385 apex_key {
9386 name: "myapex.key",
9387 public_key: "testkey.avbpubkey",
9388 private_key: "testkey.pem",
9389 }
9390
9391 android_app {
9392 name: "app",
9393 srcs: ["foo/bar/MyClass.java"],
9394 package_name: "foo",
9395 sdk_version: "none",
9396 system_modules: "none",
9397 apex_available: [ "myapex" ],
9398 }
9399 `, withFiles(map[string][]byte{
9400 "sub/Android.bp": []byte(`
9401 override_apex {
9402 name: "override_myapex",
9403 base: "myapex",
9404 apps: ["override_app"],
9405 allowed_files: ":allowed",
9406 }
9407 // Overridable "path" property should be referenced indirectly
9408 filegroup {
9409 name: "allowed",
9410 srcs: ["allowed.txt"],
9411 }
9412 override_android_app {
9413 name: "override_app",
9414 base: "app",
9415 package_name: "bar",
9416 }
9417 `),
9418 }))
9419
Jooyung Hana0503a52023-08-23 13:12:50 +09009420 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009421 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9422 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9423 }
9424
Jooyung Hana0503a52023-08-23 13:12:50 +09009425 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009426 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9427 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9428 }
9429}
9430
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009431func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009432 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009437 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009438 }
9439
9440 apex_key {
9441 name: "myapex.key",
9442 public_key: "testkey.avbpubkey",
9443 private_key: "testkey.pem",
9444 }
9445
9446 cc_library {
9447 name: "mylib",
9448 srcs: ["mylib.cpp"],
9449 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009450 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009451 },
9452 apex_available: ["myapex"],
9453 }
9454
9455 cc_prebuilt_library_shared {
9456 name: "mylib",
9457 prefer: false,
9458 srcs: ["prebuilt.so"],
9459 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009460 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009461 },
9462 apex_available: ["myapex"],
9463 }
9464 `)
9465}
9466
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009467func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009468 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009469 apex {
9470 name: "myapex",
9471 key: "myapex.key",
9472 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009473 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009474 }
9475 apex_key {
9476 name: "myapex.key",
9477 public_key: "testkey.avbpubkey",
9478 private_key: "testkey.pem",
9479 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009480 `,
9481 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9482 variables.CompressedApex = proptools.BoolPtr(true)
9483 }),
9484 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009485
Jooyung Hana0503a52023-08-23 13:12:50 +09009486 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009487 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9488
Jooyung Hana0503a52023-08-23 13:12:50 +09009489 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009490 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9491
9492 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009493 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009494 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9495
9496 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009497 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009498 var builder strings.Builder
9499 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9500 androidMk := builder.String()
9501 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9502}
9503
Martin Stjernholm2856c662020-12-02 15:03:42 +00009504func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009505 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009506 apex {
9507 name: "myapex",
9508 key: "myapex.key",
9509 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009510 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009511 }
9512
9513 apex_key {
9514 name: "myapex.key",
9515 public_key: "testkey.avbpubkey",
9516 private_key: "testkey.pem",
9517 }
9518
9519 cc_library {
9520 name: "mylib",
9521 srcs: ["mylib.cpp"],
9522 apex_available: ["myapex"],
9523 shared_libs: ["otherlib"],
9524 system_shared_libs: [],
9525 }
9526
9527 cc_library {
9528 name: "otherlib",
9529 srcs: ["mylib.cpp"],
9530 stubs: {
9531 versions: ["current"],
9532 },
9533 }
9534
9535 cc_prebuilt_library_shared {
9536 name: "otherlib",
9537 prefer: true,
9538 srcs: ["prebuilt.so"],
9539 stubs: {
9540 versions: ["current"],
9541 },
9542 }
9543 `)
9544
Jooyung Hana0503a52023-08-23 13:12:50 +09009545 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009546 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009547 var builder strings.Builder
9548 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9549 androidMk := builder.String()
9550
9551 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9552 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009553 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009554}
9555
Jiyong Parke3867542020-12-03 17:28:25 +09009556func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009557 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009558 apex {
9559 name: "myapex",
9560 key: "myapex.key",
9561 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009562 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009563 }
9564
9565 apex_key {
9566 name: "myapex.key",
9567 public_key: "testkey.avbpubkey",
9568 private_key: "testkey.pem",
9569 }
9570
9571 cc_library {
9572 name: "mylib",
9573 srcs: ["mylib.cpp"],
9574 system_shared_libs: [],
9575 stl: "none",
9576 apex_available: ["myapex"],
9577 shared_libs: ["mylib2"],
9578 target: {
9579 apex: {
9580 exclude_shared_libs: ["mylib2"],
9581 },
9582 },
9583 }
9584
9585 cc_library {
9586 name: "mylib2",
9587 srcs: ["mylib.cpp"],
9588 system_shared_libs: [],
9589 stl: "none",
9590 }
9591 `)
9592
9593 // Check if mylib is linked to mylib2 for the non-apex target
9594 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9595 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9596
9597 // Make sure that the link doesn't occur for the apex target
9598 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9599 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9600
9601 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009602 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009603 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9604}
9605
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009606func TestPrebuiltStubLibDep(t *testing.T) {
9607 bpBase := `
9608 apex {
9609 name: "myapex",
9610 key: "myapex.key",
9611 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009612 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009613 }
9614 apex_key {
9615 name: "myapex.key",
9616 public_key: "testkey.avbpubkey",
9617 private_key: "testkey.pem",
9618 }
9619 cc_library {
9620 name: "mylib",
9621 srcs: ["mylib.cpp"],
9622 apex_available: ["myapex"],
9623 shared_libs: ["stublib"],
9624 system_shared_libs: [],
9625 }
9626 apex {
9627 name: "otherapex",
9628 enabled: %s,
9629 key: "myapex.key",
9630 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009631 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009632 }
9633 `
9634
9635 stublibSourceBp := `
9636 cc_library {
9637 name: "stublib",
9638 srcs: ["mylib.cpp"],
9639 apex_available: ["otherapex"],
9640 system_shared_libs: [],
9641 stl: "none",
9642 stubs: {
9643 versions: ["1"],
9644 },
9645 }
9646 `
9647
9648 stublibPrebuiltBp := `
9649 cc_prebuilt_library_shared {
9650 name: "stublib",
9651 srcs: ["prebuilt.so"],
9652 apex_available: ["otherapex"],
9653 stubs: {
9654 versions: ["1"],
9655 },
9656 %s
9657 }
9658 `
9659
9660 tests := []struct {
9661 name string
9662 stublibBp string
9663 usePrebuilt bool
9664 modNames []string // Modules to collect AndroidMkEntries for
9665 otherApexEnabled []string
9666 }{
9667 {
9668 name: "only_source",
9669 stublibBp: stublibSourceBp,
9670 usePrebuilt: false,
9671 modNames: []string{"stublib"},
9672 otherApexEnabled: []string{"true", "false"},
9673 },
9674 {
9675 name: "source_preferred",
9676 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9677 usePrebuilt: false,
9678 modNames: []string{"stublib", "prebuilt_stublib"},
9679 otherApexEnabled: []string{"true", "false"},
9680 },
9681 {
9682 name: "prebuilt_preferred",
9683 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9684 usePrebuilt: true,
9685 modNames: []string{"stublib", "prebuilt_stublib"},
9686 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9687 },
9688 {
9689 name: "only_prebuilt",
9690 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9691 usePrebuilt: true,
9692 modNames: []string{"stublib"},
9693 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9694 },
9695 }
9696
9697 for _, test := range tests {
9698 t.Run(test.name, func(t *testing.T) {
9699 for _, otherApexEnabled := range test.otherApexEnabled {
9700 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009701 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009702
9703 type modAndMkEntries struct {
9704 mod *cc.Module
9705 mkEntries android.AndroidMkEntries
9706 }
9707 entries := []*modAndMkEntries{}
9708
9709 // Gather shared lib modules that are installable
9710 for _, modName := range test.modNames {
9711 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9712 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9713 continue
9714 }
9715 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009716 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009717 continue
9718 }
Colin Crossaa255532020-07-03 13:18:24 -07009719 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009720 if ent.Disabled {
9721 continue
9722 }
9723 entries = append(entries, &modAndMkEntries{
9724 mod: mod,
9725 mkEntries: ent,
9726 })
9727 }
9728 }
9729 }
9730
9731 var entry *modAndMkEntries = nil
9732 for _, ent := range entries {
9733 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9734 if entry != nil {
9735 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9736 } else {
9737 entry = ent
9738 }
9739 }
9740 }
9741
9742 if entry == nil {
9743 t.Errorf("AndroidMk entry for \"stublib\" missing")
9744 } else {
9745 isPrebuilt := entry.mod.Prebuilt() != nil
9746 if isPrebuilt != test.usePrebuilt {
9747 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9748 }
9749 if !entry.mod.IsStubs() {
9750 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9751 }
9752 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9753 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9754 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009755 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009756 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009757 if !android.InList(expected, cflags) {
9758 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9759 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009760 }
9761 })
9762 }
9763 })
9764 }
9765}
9766
Colin Crossc33e5212021-05-25 18:16:02 -07009767func TestApexJavaCoverage(t *testing.T) {
9768 bp := `
9769 apex {
9770 name: "myapex",
9771 key: "myapex.key",
9772 java_libs: ["mylib"],
9773 bootclasspath_fragments: ["mybootclasspathfragment"],
9774 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9775 updatable: false,
9776 }
9777
9778 apex_key {
9779 name: "myapex.key",
9780 public_key: "testkey.avbpubkey",
9781 private_key: "testkey.pem",
9782 }
9783
9784 java_library {
9785 name: "mylib",
9786 srcs: ["mylib.java"],
9787 apex_available: ["myapex"],
9788 compile_dex: true,
9789 }
9790
9791 bootclasspath_fragment {
9792 name: "mybootclasspathfragment",
9793 contents: ["mybootclasspathlib"],
9794 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009795 hidden_api: {
9796 split_packages: ["*"],
9797 },
Colin Crossc33e5212021-05-25 18:16:02 -07009798 }
9799
9800 java_library {
9801 name: "mybootclasspathlib",
9802 srcs: ["mybootclasspathlib.java"],
9803 apex_available: ["myapex"],
9804 compile_dex: true,
9805 }
9806
9807 systemserverclasspath_fragment {
9808 name: "mysystemserverclasspathfragment",
9809 contents: ["mysystemserverclasspathlib"],
9810 apex_available: ["myapex"],
9811 }
9812
9813 java_library {
9814 name: "mysystemserverclasspathlib",
9815 srcs: ["mysystemserverclasspathlib.java"],
9816 apex_available: ["myapex"],
9817 compile_dex: true,
9818 }
9819 `
9820
9821 result := android.GroupFixturePreparers(
9822 PrepareForTestWithApexBuildComponents,
9823 prepareForTestWithMyapex,
9824 java.PrepareForTestWithJavaDefaultModules,
9825 android.PrepareForTestWithAndroidBuildComponents,
9826 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009827 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9828 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009829 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009830 ).RunTest(t)
9831
9832 // Make sure jacoco ran on both mylib and mybootclasspathlib
9833 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9834 t.Errorf("Failed to find jacoco rule for mylib")
9835 }
9836 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9837 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9838 }
9839 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9840 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9841 }
9842}
9843
Jiyong Park192600a2021-08-03 07:52:17 +00009844func TestProhibitStaticExecutable(t *testing.T) {
9845 testApexError(t, `executable mybin is static`, `
9846 apex {
9847 name: "myapex",
9848 key: "myapex.key",
9849 binaries: ["mybin"],
9850 min_sdk_version: "29",
9851 }
9852
9853 apex_key {
9854 name: "myapex.key",
9855 public_key: "testkey.avbpubkey",
9856 private_key: "testkey.pem",
9857 }
9858
9859 cc_binary {
9860 name: "mybin",
9861 srcs: ["mylib.cpp"],
9862 relative_install_path: "foo/bar",
9863 static_executable: true,
9864 system_shared_libs: [],
9865 stl: "none",
9866 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009867 min_sdk_version: "29",
9868 }
9869 `)
9870
9871 testApexError(t, `executable mybin.rust is static`, `
9872 apex {
9873 name: "myapex",
9874 key: "myapex.key",
9875 binaries: ["mybin.rust"],
9876 min_sdk_version: "29",
9877 }
9878
9879 apex_key {
9880 name: "myapex.key",
9881 public_key: "testkey.avbpubkey",
9882 private_key: "testkey.pem",
9883 }
9884
9885 rust_binary {
9886 name: "mybin.rust",
9887 srcs: ["foo.rs"],
9888 static_executable: true,
9889 apex_available: ["myapex"],
9890 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009891 }
9892 `)
9893}
9894
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009895func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9896 ctx := testApex(t, `
9897 apex {
9898 name: "myapex",
9899 key: "myapex.key",
9900 updatable: false,
9901 java_libs: ["foo"],
9902 }
9903
9904 apex_key {
9905 name: "myapex.key",
9906 public_key: "testkey.avbpubkey",
9907 private_key: "testkey.pem",
9908 }
9909
9910 java_library {
9911 name: "foo",
9912 srcs: ["foo.java"],
9913 apex_available: ["myapex"],
9914 installable: true,
9915 }
9916 `,
9917 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9918 )
9919
Jooyung Hana0503a52023-08-23 13:12:50 +09009920 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009921 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9922 var builder strings.Builder
9923 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9924 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009925 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 +00009926}
9927
9928func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9929 ctx := testApex(t, `
9930 prebuilt_apex {
9931 name: "myapex",
9932 arch: {
9933 arm64: {
9934 src: "myapex-arm64.apex",
9935 },
9936 arm: {
9937 src: "myapex-arm.apex",
9938 },
9939 },
9940 exported_java_libs: ["foo"],
9941 }
9942
9943 java_import {
9944 name: "foo",
9945 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009946 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009947 }
9948 `,
9949 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9950 )
9951
9952 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9953 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9954 mainModuleEntries := entriesList[0]
9955 android.AssertArrayString(t,
9956 "LOCAL_REQUIRED_MODULES",
9957 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9958 []string{
9959 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9960 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9961 })
9962}
9963
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009964func TestAndroidMk_RequiredModules(t *testing.T) {
9965 ctx := testApex(t, `
9966 apex {
9967 name: "myapex",
9968 key: "myapex.key",
9969 updatable: false,
9970 java_libs: ["foo"],
9971 required: ["otherapex"],
9972 }
9973
9974 apex {
9975 name: "otherapex",
9976 key: "myapex.key",
9977 updatable: false,
9978 java_libs: ["foo"],
9979 required: ["otherapex"],
9980 }
9981
9982 apex_key {
9983 name: "myapex.key",
9984 public_key: "testkey.avbpubkey",
9985 private_key: "testkey.pem",
9986 }
9987
9988 java_library {
9989 name: "foo",
9990 srcs: ["foo.java"],
9991 apex_available: ["myapex", "otherapex"],
9992 installable: true,
9993 }
9994 `)
9995
Jooyung Hana0503a52023-08-23 13:12:50 +09009996 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009997 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9998 var builder strings.Builder
9999 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
10000 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010001 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +090010002}
10003
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010004func TestAndroidMk_RequiredDeps(t *testing.T) {
10005 ctx := testApex(t, `
10006 apex {
10007 name: "myapex",
10008 key: "myapex.key",
10009 updatable: false,
10010 }
10011
10012 apex_key {
10013 name: "myapex.key",
10014 public_key: "testkey.avbpubkey",
10015 private_key: "testkey.pem",
10016 }
10017 `)
10018
Jooyung Hana0503a52023-08-23 13:12:50 +090010019 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010020 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010021 data := android.AndroidMkDataForTest(t, ctx, bundle)
10022 var builder strings.Builder
10023 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10024 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010025 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010026}
10027
Jooyung Hana6d36672022-02-24 13:58:07 +090010028func TestApexOutputFileProducer(t *testing.T) {
10029 for _, tc := range []struct {
10030 name string
10031 ref string
10032 expected_data []string
10033 }{
10034 {
10035 name: "test_using_output",
10036 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010037 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010038 },
10039 {
10040 name: "test_using_apex",
10041 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010042 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010043 },
10044 } {
10045 t.Run(tc.name, func(t *testing.T) {
10046 ctx := testApex(t, `
10047 apex {
10048 name: "myapex",
10049 key: "myapex.key",
10050 compressible: true,
10051 updatable: false,
10052 }
10053
10054 apex_key {
10055 name: "myapex.key",
10056 public_key: "testkey.avbpubkey",
10057 private_key: "testkey.pem",
10058 }
10059
10060 java_test {
10061 name: "`+tc.name+`",
10062 srcs: ["a.java"],
10063 data: ["`+tc.ref+`"],
10064 }
10065 `,
10066 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10067 variables.CompressedApex = proptools.BoolPtr(true)
10068 }))
10069 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10070 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10071 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10072 })
10073 }
10074}
10075
satayev758968a2021-12-06 11:42:40 +000010076func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10077 preparer := android.GroupFixturePreparers(
10078 PrepareForTestWithApexBuildComponents,
10079 prepareForTestWithMyapex,
10080 java.PrepareForTestWithJavaSdkLibraryFiles,
10081 java.PrepareForTestWithJavaDefaultModules,
10082 android.PrepareForTestWithAndroidBuildComponents,
10083 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10084 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10085 )
10086
10087 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10088 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10089 preparer.RunTestWithBp(t, `
10090 apex {
10091 name: "myapex",
10092 key: "myapex.key",
10093 bootclasspath_fragments: ["mybootclasspathfragment"],
10094 min_sdk_version: "30",
10095 updatable: false,
10096 }
10097
10098 apex_key {
10099 name: "myapex.key",
10100 public_key: "testkey.avbpubkey",
10101 private_key: "testkey.pem",
10102 }
10103
10104 bootclasspath_fragment {
10105 name: "mybootclasspathfragment",
10106 contents: ["mybootclasspathlib"],
10107 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010108 hidden_api: {
10109 split_packages: ["*"],
10110 },
satayev758968a2021-12-06 11:42:40 +000010111 }
10112
10113 java_sdk_library {
10114 name: "mybootclasspathlib",
10115 srcs: ["mybootclasspathlib.java"],
10116 apex_available: ["myapex"],
10117 compile_dex: true,
10118 unsafe_ignore_missing_latest_api: true,
10119 min_sdk_version: "31",
10120 static_libs: ["util"],
10121 }
10122
10123 java_library {
10124 name: "util",
10125 srcs: ["a.java"],
10126 apex_available: ["myapex"],
10127 min_sdk_version: "31",
10128 static_libs: ["another_util"],
10129 }
10130
10131 java_library {
10132 name: "another_util",
10133 srcs: ["a.java"],
10134 min_sdk_version: "31",
10135 apex_available: ["myapex"],
10136 }
10137 `)
10138 })
10139
10140 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10141 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10142 preparer.RunTestWithBp(t, `
10143 apex {
10144 name: "myapex",
10145 key: "myapex.key",
10146 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10147 min_sdk_version: "30",
10148 updatable: false,
10149 }
10150
10151 apex_key {
10152 name: "myapex.key",
10153 public_key: "testkey.avbpubkey",
10154 private_key: "testkey.pem",
10155 }
10156
10157 systemserverclasspath_fragment {
10158 name: "mysystemserverclasspathfragment",
10159 contents: ["mysystemserverclasspathlib"],
10160 apex_available: ["myapex"],
10161 }
10162
10163 java_sdk_library {
10164 name: "mysystemserverclasspathlib",
10165 srcs: ["mysystemserverclasspathlib.java"],
10166 apex_available: ["myapex"],
10167 compile_dex: true,
10168 min_sdk_version: "32",
10169 unsafe_ignore_missing_latest_api: true,
10170 static_libs: ["util"],
10171 }
10172
10173 java_library {
10174 name: "util",
10175 srcs: ["a.java"],
10176 apex_available: ["myapex"],
10177 min_sdk_version: "31",
10178 static_libs: ["another_util"],
10179 }
10180
10181 java_library {
10182 name: "another_util",
10183 srcs: ["a.java"],
10184 min_sdk_version: "31",
10185 apex_available: ["myapex"],
10186 }
10187 `)
10188 })
10189
10190 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10191 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10192 RunTestWithBp(t, `
10193 apex {
10194 name: "myapex",
10195 key: "myapex.key",
10196 bootclasspath_fragments: ["mybootclasspathfragment"],
10197 min_sdk_version: "30",
10198 updatable: false,
10199 }
10200
10201 apex_key {
10202 name: "myapex.key",
10203 public_key: "testkey.avbpubkey",
10204 private_key: "testkey.pem",
10205 }
10206
10207 bootclasspath_fragment {
10208 name: "mybootclasspathfragment",
10209 contents: ["mybootclasspathlib"],
10210 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010211 hidden_api: {
10212 split_packages: ["*"],
10213 },
satayev758968a2021-12-06 11:42:40 +000010214 }
10215
10216 java_sdk_library {
10217 name: "mybootclasspathlib",
10218 srcs: ["mybootclasspathlib.java"],
10219 apex_available: ["myapex"],
10220 compile_dex: true,
10221 unsafe_ignore_missing_latest_api: true,
10222 }
10223 `)
10224 })
10225
10226 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10227 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10228 RunTestWithBp(t, `
10229 apex {
10230 name: "myapex",
10231 key: "myapex.key",
10232 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10233 min_sdk_version: "30",
10234 updatable: false,
10235 }
10236
10237 apex_key {
10238 name: "myapex.key",
10239 public_key: "testkey.avbpubkey",
10240 private_key: "testkey.pem",
10241 }
10242
10243 systemserverclasspath_fragment {
10244 name: "mysystemserverclasspathfragment",
10245 contents: ["mysystemserverclasspathlib"],
10246 apex_available: ["myapex"],
10247 }
10248
10249 java_sdk_library {
10250 name: "mysystemserverclasspathlib",
10251 srcs: ["mysystemserverclasspathlib.java"],
10252 apex_available: ["myapex"],
10253 compile_dex: true,
10254 unsafe_ignore_missing_latest_api: true,
10255 }
10256 `)
10257 })
10258}
10259
Jiakai Zhang6decef92022-01-12 17:56:19 +000010260// Verifies that the APEX depends on all the Make modules in the list.
10261func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10262 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10263 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010264 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010265 }
10266}
10267
10268// Verifies that the APEX does not depend on any of the Make modules in the list.
10269func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10270 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10271 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010272 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010273 }
10274}
10275
Cole Faust1021ccd2023-02-26 21:15:25 -080010276// TODO(b/193460475): Re-enable this test
10277//func TestApexStrictUpdtabilityLint(t *testing.T) {
10278// bpTemplate := `
10279// apex {
10280// name: "myapex",
10281// key: "myapex.key",
10282// java_libs: ["myjavalib"],
10283// updatable: %v,
10284// min_sdk_version: "29",
10285// }
10286// apex_key {
10287// name: "myapex.key",
10288// }
10289// java_library {
10290// name: "myjavalib",
10291// srcs: ["MyClass.java"],
10292// apex_available: [ "myapex" ],
10293// lint: {
10294// strict_updatability_linting: %v,
10295// },
10296// sdk_version: "current",
10297// min_sdk_version: "29",
10298// }
10299// `
10300// fs := android.MockFS{
10301// "lint-baseline.xml": nil,
10302// }
10303//
10304// testCases := []struct {
10305// testCaseName string
10306// apexUpdatable bool
10307// javaStrictUpdtabilityLint bool
10308// lintFileExists bool
10309// disallowedFlagExpected bool
10310// }{
10311// {
10312// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10313// apexUpdatable: true,
10314// javaStrictUpdtabilityLint: true,
10315// lintFileExists: false,
10316// disallowedFlagExpected: false,
10317// },
10318// {
10319// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10320// apexUpdatable: false,
10321// javaStrictUpdtabilityLint: false,
10322// lintFileExists: true,
10323// disallowedFlagExpected: false,
10324// },
10325// {
10326// testCaseName: "non-updatable apex respects strict updatability of javalib",
10327// apexUpdatable: false,
10328// javaStrictUpdtabilityLint: true,
10329// lintFileExists: true,
10330// disallowedFlagExpected: true,
10331// },
10332// {
10333// testCaseName: "updatable apex sets strict updatability of javalib to true",
10334// apexUpdatable: true,
10335// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10336// lintFileExists: true,
10337// disallowedFlagExpected: true,
10338// },
10339// }
10340//
10341// for _, testCase := range testCases {
10342// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10343// fixtures := []android.FixturePreparer{}
10344// if testCase.lintFileExists {
10345// fixtures = append(fixtures, fs.AddToFixture())
10346// }
10347//
10348// result := testApex(t, bp, fixtures...)
10349// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10350// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10351// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10352//
10353// if disallowedFlagActual != testCase.disallowedFlagExpected {
10354// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10355// }
10356// }
10357//}
10358//
10359//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10360// bp := `
10361// apex {
10362// name: "myapex",
10363// key: "myapex.key",
10364// java_libs: ["myjavalib"],
10365// updatable: true,
10366// min_sdk_version: "29",
10367// }
10368// apex_key {
10369// name: "myapex.key",
10370// }
10371// java_library {
10372// name: "myjavalib",
10373// srcs: ["MyClass.java"],
10374// apex_available: [ "myapex" ],
10375// sdk_version: "current",
10376// min_sdk_version: "29",
10377// }
10378// `
10379//
10380// testCases := []struct {
10381// testCaseName string
10382// moduleDirectory string
10383// disallowedFlagExpected bool
10384// }{
10385// {
10386// testCaseName: "lintable module defined outside libcore",
10387// moduleDirectory: "",
10388// disallowedFlagExpected: true,
10389// },
10390// {
10391// testCaseName: "lintable module defined in libcore root directory",
10392// moduleDirectory: "libcore/",
10393// disallowedFlagExpected: false,
10394// },
10395// {
10396// testCaseName: "lintable module defined in libcore child directory",
10397// moduleDirectory: "libcore/childdir/",
10398// disallowedFlagExpected: true,
10399// },
10400// }
10401//
10402// for _, testCase := range testCases {
10403// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10404// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10405// result := testApex(t, "", lintFileCreator, bpFileCreator)
10406// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10407// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10408// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10409// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10410//
10411// if disallowedFlagActual != testCase.disallowedFlagExpected {
10412// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10413// }
10414// }
10415//}
10416//
10417//// checks transtive deps of an apex coming from bootclasspath_fragment
10418//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10419// bp := `
10420// apex {
10421// name: "myapex",
10422// key: "myapex.key",
10423// bootclasspath_fragments: ["mybootclasspathfragment"],
10424// updatable: true,
10425// min_sdk_version: "29",
10426// }
10427// apex_key {
10428// name: "myapex.key",
10429// }
10430// bootclasspath_fragment {
10431// name: "mybootclasspathfragment",
10432// contents: ["myjavalib"],
10433// apex_available: ["myapex"],
10434// hidden_api: {
10435// split_packages: ["*"],
10436// },
10437// }
10438// java_library {
10439// name: "myjavalib",
10440// srcs: ["MyClass.java"],
10441// apex_available: [ "myapex" ],
10442// sdk_version: "current",
10443// min_sdk_version: "29",
10444// compile_dex: true,
10445// }
10446// `
10447// fs := android.MockFS{
10448// "lint-baseline.xml": nil,
10449// }
10450//
10451// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10452// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10453// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10454// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10455// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10456// }
10457//}
Spandan Das66773252022-01-15 00:23:18 +000010458
Spandan Das42e89502022-05-06 22:12:55 +000010459// updatable apexes should propagate updatable=true to its apps
10460func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10461 bp := `
10462 apex {
10463 name: "myapex",
10464 key: "myapex.key",
10465 updatable: %v,
10466 apps: [
10467 "myapp",
10468 ],
10469 min_sdk_version: "30",
10470 }
10471 apex_key {
10472 name: "myapex.key",
10473 }
10474 android_app {
10475 name: "myapp",
10476 updatable: %v,
10477 apex_available: [
10478 "myapex",
10479 ],
10480 sdk_version: "current",
10481 min_sdk_version: "30",
10482 }
10483 `
10484 testCases := []struct {
10485 name string
10486 apex_is_updatable_bp bool
10487 app_is_updatable_bp bool
10488 app_is_updatable_expected bool
10489 }{
10490 {
10491 name: "Non-updatable apex respects updatable property of non-updatable app",
10492 apex_is_updatable_bp: false,
10493 app_is_updatable_bp: false,
10494 app_is_updatable_expected: false,
10495 },
10496 {
10497 name: "Non-updatable apex respects updatable property of updatable app",
10498 apex_is_updatable_bp: false,
10499 app_is_updatable_bp: true,
10500 app_is_updatable_expected: true,
10501 },
10502 {
10503 name: "Updatable apex respects updatable property of updatable app",
10504 apex_is_updatable_bp: true,
10505 app_is_updatable_bp: true,
10506 app_is_updatable_expected: true,
10507 },
10508 {
10509 name: "Updatable apex sets updatable=true on non-updatable app",
10510 apex_is_updatable_bp: true,
10511 app_is_updatable_bp: false,
10512 app_is_updatable_expected: true,
10513 },
10514 }
10515 for _, testCase := range testCases {
10516 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10517 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10518 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10519 }
10520}
10521
Kiyoung Kim487689e2022-07-26 09:48:22 +090010522func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10523 bp := `
10524 apex {
10525 name: "myapex",
10526 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010527 native_shared_libs: ["libbaz"],
10528 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010529 min_sdk_version: "29",
10530 }
10531 apex_key {
10532 name: "myapex.key",
10533 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010534 cc_binary {
10535 name: "binfoo",
10536 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010537 apex_available: ["myapex"],
10538 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010539 recovery_available: false,
10540 }
10541 cc_library {
10542 name: "libbar",
10543 srcs: ["libbar.cc"],
10544 stubs: {
10545 symbol_file: "libbar.map.txt",
10546 versions: [
10547 "29",
10548 ],
10549 },
10550 }
10551 cc_library {
10552 name: "libbaz",
10553 srcs: ["libbaz.cc"],
10554 apex_available: ["myapex"],
10555 min_sdk_version: "29",
10556 stubs: {
10557 symbol_file: "libbaz.map.txt",
10558 versions: [
10559 "29",
10560 ],
10561 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010562 }
10563 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010564 name: "libbar",
10565 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010566 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010567 variants: ["apex.29"],
10568 }
10569 cc_api_variant {
10570 name: "libbar",
10571 variant: "apex",
10572 version: "29",
10573 src: "libbar_apex_29.so",
10574 }
10575 cc_api_library {
10576 name: "libbaz",
10577 src: "libbaz_stub.so",
10578 min_sdk_version: "29",
10579 variants: ["apex.29"],
10580 }
10581 cc_api_variant {
10582 name: "libbaz",
10583 variant: "apex",
10584 version: "29",
10585 src: "libbaz_apex_29.so",
10586 }
10587 cc_api_library {
10588 name: "libqux",
10589 src: "libqux_stub.so",
10590 min_sdk_version: "29",
10591 variants: ["apex.29"],
10592 }
10593 cc_api_variant {
10594 name: "libqux",
10595 variant: "apex",
10596 version: "29",
10597 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010598 }
10599 api_imports {
10600 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010601 apex_shared_libs: [
10602 "libbar",
10603 "libbaz",
10604 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010605 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010606 }
10607 `
10608 result := testApex(t, bp)
10609
10610 hasDep := func(m android.Module, wantDep android.Module) bool {
10611 t.Helper()
10612 var found bool
10613 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10614 if dep == wantDep {
10615 found = true
10616 }
10617 })
10618 return found
10619 }
10620
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010621 // Library defines stubs and cc_api_library should be used with cc_api_library
10622 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10623 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10624 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010625
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010626 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10627 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010628
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010629 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10630 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10631 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10632 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10633
10634 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10635 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10636 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10637 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10638 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10639
10640 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10641 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10642 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10643
10644 // cc_api_library defined without original library should be linked with cc_api_library
10645 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10646 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10647 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10648}
10649
10650func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10651 bp := `
10652 apex {
10653 name: "myapex",
10654 key: "myapex.key",
10655 native_shared_libs: ["libbar"],
10656 min_sdk_version: "29",
10657 }
10658 apex_key {
10659 name: "myapex.key",
10660 }
10661 cc_binary {
10662 name: "binfoo",
10663 shared_libs: ["libbar"],
10664 recovery_available: false,
10665 }
10666 cc_library {
10667 name: "libbar",
10668 srcs: ["libbar.cc"],
10669 apex_available: ["myapex"],
10670 min_sdk_version: "29",
10671 stubs: {
10672 symbol_file: "libbar.map.txt",
10673 versions: [
10674 "29",
10675 ],
10676 },
10677 }
10678 cc_api_library {
10679 name: "libbar",
10680 src: "libbar_stub.so",
10681 variants: ["apex.29"],
10682 }
10683 cc_api_variant {
10684 name: "libbar",
10685 variant: "apex",
10686 version: "29",
10687 src: "libbar_apex_29.so",
10688 }
10689 api_imports {
10690 name: "api_imports",
10691 apex_shared_libs: [
10692 "libbar",
10693 ],
10694 }
10695 `
10696
10697 result := testApex(t, bp)
10698
10699 hasDep := func(m android.Module, wantDep android.Module) bool {
10700 t.Helper()
10701 var found bool
10702 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10703 if dep == wantDep {
10704 found = true
10705 }
10706 })
10707 return found
10708 }
10709
10710 // Library defines stubs and cc_api_library should be used with cc_api_library
10711 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10712 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10713 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10714
10715 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10716 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10717
10718 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10719 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10720 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10721 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010722}
Dennis Shend4f5d932023-01-31 20:27:21 +000010723
10724func TestTrimmedApex(t *testing.T) {
10725 bp := `
10726 apex {
10727 name: "myapex",
10728 key: "myapex.key",
10729 native_shared_libs: ["libfoo","libbaz"],
10730 min_sdk_version: "29",
10731 trim_against: "mydcla",
10732 }
10733 apex {
10734 name: "mydcla",
10735 key: "myapex.key",
10736 native_shared_libs: ["libfoo","libbar"],
10737 min_sdk_version: "29",
10738 file_contexts: ":myapex-file_contexts",
10739 dynamic_common_lib_apex: true,
10740 }
10741 apex_key {
10742 name: "myapex.key",
10743 }
10744 cc_library {
10745 name: "libfoo",
10746 shared_libs: ["libc"],
10747 apex_available: ["myapex","mydcla"],
10748 min_sdk_version: "29",
10749 }
10750 cc_library {
10751 name: "libbar",
10752 shared_libs: ["libc"],
10753 apex_available: ["myapex","mydcla"],
10754 min_sdk_version: "29",
10755 }
10756 cc_library {
10757 name: "libbaz",
10758 shared_libs: ["libc"],
10759 apex_available: ["myapex","mydcla"],
10760 min_sdk_version: "29",
10761 }
10762 cc_api_library {
10763 name: "libc",
10764 src: "libc.so",
10765 min_sdk_version: "29",
10766 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010767 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010768 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010769 }
10770 api_imports {
10771 name: "api_imports",
10772 shared_libs: [
10773 "libc",
10774 ],
10775 header_libs: [],
10776 }
10777 `
10778 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010779 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010780 apexRule := module.MaybeRule("apexRule")
10781 if apexRule.Rule == nil {
10782 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10783 }
10784
10785 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010786 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010787 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10788 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10789 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10790 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10791}
Jingwen Chendea7a642023-03-28 11:30:50 +000010792
10793func TestCannedFsConfig(t *testing.T) {
10794 ctx := testApex(t, `
10795 apex {
10796 name: "myapex",
10797 key: "myapex.key",
10798 updatable: false,
10799 }
10800
10801 apex_key {
10802 name: "myapex.key",
10803 public_key: "testkey.avbpubkey",
10804 private_key: "testkey.pem",
10805 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010806 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010807 generateFsRule := mod.Rule("generateFsConfig")
10808 cmd := generateFsRule.RuleParams.Command
10809
10810 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10811}
10812
10813func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10814 ctx := testApex(t, `
10815 apex {
10816 name: "myapex",
10817 key: "myapex.key",
10818 canned_fs_config: "my_config",
10819 updatable: false,
10820 }
10821
10822 apex_key {
10823 name: "myapex.key",
10824 public_key: "testkey.avbpubkey",
10825 private_key: "testkey.pem",
10826 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010827 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010828 generateFsRule := mod.Rule("generateFsConfig")
10829 cmd := generateFsRule.RuleParams.Command
10830
10831 // Ensure that canned_fs_config has "cat my_config" at the end
10832 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10833}
Spandan Das20fce2d2023-04-12 17:21:39 +000010834
10835func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10836 testCases := []struct {
10837 desc string
10838 hasStubs bool
10839 apexAvailable string
10840 expectedError string
10841 }{
10842 {
10843 desc: "non-stub library can have multiple apex_available",
10844 hasStubs: false,
10845 apexAvailable: `["myapex", "otherapex"]`,
10846 },
10847 {
10848 desc: "stub library should not be available to anyapex",
10849 hasStubs: true,
10850 apexAvailable: `["//apex_available:anyapex"]`,
10851 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10852 },
10853 {
10854 desc: "stub library should not be available to multiple apexes",
10855 hasStubs: true,
10856 apexAvailable: `["myapex", "otherapex"]`,
10857 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10858 },
10859 {
10860 desc: "stub library can be available to a core apex and a test apex",
10861 hasStubs: true,
10862 apexAvailable: `["myapex", "test_myapex"]`,
10863 },
10864 }
10865 bpTemplate := `
10866 cc_library {
10867 name: "libfoo",
10868 %v
10869 apex_available: %v,
10870 }
10871 apex {
10872 name: "myapex",
10873 key: "apex.key",
10874 updatable: false,
10875 native_shared_libs: ["libfoo"],
10876 }
10877 apex {
10878 name: "otherapex",
10879 key: "apex.key",
10880 updatable: false,
10881 }
10882 apex_test {
10883 name: "test_myapex",
10884 key: "apex.key",
10885 updatable: false,
10886 native_shared_libs: ["libfoo"],
10887 }
10888 apex_key {
10889 name: "apex.key",
10890 }
10891 `
10892 for _, tc := range testCases {
10893 stubs := ""
10894 if tc.hasStubs {
10895 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10896 }
10897 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10898 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10899 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10900 })
10901 if tc.expectedError == "" {
10902 testApex(t, bp, mockFsFixturePreparer)
10903 } else {
10904 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10905 }
10906 }
10907}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010908
10909func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10910 context := android.GroupFixturePreparers(
10911 android.PrepareForIntegrationTestWithAndroid,
10912 cc.PrepareForIntegrationTestWithCc,
10913 PrepareForTestWithApexBuildComponents,
10914 prepareForTestWithMyapex,
10915 filesystem.PrepareForTestWithFilesystemBuildComponents,
10916 )
10917 result := context.RunTestWithBp(t, `
10918 android_system_image {
10919 name: "myfilesystem",
10920 deps: [
10921 "libfoo",
10922 ],
10923 linker_config_src: "linker.config.json",
10924 }
10925
10926 cc_library {
10927 name: "libfoo",
10928 shared_libs: [
10929 "libbar",
10930 ],
10931 stl: "none",
10932 }
10933
10934 cc_library {
10935 name: "libbar",
10936 stl: "none",
10937 apex_available: ["myapex"],
10938 }
10939
10940 apex {
10941 name: "myapex",
10942 native_shared_libs: ["libbar"],
10943 key: "myapex.key",
10944 updatable: false,
10945 }
10946
10947 apex_key {
10948 name: "myapex.key",
10949 public_key: "testkey.avbpubkey",
10950 private_key: "testkey.pem",
10951 }
10952 `)
10953
10954 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10955 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10956 inputs.Strings(),
10957 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10958}
Yu Liueae7b362023-11-16 17:05:47 -080010959
10960var apex_default_bp = `
10961 apex_key {
10962 name: "myapex.key",
10963 public_key: "testkey.avbpubkey",
10964 private_key: "testkey.pem",
10965 }
10966
10967 filegroup {
10968 name: "myapex.manifest",
10969 srcs: ["apex_manifest.json"],
10970 }
10971
10972 filegroup {
10973 name: "myapex.androidmanifest",
10974 srcs: ["AndroidManifest.xml"],
10975 }
10976`
10977
10978func TestAconfigFilesJavaDeps(t *testing.T) {
10979 ctx := testApex(t, apex_default_bp+`
10980 apex {
10981 name: "myapex",
10982 manifest: ":myapex.manifest",
10983 androidManifest: ":myapex.androidmanifest",
10984 key: "myapex.key",
10985 java_libs: [
10986 "my_java_library_foo",
10987 "my_java_library_bar",
10988 ],
10989 updatable: false,
10990 }
10991
10992 java_library {
10993 name: "my_java_library_foo",
10994 srcs: ["foo/bar/MyClass.java"],
10995 sdk_version: "none",
10996 system_modules: "none",
10997 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010998 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010999 "myapex",
11000 ],
11001 }
11002
11003 java_library {
11004 name: "my_java_library_bar",
11005 srcs: ["foo/bar/MyClass.java"],
11006 sdk_version: "none",
11007 system_modules: "none",
11008 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011009 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011010 "myapex",
11011 ],
11012 }
11013
11014 aconfig_declarations {
11015 name: "my_aconfig_declarations_foo",
11016 package: "com.example.package",
11017 container: "myapex",
11018 srcs: ["foo.aconfig"],
11019 }
11020
11021 java_aconfig_library {
11022 name: "my_java_aconfig_library_foo",
11023 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011024 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011025 "myapex",
11026 ],
11027 }
11028
11029 aconfig_declarations {
11030 name: "my_aconfig_declarations_bar",
11031 package: "com.example.package",
11032 container: "myapex",
11033 srcs: ["bar.aconfig"],
11034 }
11035
11036 java_aconfig_library {
11037 name: "my_java_aconfig_library_bar",
11038 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011039 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011040 "myapex",
11041 ],
11042 }
11043 `)
11044
11045 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11046 s := mod.Rule("apexRule").Args["copy_commands"]
11047 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11048 if len(copyCmds) != 5 {
11049 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11050 }
11051
11052 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11053
11054 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11055 s = " " + combineAconfigRule.Args["cache_files"]
11056 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11057 if len(aconfigArgs) != 2 {
11058 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11059 }
11060 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11061 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11062
11063 buildParams := combineAconfigRule.BuildParams
11064 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11065 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11066 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11067}
11068
11069func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11070 ctx := testApex(t, apex_default_bp+`
11071 apex {
11072 name: "myapex",
11073 manifest: ":myapex.manifest",
11074 androidManifest: ":myapex.androidmanifest",
11075 key: "myapex.key",
11076 java_libs: [
11077 "my_java_library_foo",
11078 ],
11079 native_shared_libs: [
11080 "my_cc_library_bar",
11081 ],
11082 binaries: [
11083 "my_cc_binary_baz",
11084 ],
11085 updatable: false,
11086 }
11087
11088 java_library {
11089 name: "my_java_library_foo",
11090 srcs: ["foo/bar/MyClass.java"],
11091 sdk_version: "none",
11092 system_modules: "none",
11093 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011094 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011095 "myapex",
11096 ],
11097 }
11098
11099 cc_library {
11100 name: "my_cc_library_bar",
11101 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011102 static_libs: [
11103 "my_cc_aconfig_library_bar",
11104 "my_cc_aconfig_library_baz",
11105 ],
Yu Liueae7b362023-11-16 17:05:47 -080011106 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011107 "myapex",
11108 ],
11109 }
11110
11111 cc_binary {
11112 name: "my_cc_binary_baz",
11113 srcs: ["foo/bar/MyClass.cc"],
11114 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011115 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011116 "myapex",
11117 ],
11118 }
11119
11120 aconfig_declarations {
11121 name: "my_aconfig_declarations_foo",
11122 package: "com.example.package",
11123 container: "myapex",
11124 srcs: ["foo.aconfig"],
11125 }
11126
11127 java_aconfig_library {
11128 name: "my_java_aconfig_library_foo",
11129 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011130 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011131 "myapex",
11132 ],
11133 }
11134
11135 aconfig_declarations {
11136 name: "my_aconfig_declarations_bar",
11137 package: "com.example.package",
11138 container: "myapex",
11139 srcs: ["bar.aconfig"],
11140 }
11141
11142 cc_aconfig_library {
11143 name: "my_cc_aconfig_library_bar",
11144 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011145 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011146 "myapex",
11147 ],
11148 }
11149
11150 aconfig_declarations {
11151 name: "my_aconfig_declarations_baz",
11152 package: "com.example.package",
11153 container: "myapex",
11154 srcs: ["baz.aconfig"],
11155 }
11156
11157 cc_aconfig_library {
11158 name: "my_cc_aconfig_library_baz",
11159 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011160 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011161 "myapex",
11162 ],
11163 }
11164
11165 cc_library {
11166 name: "server_configurable_flags",
11167 srcs: ["server_configurable_flags.cc"],
11168 }
11169 `)
11170
11171 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11172 s := mod.Rule("apexRule").Args["copy_commands"]
11173 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11174 if len(copyCmds) != 9 {
11175 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11176 }
11177
11178 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11179
11180 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11181 s = " " + combineAconfigRule.Args["cache_files"]
11182 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11183 if len(aconfigArgs) != 3 {
11184 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11185 }
11186 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011187 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 -080011188 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11189
11190 buildParams := combineAconfigRule.BuildParams
11191 if len(buildParams.Inputs) != 3 {
11192 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11193 }
11194 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011195 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 -080011196 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11197 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11198}
11199
Yu Liucec0e412023-11-30 16:45:50 -080011200func TestAconfigFilesRustDeps(t *testing.T) {
11201 ctx := testApex(t, apex_default_bp+`
11202 apex {
11203 name: "myapex",
11204 manifest: ":myapex.manifest",
11205 androidManifest: ":myapex.androidmanifest",
11206 key: "myapex.key",
11207 native_shared_libs: [
11208 "libmy_rust_library",
11209 ],
11210 binaries: [
11211 "my_rust_binary",
11212 ],
11213 rust_dyn_libs: [
11214 "libmy_rust_dylib",
11215 ],
11216 updatable: false,
11217 }
11218
11219 rust_library {
11220 name: "libflags_rust", // test mock
11221 crate_name: "flags_rust",
11222 srcs: ["lib.rs"],
11223 apex_available: [
11224 "myapex",
11225 ],
11226 }
11227
11228 rust_library {
11229 name: "liblazy_static", // test mock
11230 crate_name: "lazy_static",
11231 srcs: ["src/lib.rs"],
11232 apex_available: [
11233 "myapex",
11234 ],
11235 }
11236
11237 rust_ffi_shared {
11238 name: "libmy_rust_library",
11239 srcs: ["src/lib.rs"],
11240 rustlibs: ["libmy_rust_aconfig_library_foo"],
11241 crate_name: "my_rust_library",
11242 apex_available: [
11243 "myapex",
11244 ],
11245 }
11246
11247 rust_library_dylib {
11248 name: "libmy_rust_dylib",
11249 srcs: ["foo/bar/MyClass.rs"],
11250 rustlibs: ["libmy_rust_aconfig_library_bar"],
11251 crate_name: "my_rust_dylib",
11252 apex_available: [
11253 "myapex",
11254 ],
11255 }
11256
11257 rust_binary {
11258 name: "my_rust_binary",
11259 srcs: ["foo/bar/MyClass.rs"],
11260 rustlibs: [
11261 "libmy_rust_aconfig_library_baz",
11262 "libmy_rust_dylib",
11263 ],
11264 apex_available: [
11265 "myapex",
11266 ],
11267 }
11268
11269 aconfig_declarations {
11270 name: "my_aconfig_declarations_foo",
11271 package: "com.example.package",
11272 container: "myapex",
11273 srcs: ["foo.aconfig"],
11274 }
11275
11276 aconfig_declarations {
11277 name: "my_aconfig_declarations_bar",
11278 package: "com.example.package",
11279 container: "myapex",
11280 srcs: ["bar.aconfig"],
11281 }
11282
11283 aconfig_declarations {
11284 name: "my_aconfig_declarations_baz",
11285 package: "com.example.package",
11286 container: "myapex",
11287 srcs: ["baz.aconfig"],
11288 }
11289
11290 rust_aconfig_library {
11291 name: "libmy_rust_aconfig_library_foo",
11292 aconfig_declarations: "my_aconfig_declarations_foo",
11293 crate_name: "my_rust_aconfig_library_foo",
11294 apex_available: [
11295 "myapex",
11296 ],
11297 }
11298
11299 rust_aconfig_library {
11300 name: "libmy_rust_aconfig_library_bar",
11301 aconfig_declarations: "my_aconfig_declarations_bar",
11302 crate_name: "my_rust_aconfig_library_bar",
11303 apex_available: [
11304 "myapex",
11305 ],
11306 }
11307
11308 rust_aconfig_library {
11309 name: "libmy_rust_aconfig_library_baz",
11310 aconfig_declarations: "my_aconfig_declarations_baz",
11311 crate_name: "my_rust_aconfig_library_baz",
11312 apex_available: [
11313 "myapex",
11314 ],
11315 }
11316 `)
11317
11318 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11319 s := mod.Rule("apexRule").Args["copy_commands"]
11320 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11321 if len(copyCmds) != 23 {
11322 t.Fatalf("Expected 23 commands, got %d in:\n%s", len(copyCmds), s)
11323 }
11324
11325 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11326
11327 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11328 s = " " + combineAconfigRule.Args["cache_files"]
11329 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11330 if len(aconfigArgs) != 2 {
11331 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11332 }
11333 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011334 android.EnsureListContainsSuffix(t, aconfigArgs, "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011335
11336 buildParams := combineAconfigRule.BuildParams
11337 if len(buildParams.Inputs) != 2 {
11338 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11339 }
11340 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011341 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 -080011342 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11343}
11344
Yu Liueae7b362023-11-16 17:05:47 -080011345func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11346 ctx := testApex(t, apex_default_bp+`
11347 apex {
11348 name: "myapex",
11349 manifest: ":myapex.manifest",
11350 androidManifest: ":myapex.androidmanifest",
11351 key: "myapex.key",
11352 java_libs: [
11353 "my_java_library_foo",
11354 "other_java_library_bar",
11355 ],
11356 updatable: false,
11357 }
11358
11359 java_library {
11360 name: "my_java_library_foo",
11361 srcs: ["foo/bar/MyClass.java"],
11362 sdk_version: "none",
11363 system_modules: "none",
11364 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011365 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011366 "myapex",
11367 ],
11368 }
11369
11370 java_library {
11371 name: "other_java_library_bar",
11372 srcs: ["foo/bar/MyClass.java"],
11373 sdk_version: "none",
11374 system_modules: "none",
11375 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011376 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011377 "myapex",
11378 ],
11379 }
11380
11381 aconfig_declarations {
11382 name: "my_aconfig_declarations_foo",
11383 package: "com.example.package",
11384 container: "myapex",
11385 srcs: ["foo.aconfig"],
11386 }
11387
11388 java_aconfig_library {
11389 name: "my_java_aconfig_library_foo",
11390 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011391 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011392 "myapex",
11393 ],
11394 }
11395
11396 aconfig_declarations {
11397 name: "other_aconfig_declarations_bar",
11398 package: "com.example.package",
11399 container: "otherapex",
11400 srcs: ["bar.aconfig"],
11401 }
11402
11403 java_aconfig_library {
11404 name: "other_java_aconfig_library_bar",
11405 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011406 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011407 "myapex",
11408 ],
11409 }
11410 `)
11411
11412 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11413 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11414 s := " " + combineAconfigRule.Args["cache_files"]
11415 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11416 if len(aconfigArgs) != 1 {
11417 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11418 }
11419 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11420
11421 buildParams := combineAconfigRule.BuildParams
11422 if len(buildParams.Inputs) != 1 {
11423 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11424 }
11425 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11426 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11427}
11428
11429func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11430 ctx := testApex(t, apex_default_bp+`
11431 apex {
11432 name: "myapex",
11433 manifest: ":myapex.manifest",
11434 androidManifest: ":myapex.androidmanifest",
11435 key: "myapex.key",
11436 java_libs: [
11437 "my_java_library_foo",
11438 "my_java_library_bar",
11439 ],
11440 updatable: false,
11441 }
11442
11443 java_library {
11444 name: "my_java_library_foo",
11445 srcs: ["foo/bar/MyClass.java"],
11446 sdk_version: "none",
11447 system_modules: "none",
11448 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011449 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011450 "myapex",
11451 ],
11452 }
11453
11454 java_library {
11455 name: "my_java_library_bar",
11456 srcs: ["foo/bar/MyClass.java"],
11457 sdk_version: "none",
11458 system_modules: "none",
11459 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011460 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011461 "myapex",
11462 ],
11463 }
11464
11465 aconfig_declarations {
11466 name: "my_aconfig_declarations_foo",
11467 package: "com.example.package",
11468 container: "myapex",
11469 srcs: ["foo.aconfig"],
11470 }
11471
11472 java_aconfig_library {
11473 name: "my_java_aconfig_library_foo",
11474 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011475 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011476 "myapex",
11477 ],
11478 }
11479
11480 java_aconfig_library {
11481 name: "my_java_aconfig_library_bar",
11482 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011483 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011484 "myapex",
11485 ],
11486 }
11487 `)
11488
11489 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11490 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11491 s := " " + combineAconfigRule.Args["cache_files"]
11492 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11493 if len(aconfigArgs) != 1 {
11494 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11495 }
11496 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11497
11498 buildParams := combineAconfigRule.BuildParams
11499 if len(buildParams.Inputs) != 1 {
11500 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11501 }
11502 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11503 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11504}
Spandan Das5be63332023-12-13 00:06:32 +000011505
11506// Test that the boot jars come from the _selected_ apex prebuilt
11507// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11508func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11509 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11510 t.Helper()
11511 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11512 foundLibfooJar := false
11513 base := stem + ".jar"
11514 for _, output := range s.AllOutputs() {
11515 if filepath.Base(output) == base {
11516 foundLibfooJar = true
11517 buildRule := s.Output(output)
11518 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11519 }
11520 }
11521 if !foundLibfooJar {
11522 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11523 }
11524 }
11525
Spandan Das64c9e0c2023-12-20 20:13:34 +000011526 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11527 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11528 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11529 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11530 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11531 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)
11532 }
11533
11534 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11535 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11536 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11537 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11538 }
11539
Spandan Das5be63332023-12-13 00:06:32 +000011540 bp := `
11541 // Source APEX.
11542
11543 java_library {
11544 name: "framework-foo",
11545 srcs: ["foo.java"],
11546 installable: true,
11547 apex_available: [
11548 "com.android.foo",
11549 ],
11550 }
11551
11552 bootclasspath_fragment {
11553 name: "foo-bootclasspath-fragment",
11554 contents: ["framework-foo"],
11555 apex_available: [
11556 "com.android.foo",
11557 ],
11558 hidden_api: {
11559 split_packages: ["*"],
11560 },
11561 }
11562
11563 apex_key {
11564 name: "com.android.foo.key",
11565 public_key: "com.android.foo.avbpubkey",
11566 private_key: "com.android.foo.pem",
11567 }
11568
11569 apex {
11570 name: "com.android.foo",
11571 key: "com.android.foo.key",
11572 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11573 updatable: false,
11574 }
11575
11576 // Prebuilt APEX.
11577
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011578 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011579 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011580 public: {
11581 jars: ["foo.jar"],
11582 },
Spandan Das5be63332023-12-13 00:06:32 +000011583 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011584 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011585 }
11586
11587 prebuilt_bootclasspath_fragment {
11588 name: "foo-bootclasspath-fragment",
11589 contents: ["framework-foo"],
11590 hidden_api: {
11591 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11592 metadata: "my-bootclasspath-fragment/metadata.csv",
11593 index: "my-bootclasspath-fragment/index.csv",
11594 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11595 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11596 },
11597 apex_available: [
11598 "com.android.foo",
11599 ],
11600 }
11601
11602 prebuilt_apex {
11603 name: "com.android.foo",
11604 apex_name: "com.android.foo",
11605 src: "com.android.foo-arm.apex",
11606 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11607 }
11608
11609 // Another Prebuilt ART APEX
11610 prebuilt_apex {
11611 name: "com.android.foo.v2",
11612 apex_name: "com.android.foo", // Used to determine the API domain
11613 src: "com.android.foo-arm.apex",
11614 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11615 }
11616
11617 // APEX contribution modules
11618
11619 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011620 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011621 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011622 contents: ["com.android.foo"],
11623 }
11624
11625 apex_contributions {
11626 name: "foo.prebuilt.contributions",
11627 api_domain: "com.android.foo",
11628 contents: ["prebuilt_com.android.foo"],
11629 }
11630
11631 apex_contributions {
11632 name: "foo.prebuilt.v2.contributions",
11633 api_domain: "com.android.foo",
11634 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011635 }
11636 `
11637
11638 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011639 desc string
11640 selectedApexContributions string
11641 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011642 }{
11643 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011644 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11645 selectedApexContributions: "foo.source.contributions",
11646 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011647 },
11648 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011649 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11650 selectedApexContributions: "foo.prebuilt.contributions",
11651 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011652 },
11653 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011654 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11655 selectedApexContributions: "foo.prebuilt.v2.contributions",
11656 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011657 },
11658 }
11659
11660 fragment := java.ApexVariantReference{
11661 Apex: proptools.StringPtr("com.android.foo"),
11662 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11663 }
11664
11665 for _, tc := range testCases {
11666 preparer := android.GroupFixturePreparers(
11667 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11668 android.FixtureMergeMockFs(map[string][]byte{
11669 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11670 }),
11671 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11672 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011673 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011674 }
11675 }),
11676 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011677 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011678 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011679 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11680 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011681 }
11682}
Spandan Das3576e762024-01-03 18:57:03 +000011683
11684// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11685// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11686func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11687 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11688 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11689 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11690 // Variations are created based on apex_name
11691 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11692 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11693 }
11694 // for a mainline module family, check that only the flagged soong module is visible to make
11695 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11696 variation := func(moduleName string) string {
11697 ret := "android_common_com.android.foo"
11698 if moduleName == "com.google.android.foo" {
11699 ret = "android_common_com.google.android.foo_com.android.foo"
11700 }
11701 return ret
11702 }
11703
11704 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11705 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11706
11707 for _, hiddenModuleName := range hiddenModuleNames {
11708 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11709 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11710
11711 }
11712 }
11713
11714 bp := `
11715 apex_key {
11716 name: "com.android.foo.key",
11717 public_key: "com.android.foo.avbpubkey",
11718 private_key: "com.android.foo.pem",
11719 }
11720
11721 // AOSP source apex
11722 apex {
11723 name: "com.android.foo",
11724 key: "com.android.foo.key",
11725 updatable: false,
11726 }
11727
11728 // Google source apex
11729 override_apex {
11730 name: "com.google.android.foo",
11731 base: "com.android.foo",
11732 key: "com.android.foo.key",
11733 }
11734
11735 // Prebuilt Google APEX.
11736
11737 prebuilt_apex {
11738 name: "com.google.android.foo",
11739 apex_name: "com.android.foo",
11740 src: "com.android.foo-arm.apex",
11741 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11742 }
11743
11744 // Another Prebuilt Google APEX
11745 prebuilt_apex {
11746 name: "com.google.android.foo.v2",
11747 apex_name: "com.android.foo",
11748 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11749 src: "com.android.foo-arm.apex",
11750 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11751 }
11752
11753 // APEX contribution modules
11754
11755 apex_contributions {
11756 name: "foo.source.contributions",
11757 api_domain: "com.android.foo",
11758 contents: ["com.google.android.foo"],
11759 }
11760
11761 apex_contributions {
11762 name: "foo.prebuilt.contributions",
11763 api_domain: "com.android.foo",
11764 contents: ["prebuilt_com.google.android.foo"],
11765 }
11766
11767 apex_contributions {
11768 name: "foo.prebuilt.v2.contributions",
11769 api_domain: "com.android.foo",
11770 contents: ["prebuilt_com.google.android.foo.v2"],
11771 }
11772
11773 // This is an incompatible module because it selects multiple versions of the same mainline module
11774 apex_contributions {
11775 name: "foo.prebuilt.duplicate.contributions",
11776 api_domain: "com.android.foo",
11777 contents: [
11778 "prebuilt_com.google.android.foo",
11779 "prebuilt_com.google.android.foo.v2",
11780 ],
11781 }
11782 `
11783
11784 testCases := []struct {
11785 desc string
11786 selectedApexContributions string
11787 expectedVisibleModuleName string
11788 expectedHiddenModuleNames []string
11789 expectedError string
11790 }{
11791 {
11792 desc: "Source apex is selected, prebuilts should be hidden from make",
11793 selectedApexContributions: "foo.source.contributions",
11794 expectedVisibleModuleName: "com.google.android.foo",
11795 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11796 },
11797 {
11798 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11799 selectedApexContributions: "foo.prebuilt.contributions",
11800 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11801 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11802 },
11803 {
11804 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11805 selectedApexContributions: "foo.prebuilt.v2.contributions",
11806 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11807 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11808 },
11809 {
11810 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11811 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11812 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11813 },
11814 }
11815
11816 for _, tc := range testCases {
11817 preparer := android.GroupFixturePreparers(
11818 android.FixtureMergeMockFs(map[string][]byte{
11819 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11820 }),
11821 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11822 variables.BuildFlags = map[string]string{
11823 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11824 }
11825 }),
11826 )
11827 if tc.expectedError != "" {
11828 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11829 testApex(t, bp, preparer)
11830 return
11831 }
11832 ctx := testApex(t, bp, preparer)
11833
11834 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11835 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11836 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11837 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11838
11839 // Check that
11840 // 1. The contents of the selected apex_contributions are visible to make
11841 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11842 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11843 }
11844}