blob: d3959ec5410d24f9f4f9bf6385a31efea8ccde69 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
221 variables.DeviceVndkVersion = proptools.StringPtr("current")
222 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
223 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
224 variables.Platform_sdk_codename = proptools.StringPtr("Q")
225 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000226 // "Tiramisu" needs to be in the next line for compatibility with soong code,
227 // not because of these tests specifically (it's not used by the tests)
228 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900229 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000230 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000231 }),
232)
233
Paul Duffin52bfaa42021-03-23 23:40:12 +0000234var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
235 "system/sepolicy/apex/myapex-file_contexts": nil,
236})
237
Jooyung Han643adc42020-02-27 13:50:06 +0900238// ensure that 'result' equals 'expected'
239func ensureEquals(t *testing.T, result string, expected string) {
240 t.Helper()
241 if result != expected {
242 t.Errorf("%q != %q", expected, result)
243 }
244}
245
Jiyong Park25fc6a92018-11-18 18:02:45 +0900246// ensure that 'result' contains 'expected'
247func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900248 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900249 if !strings.Contains(result, expected) {
250 t.Errorf("%q is not found in %q", expected, result)
251 }
252}
253
Liz Kammer5bd365f2020-05-27 15:15:11 -0700254// ensure that 'result' contains 'expected' exactly one time
255func ensureContainsOnce(t *testing.T, result string, expected string) {
256 t.Helper()
257 count := strings.Count(result, expected)
258 if count != 1 {
259 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
260 }
261}
262
Jiyong Park25fc6a92018-11-18 18:02:45 +0900263// ensures that 'result' does not contain 'notExpected'
264func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900265 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900266 if strings.Contains(result, notExpected) {
267 t.Errorf("%q is found in %q", notExpected, result)
268 }
269}
270
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700271func ensureMatches(t *testing.T, result string, expectedRex string) {
272 ok, err := regexp.MatchString(expectedRex, result)
273 if err != nil {
274 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
275 return
276 }
277 if !ok {
278 t.Errorf("%s does not match regular expession %s", result, expectedRex)
279 }
280}
281
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900283 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900284 if !android.InList(expected, result) {
285 t.Errorf("%q is not found in %v", expected, result)
286 }
287}
288
289func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900290 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900291 if android.InList(notExpected, result) {
292 t.Errorf("%q is found in %v", notExpected, result)
293 }
294}
295
Jooyung Hane1633032019-08-01 17:41:43 +0900296func ensureListEmpty(t *testing.T, result []string) {
297 t.Helper()
298 if len(result) > 0 {
299 t.Errorf("%q is expected to be empty", result)
300 }
301}
302
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000303func ensureListNotEmpty(t *testing.T, result []string) {
304 t.Helper()
305 if len(result) == 0 {
306 t.Errorf("%q is expected to be not empty", result)
307 }
308}
309
Jiyong Park25fc6a92018-11-18 18:02:45 +0900310// Minimal test
311func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800312 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900313 apex_defaults {
314 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900315 manifest: ":myapex.manifest",
316 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900318 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900319 native_shared_libs: [
320 "mylib",
321 "libfoo.ffi",
322 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900323 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800324 multilib: {
325 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900326 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800327 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900328 },
Jiyong Park77acec62020-06-01 21:39:15 +0900329 java_libs: [
330 "myjar",
331 "myjar_dex",
332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000333 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 shared_libs: [
361 "mylib2",
362 "libbar.ffi",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 system_shared_libs: [],
365 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000366 // TODO: remove //apex_available:platform
367 apex_available: [
368 "//apex_available:platform",
369 "myapex",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 }
372
Alex Light3d673592019-01-18 14:37:31 -0800373 cc_binary {
374 name: "foo",
375 srcs: ["mylib.cpp"],
376 compile_multilib: "both",
377 multilib: {
378 lib32: {
379 suffix: "32",
380 },
381 lib64: {
382 suffix: "64",
383 },
384 },
385 symlinks: ["foo_link_"],
386 symlink_preferred_arch: true,
387 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800388 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700389 apex_available: [ "myapex", "com.android.gki.*" ],
390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400396 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900405 shared_libs: ["libfoo.shared_from_rust"],
406 }
407
408 cc_library_shared {
409 name: "libfoo.shared_from_rust",
410 srcs: ["mylib.cpp"],
411 system_shared_libs: [],
412 stl: "none",
413 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900414 }
415
416 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000417 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900423 rust_ffi_shared {
424 name: "libfoo.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
430 rust_ffi_shared {
431 name: "libbar.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "bar",
434 apex_available: ["myapex"],
435 }
436
Yifan Hongd22a84a2020-07-28 17:37:46 -0700437 apex {
438 name: "com.android.gki.fake",
439 binaries: ["foo"],
440 key: "myapex.key",
441 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000442 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800443 }
444
Paul Duffindddd5462020-04-07 15:25:44 +0100445 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900446 name: "mylib2",
447 srcs: ["mylib.cpp"],
448 system_shared_libs: [],
449 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900450 static_libs: ["libstatic"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Paul Duffindddd5462020-04-07 15:25:44 +0100458 cc_prebuilt_library_shared {
459 name: "mylib2",
460 srcs: ["prebuilt.so"],
461 // TODO: remove //apex_available:platform
462 apex_available: [
463 "//apex_available:platform",
464 "myapex",
465 ],
466 }
467
Jiyong Park9918e1a2020-03-17 19:16:40 +0900468 cc_library_static {
469 name: "libstatic",
470 srcs: ["mylib.cpp"],
471 system_shared_libs: [],
472 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900478 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479
480 java_library {
481 name: "myjar",
482 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900483 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 sdk_version: "none",
485 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900487 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000488 // TODO: remove //apex_available:platform
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900493 }
494
Jiyong Park77acec62020-06-01 21:39:15 +0900495 dex_import {
496 name: "myjar_dex",
497 jars: ["prebuilt.jar"],
498 apex_available: [
499 "//apex_available:platform",
500 "myapex",
501 ],
502 }
503
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 java_library {
505 name: "myotherjar",
506 srcs: ["foo/bar/MyClass.java"],
507 sdk_version: "none",
508 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900509 // TODO: remove //apex_available:platform
510 apex_available: [
511 "//apex_available:platform",
512 "myapex",
513 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900514 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900515
516 java_library {
517 name: "mysharedjar",
518 srcs: ["foo/bar/MyClass.java"],
519 sdk_version: "none",
520 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900521 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900522 `)
523
Jooyung Hana0503a52023-08-23 13:12:50 +0900524 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900525
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900527 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700528 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900529 var builder strings.Builder
530 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
531
532 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000533 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900534 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
535
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536 optFlags := apexRule.Args["opt_flags"]
537 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700538 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900539 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900540
Jiyong Park25fc6a92018-11-18 18:02:45 +0900541 copyCmds := apexRule.Args["copy_commands"]
542
543 // Ensure that main rule creates an output
544 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
545
546 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700554 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560
561 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900565 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
568 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900569 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900570 // .. but not for java libs
571 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900572 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800573
Colin Cross7113d202019-11-20 16:39:12 -0800574 // Ensure that the platform variant ends with _shared or _common
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
576 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
578 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900579 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
580
581 // Ensure that dynamic dependency to java libs are not included
582 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800583
584 // Ensure that all symlinks are present.
585 found_foo_link_64 := false
586 found_foo := false
587 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900588 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800589 if strings.HasSuffix(cmd, "bin/foo") {
590 found_foo = true
591 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
592 found_foo_link_64 = true
593 }
594 }
595 }
596 good := found_foo && found_foo_link_64
597 if !good {
598 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
599 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900600
Colin Crossf61d03d2023-11-02 16:56:39 -0700601 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
602 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
605 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
606 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100607
Colin Crossf61d03d2023-11-02 16:56:39 -0700608 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
609 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800614}
615
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800617 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 apex_defaults {
619 name: "myapex-defaults",
620 key: "myapex.key",
621 prebuilts: ["myetc"],
622 native_shared_libs: ["mylib"],
623 java_libs: ["myjar"],
624 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900625 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800626 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000627 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900628 }
629
630 prebuilt_etc {
631 name: "myetc",
632 src: "myprebuilt",
633 }
634
635 apex {
636 name: "myapex",
637 defaults: ["myapex-defaults"],
638 }
639
640 apex_key {
641 name: "myapex.key",
642 public_key: "testkey.avbpubkey",
643 private_key: "testkey.pem",
644 }
645
646 cc_library {
647 name: "mylib",
648 system_shared_libs: [],
649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000650 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900651 }
652
653 java_library {
654 name: "myjar",
655 srcs: ["foo/bar/MyClass.java"],
656 sdk_version: "none",
657 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000658 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900659 }
660
661 android_app {
662 name: "AppFoo",
663 srcs: ["foo/bar/MyClass.java"],
664 sdk_version: "none",
665 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000666 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900667 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900668
669 runtime_resource_overlay {
670 name: "rro",
671 theme: "blue",
672 }
673
markchien2f59ec92020-09-02 16:23:38 +0800674 bpf {
675 name: "bpf",
676 srcs: ["bpf.c", "bpf2.c"],
677 }
678
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800680 name: "netdTest",
681 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800682 sub_dir: "netd",
683 }
684
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900686 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 "etc/myetc",
688 "javalib/myjar.jar",
689 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000690 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900691 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800692 "etc/bpf/bpf.o",
693 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800694 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900695 })
696}
697
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800699 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700 apex {
701 name: "myapex",
702 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000703 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900704 }
705
706 apex_key {
707 name: "myapex.key",
708 public_key: "testkey.avbpubkey",
709 private_key: "testkey.pem",
710 }
711 `)
712
Jooyung Hana0503a52023-08-23 13:12:50 +0900713 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900714 args := module.Rule("apexRule").Args
715 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
716 t.Error("manifest should be apex_manifest.pb, but " + manifest)
717 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900718}
719
Liz Kammer4854a7d2021-05-27 14:28:27 -0400720func TestApexManifestMinSdkVersion(t *testing.T) {
721 ctx := testApex(t, `
722 apex_defaults {
723 name: "my_defaults",
724 key: "myapex.key",
725 product_specific: true,
726 file_contexts: ":my-file-contexts",
727 updatable: false,
728 }
729 apex {
730 name: "myapex_30",
731 min_sdk_version: "30",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_current",
737 min_sdk_version: "current",
738 defaults: ["my_defaults"],
739 }
740
741 apex {
742 name: "myapex_none",
743 defaults: ["my_defaults"],
744 }
745
746 apex_key {
747 name: "myapex.key",
748 public_key: "testkey.avbpubkey",
749 private_key: "testkey.pem",
750 }
751
752 filegroup {
753 name: "my-file-contexts",
754 srcs: ["product_specific_file_contexts"],
755 }
756 `, withFiles(map[string][]byte{
757 "product_specific_file_contexts": nil,
758 }), android.FixtureModifyProductVariables(
759 func(variables android.FixtureProductVariables) {
760 variables.Unbundled_build = proptools.BoolPtr(true)
761 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
762 }), android.FixtureMergeEnv(map[string]string{
763 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
764 }))
765
766 testCases := []struct {
767 module string
768 minSdkVersion string
769 }{
770 {
771 module: "myapex_30",
772 minSdkVersion: "30",
773 },
774 {
775 module: "myapex_current",
776 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
777 },
778 {
779 module: "myapex_none",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 }
783 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900784 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400785 args := module.Rule("apexRule").Args
786 optFlags := args["opt_flags"]
787 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
788 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
789 }
790 }
791}
792
Jooyung Hanaf730952023-02-28 14:13:38 +0900793func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900794 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900796 if vendor {
797 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900798 }
799 ctx := testApex(t, `
800 apex {
801 name: "myapex",
802 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900803 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900804 `+prop+`
805 }
806
807 apex_key {
808 name: "myapex.key",
809 public_key: "testkey.avbpubkey",
810 private_key: "testkey.pem",
811 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900813
Jooyung Hana0503a52023-08-23 13:12:50 +0900814 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900815 if vendor {
816 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
817 rule.RuleParams.Command,
818 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900819 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900820 android.AssertStringDoesContain(t, "should force-label as system_file",
821 rule.RuleParams.Command,
822 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900823 }
824 }
825}
826
Jiyong Park25fc6a92018-11-18 18:02:45 +0900827func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800828 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829 apex {
830 name: "myapex",
831 key: "myapex.key",
832 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900833 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000834 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900835 }
836
837 apex_key {
838 name: "myapex.key",
839 public_key: "testkey.avbpubkey",
840 private_key: "testkey.pem",
841 }
842
843 cc_library {
844 name: "mylib",
845 srcs: ["mylib.cpp"],
846 shared_libs: ["mylib2", "mylib3"],
847 system_shared_libs: [],
848 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000849 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
851
852 cc_library {
853 name: "mylib2",
854 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900855 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900856 system_shared_libs: [],
857 stl: "none",
858 stubs: {
859 versions: ["1", "2", "3"],
860 },
861 }
862
863 cc_library {
864 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900865 srcs: ["mylib.cpp"],
866 shared_libs: ["mylib4"],
867 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900868 stl: "none",
869 stubs: {
870 versions: ["10", "11", "12"],
871 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000872 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900874
875 cc_library {
876 name: "mylib4",
877 srcs: ["mylib.cpp"],
878 system_shared_libs: [],
879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000880 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900881 }
Jiyong Park105dc322021-06-11 17:22:09 +0900882
883 rust_binary {
884 name: "foo.rust",
885 srcs: ["foo.rs"],
886 shared_libs: ["libfoo.shared_from_rust"],
887 prefer_rlib: true,
888 apex_available: ["myapex"],
889 }
890
891 cc_library_shared {
892 name: "libfoo.shared_from_rust",
893 srcs: ["mylib.cpp"],
894 system_shared_libs: [],
895 stl: "none",
896 stubs: {
897 versions: ["10", "11", "12"],
898 },
899 }
900
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 `)
902
Jooyung Hana0503a52023-08-23 13:12:50 +0900903 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 copyCmds := apexRule.Args["copy_commands"]
905
906 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
912 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800913 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900914
Colin Crossaede88c2020-08-11 12:17:01 -0700915 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916
917 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900918 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900920 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921
922 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700923 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700925 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900926
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700927 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
928 // is replaced by sharing of "cFlags" in cc/builder.go.
929 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
930 // module variable representing "cflags". So it was not detected by ensureNotContains.
931 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
932 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
933 // including the original cflags's "-include mylib.h".
934 //
Jiyong Park64379952018-12-13 18:37:29 +0900935 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700936 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
937 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900938
Jiyong Park85cc35a2022-07-17 11:30:47 +0900939 // Ensure that genstub for platform-provided lib is invoked with --systemapi
940 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
941 // Ensure that genstub for apex-provided lib is invoked with --apex
942 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900943
Jooyung Hana0503a52023-08-23 13:12:50 +0900944 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900945 "lib64/mylib.so",
946 "lib64/mylib3.so",
947 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900948 "bin/foo.rust",
949 "lib64/libc++.so", // by the implicit dependency from foo.rust
950 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900951 })
Jiyong Park105dc322021-06-11 17:22:09 +0900952
953 // Ensure that stub dependency from a rust module is not included
954 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
955 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700956 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900957 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
958 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900959
Jooyung Hana0503a52023-08-23 13:12:50 +0900960 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900961 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962}
963
Jooyung Han20348752023-12-05 15:23:56 +0900964func TestApexShouldNotEmbedStubVariant(t *testing.T) {
965 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
966 apex {
967 name: "myapex",
968 key: "myapex.key",
969 vendor: true,
970 updatable: false,
971 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 cc_library {
981 name: "libbar",
982 srcs: ["mylib.cpp"],
983 llndk: {
984 symbol_file: "libbar.map.txt",
985 }
986 }
987 `)
988}
989
Jiyong Park1bc84122021-06-22 20:23:05 +0900990func TestApexCanUsePrivateApis(t *testing.T) {
991 ctx := testApex(t, `
992 apex {
993 name: "myapex",
994 key: "myapex.key",
995 native_shared_libs: ["mylib"],
996 binaries: ["foo.rust"],
997 updatable: false,
998 platform_apis: true,
999 }
1000
1001 apex_key {
1002 name: "myapex.key",
1003 public_key: "testkey.avbpubkey",
1004 private_key: "testkey.pem",
1005 }
1006
1007 cc_library {
1008 name: "mylib",
1009 srcs: ["mylib.cpp"],
1010 shared_libs: ["mylib2"],
1011 system_shared_libs: [],
1012 stl: "none",
1013 apex_available: [ "myapex" ],
1014 }
1015
1016 cc_library {
1017 name: "mylib2",
1018 srcs: ["mylib.cpp"],
1019 cflags: ["-include mylib.h"],
1020 system_shared_libs: [],
1021 stl: "none",
1022 stubs: {
1023 versions: ["1", "2", "3"],
1024 },
1025 }
1026
1027 rust_binary {
1028 name: "foo.rust",
1029 srcs: ["foo.rs"],
1030 shared_libs: ["libfoo.shared_from_rust"],
1031 prefer_rlib: true,
1032 apex_available: ["myapex"],
1033 }
1034
1035 cc_library_shared {
1036 name: "libfoo.shared_from_rust",
1037 srcs: ["mylib.cpp"],
1038 system_shared_libs: [],
1039 stl: "none",
1040 stubs: {
1041 versions: ["10", "11", "12"],
1042 },
1043 }
1044 `)
1045
Jooyung Hana0503a52023-08-23 13:12:50 +09001046 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001047 copyCmds := apexRule.Args["copy_commands"]
1048
1049 // Ensure that indirect stubs dep is not included
1050 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1051 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1052
1053 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1054 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001056 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1057 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001058 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001059 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1060 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1061}
1062
Colin Cross7812fd32020-09-25 12:35:10 -07001063func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1064 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001065 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001066 apex {
1067 name: "myapex",
1068 key: "myapex.key",
1069 native_shared_libs: ["mylib", "mylib3"],
1070 min_sdk_version: "29",
1071 }
1072
1073 apex_key {
1074 name: "myapex.key",
1075 public_key: "testkey.avbpubkey",
1076 private_key: "testkey.pem",
1077 }
1078
1079 cc_library {
1080 name: "mylib",
1081 srcs: ["mylib.cpp"],
1082 shared_libs: ["mylib2", "mylib3"],
1083 system_shared_libs: [],
1084 stl: "none",
1085 apex_available: [ "myapex" ],
1086 min_sdk_version: "28",
1087 }
1088
1089 cc_library {
1090 name: "mylib2",
1091 srcs: ["mylib.cpp"],
1092 cflags: ["-include mylib.h"],
1093 system_shared_libs: [],
1094 stl: "none",
1095 stubs: {
1096 versions: ["28", "29", "30", "current"],
1097 },
1098 min_sdk_version: "28",
1099 }
1100
1101 cc_library {
1102 name: "mylib3",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib4"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 stubs: {
1108 versions: ["28", "29", "30", "current"],
1109 },
1110 apex_available: [ "myapex" ],
1111 min_sdk_version: "28",
1112 }
1113
1114 cc_library {
1115 name: "mylib4",
1116 srcs: ["mylib.cpp"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 apex_available: [ "myapex" ],
1120 min_sdk_version: "28",
1121 }
1122 `)
1123
Jooyung Hana0503a52023-08-23 13:12:50 +09001124 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001125 copyCmds := apexRule.Args["copy_commands"]
1126
1127 // Ensure that direct non-stubs dep is always included
1128 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1129
1130 // Ensure that indirect stubs dep is not included
1131 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1132
1133 // Ensure that direct stubs dep is included
1134 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1135
1136 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1137
Jiyong Park55549df2021-02-26 23:57:23 +09001138 // Ensure that mylib is linking with the latest version of stub for mylib2
1139 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001140 // ... and not linking to the non-stub (impl) variant of mylib2
1141 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1142
1143 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1144 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1145 // .. and not linking to the stubs variant of mylib3
1146 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1147
1148 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001149 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001150 ensureNotContains(t, mylib2Cflags, "-include ")
1151
Jiyong Park85cc35a2022-07-17 11:30:47 +09001152 // Ensure that genstub is invoked with --systemapi
1153 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001154
Jooyung Hana0503a52023-08-23 13:12:50 +09001155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001156 "lib64/mylib.so",
1157 "lib64/mylib3.so",
1158 "lib64/mylib4.so",
1159 })
1160}
1161
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001162func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1163 t.Parallel()
1164 // myapex (Z)
1165 // mylib -----------------.
1166 // |
1167 // otherapex (29) |
1168 // libstub's versions: 29 Z current
1169 // |
1170 // <platform> |
1171 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001172 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001173 apex {
1174 name: "myapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["mylib"],
1177 min_sdk_version: "Z", // non-final
1178 }
1179
1180 cc_library {
1181 name: "mylib",
1182 srcs: ["mylib.cpp"],
1183 shared_libs: ["libstub"],
1184 apex_available: ["myapex"],
1185 min_sdk_version: "Z",
1186 }
1187
1188 apex_key {
1189 name: "myapex.key",
1190 public_key: "testkey.avbpubkey",
1191 private_key: "testkey.pem",
1192 }
1193
1194 apex {
1195 name: "otherapex",
1196 key: "myapex.key",
1197 native_shared_libs: ["libstub"],
1198 min_sdk_version: "29",
1199 }
1200
1201 cc_library {
1202 name: "libstub",
1203 srcs: ["mylib.cpp"],
1204 stubs: {
1205 versions: ["29", "Z", "current"],
1206 },
1207 apex_available: ["otherapex"],
1208 min_sdk_version: "29",
1209 }
1210
1211 // platform module depending on libstub from otherapex should use the latest stub("current")
1212 cc_library {
1213 name: "libplatform",
1214 srcs: ["mylib.cpp"],
1215 shared_libs: ["libstub"],
1216 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001217 `,
1218 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1219 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1220 variables.Platform_sdk_final = proptools.BoolPtr(false)
1221 variables.Platform_version_active_codenames = []string{"Z"}
1222 }),
1223 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001224
Jiyong Park55549df2021-02-26 23:57:23 +09001225 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001226 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001227 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001228 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001229 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001230
1231 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1232 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1233 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1234 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1235 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1236}
1237
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001238func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001239 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001240 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001241 name: "myapex2",
1242 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001244 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001248 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001249 public_key: "testkey.avbpubkey",
1250 private_key: "testkey.pem",
1251 }
1252
1253 cc_library {
1254 name: "mylib",
1255 srcs: ["mylib.cpp"],
1256 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001257 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001258 system_shared_libs: [],
1259 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001260 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001261 }
1262
1263 cc_library {
1264 name: "libfoo",
1265 srcs: ["mylib.cpp"],
1266 shared_libs: ["libbar"],
1267 system_shared_libs: [],
1268 stl: "none",
1269 stubs: {
1270 versions: ["10", "20", "30"],
1271 },
1272 }
1273
1274 cc_library {
1275 name: "libbar",
1276 srcs: ["mylib.cpp"],
1277 system_shared_libs: [],
1278 stl: "none",
1279 }
1280
Jiyong Park678c8812020-02-07 17:25:49 +09001281 cc_library_static {
1282 name: "libbaz",
1283 srcs: ["mylib.cpp"],
1284 system_shared_libs: [],
1285 stl: "none",
1286 apex_available: [ "myapex2" ],
1287 }
1288
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001289 `)
1290
Jooyung Hana0503a52023-08-23 13:12:50 +09001291 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001292 copyCmds := apexRule.Args["copy_commands"]
1293
1294 // Ensure that direct non-stubs dep is always included
1295 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1296
1297 // Ensure that indirect stubs dep is not included
1298 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1299
1300 // Ensure that dependency of stubs is not included
1301 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1302
Colin Crossaede88c2020-08-11 12:17:01 -07001303 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304
1305 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001306 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001307 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001308 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309
Jiyong Park3ff16992019-12-27 14:11:47 +09001310 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311
1312 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1313 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001314
Colin Crossf61d03d2023-11-02 16:56:39 -07001315 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1316 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001317 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001318
Colin Crossf61d03d2023-11-02 16:56:39 -07001319 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1320 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001321 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001322}
1323
Jooyung Hand3639552019-08-09 12:57:43 +09001324func TestApexWithRuntimeLibsDependency(t *testing.T) {
1325 /*
1326 myapex
1327 |
1328 v (runtime_libs)
1329 mylib ------+------> libfoo [provides stub]
1330 |
1331 `------> libbar
1332 */
Colin Cross1c460562021-02-16 17:55:47 -08001333 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001334 apex {
1335 name: "myapex",
1336 key: "myapex.key",
1337 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001338 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001339 }
1340
1341 apex_key {
1342 name: "myapex.key",
1343 public_key: "testkey.avbpubkey",
1344 private_key: "testkey.pem",
1345 }
1346
1347 cc_library {
1348 name: "mylib",
1349 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001350 static_libs: ["libstatic"],
1351 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001352 runtime_libs: ["libfoo", "libbar"],
1353 system_shared_libs: [],
1354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001355 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001356 }
1357
1358 cc_library {
1359 name: "libfoo",
1360 srcs: ["mylib.cpp"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 stubs: {
1364 versions: ["10", "20", "30"],
1365 },
1366 }
1367
1368 cc_library {
1369 name: "libbar",
1370 srcs: ["mylib.cpp"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
Liz Kammer5f108fa2023-05-11 14:33:17 -04001376 cc_library {
1377 name: "libstatic",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 apex_available: [ "myapex" ],
1382 runtime_libs: ["libstatic_to_runtime"],
1383 }
1384
1385 cc_library {
1386 name: "libshared",
1387 srcs: ["mylib.cpp"],
1388 system_shared_libs: [],
1389 stl: "none",
1390 apex_available: [ "myapex" ],
1391 runtime_libs: ["libshared_to_runtime"],
1392 }
1393
1394 cc_library {
1395 name: "libstatic_to_runtime",
1396 srcs: ["mylib.cpp"],
1397 system_shared_libs: [],
1398 stl: "none",
1399 apex_available: [ "myapex" ],
1400 }
1401
1402 cc_library {
1403 name: "libshared_to_runtime",
1404 srcs: ["mylib.cpp"],
1405 system_shared_libs: [],
1406 stl: "none",
1407 apex_available: [ "myapex" ],
1408 }
Jooyung Hand3639552019-08-09 12:57:43 +09001409 `)
1410
Jooyung Hana0503a52023-08-23 13:12:50 +09001411 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001412 copyCmds := apexRule.Args["copy_commands"]
1413
1414 // Ensure that direct non-stubs dep is always included
1415 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1416
1417 // Ensure that indirect stubs dep is not included
1418 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1419
1420 // Ensure that runtime_libs dep in included
1421 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001422 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1423 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1424
1425 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001426
Jooyung Hana0503a52023-08-23 13:12:50 +09001427 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001428 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1429 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001430}
1431
Paul Duffina02cae32021-03-09 01:44:06 +00001432var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1433 cc.PrepareForTestWithCcBuildComponents,
1434 PrepareForTestWithApexBuildComponents,
1435 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 apex {
1437 name: "com.android.runtime",
1438 key: "com.android.runtime.key",
1439 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001440 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001441 }
1442
1443 apex_key {
1444 name: "com.android.runtime.key",
1445 public_key: "testkey.avbpubkey",
1446 private_key: "testkey.pem",
1447 }
Paul Duffina02cae32021-03-09 01:44:06 +00001448 `),
1449 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1450)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001451
Paul Duffina02cae32021-03-09 01:44:06 +00001452func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001453 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001454 cc_library {
1455 name: "libc",
1456 no_libcrt: true,
1457 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001458 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459 stl: "none",
1460 system_shared_libs: [],
1461 stubs: { versions: ["1"] },
1462 apex_available: ["com.android.runtime"],
1463
1464 sanitize: {
1465 hwaddress: true,
1466 }
1467 }
1468
1469 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001470 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001471 no_libcrt: true,
1472 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001473 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001474 stl: "none",
1475 system_shared_libs: [],
1476 srcs: [""],
1477 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001478 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479
1480 sanitize: {
1481 never: true,
1482 },
Spandan Das4de7b492023-05-05 21:13:01 +00001483 apex_available: [
1484 "//apex_available:anyapex",
1485 "//apex_available:platform",
1486 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001487 } `)
1488 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001489
Jooyung Hana0503a52023-08-23 13:12:50 +09001490 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 "lib64/bionic/libc.so",
1492 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1493 })
1494
Colin Cross4c4c1be2022-02-10 11:41:18 -08001495 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001496
1497 installed := hwasan.Description("install libclang_rt.hwasan")
1498 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1499
1500 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1501 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1502 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1503}
1504
1505func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001506 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001507 prepareForTestOfRuntimeApexWithHwasan,
1508 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1509 variables.SanitizeDevice = []string{"hwaddress"}
1510 }),
1511 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512 cc_library {
1513 name: "libc",
1514 no_libcrt: true,
1515 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001516 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001517 stl: "none",
1518 system_shared_libs: [],
1519 stubs: { versions: ["1"] },
1520 apex_available: ["com.android.runtime"],
1521 }
1522
1523 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001524 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001525 no_libcrt: true,
1526 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001527 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001528 stl: "none",
1529 system_shared_libs: [],
1530 srcs: [""],
1531 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001532 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001533
1534 sanitize: {
1535 never: true,
1536 },
Spandan Das4de7b492023-05-05 21:13:01 +00001537 apex_available: [
1538 "//apex_available:anyapex",
1539 "//apex_available:platform",
1540 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001541 }
Paul Duffina02cae32021-03-09 01:44:06 +00001542 `)
1543 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544
Jooyung Hana0503a52023-08-23 13:12:50 +09001545 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001546 "lib64/bionic/libc.so",
1547 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1548 })
1549
Colin Cross4c4c1be2022-02-10 11:41:18 -08001550 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001551
1552 installed := hwasan.Description("install libclang_rt.hwasan")
1553 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1554
1555 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1556 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1557 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1558}
1559
Jooyung Han61b66e92020-03-21 14:21:46 +00001560func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1561 testcases := []struct {
1562 name string
1563 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001564 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 shouldLink string
1566 shouldNotLink []string
1567 }{
1568 {
Jiyong Park55549df2021-02-26 23:57:23 +09001569 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001570 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001571 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001572 shouldLink: "current",
1573 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 },
1575 {
Jiyong Park55549df2021-02-26 23:57:23 +09001576 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001577 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001578 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001579 shouldLink: "current",
1580 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 },
1582 }
1583 for _, tc := range testcases {
1584 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001585 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001586 apex {
1587 name: "myapex",
1588 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001589 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001590 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001591 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001592 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001593
Jooyung Han61b66e92020-03-21 14:21:46 +00001594 apex_key {
1595 name: "myapex.key",
1596 public_key: "testkey.avbpubkey",
1597 private_key: "testkey.pem",
1598 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 cc_library {
1601 name: "mylib",
1602 srcs: ["mylib.cpp"],
1603 vendor_available: true,
1604 shared_libs: ["libbar"],
1605 system_shared_libs: [],
1606 stl: "none",
1607 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001608 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Jooyung Han61b66e92020-03-21 14:21:46 +00001611 cc_library {
1612 name: "libbar",
1613 srcs: ["mylib.cpp"],
1614 system_shared_libs: [],
1615 stl: "none",
1616 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001617 llndk: {
1618 symbol_file: "libbar.map.txt",
1619 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001620 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001621 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001622 withUnbundledBuild,
1623 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001624
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001626 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001627 "lib64/mylib.so",
1628 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001629
Jooyung Han61b66e92020-03-21 14:21:46 +00001630 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001631 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001632 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1633 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001634
Steven Moreland2c4000c2021-04-27 02:08:49 +00001635 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1636 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001637 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001638 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001639 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001640
Steven Moreland2c4000c2021-04-27 02:08:49 +00001641 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ver := tc.shouldLink
1643 if tc.shouldLink == "current" {
1644 ver = strconv.Itoa(android.FutureApiLevelInt)
1645 }
1646 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001647 })
1648 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001649}
1650
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001652 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001653 apex {
1654 name: "myapex",
1655 key: "myapex.key",
1656 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001657 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001658 }
1659
1660 apex_key {
1661 name: "myapex.key",
1662 public_key: "testkey.avbpubkey",
1663 private_key: "testkey.pem",
1664 }
1665
1666 cc_library {
1667 name: "mylib",
1668 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001669 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 shared_libs: ["libdl#27"],
1671 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001672 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001673 }
1674
1675 cc_library_shared {
1676 name: "mylib_shared",
1677 srcs: ["mylib.cpp"],
1678 shared_libs: ["libdl#27"],
1679 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001680 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 }
1682
1683 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001684 name: "libBootstrap",
1685 srcs: ["mylib.cpp"],
1686 stl: "none",
1687 bootstrap: true,
1688 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 `)
1690
Jooyung Hana0503a52023-08-23 13:12:50 +09001691 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001692 copyCmds := apexRule.Args["copy_commands"]
1693
1694 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001695 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001696 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1697 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698
1699 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001700 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701
Colin Crossaede88c2020-08-11 12:17:01 -07001702 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1703 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1704 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001705
1706 // For dependency to libc
1707 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001708 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001709 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001710 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001711 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001712 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1713 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001714
1715 // For dependency to libm
1716 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001717 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001718 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001719 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001720 // ... and is not compiling with the stub
1721 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1722 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1723
1724 // For dependency to libdl
1725 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001726 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001727 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001728 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1729 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001730 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001731 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001732 // ... Cflags from stub is correctly exported to mylib
1733 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1734 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001735
1736 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001737 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1738 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1739 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1740 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001742
Jooyung Han749dc692020-04-15 11:03:39 +09001743func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001744 // there are three links between liba --> libz.
1745 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001746 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001747 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001748 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001749 apex {
1750 name: "myapex",
1751 key: "myapex.key",
1752 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001753 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 apex {
1757 name: "otherapex",
1758 key: "myapex.key",
1759 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001760 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001761 }
1762
1763 apex_key {
1764 name: "myapex.key",
1765 public_key: "testkey.avbpubkey",
1766 private_key: "testkey.pem",
1767 }
1768
1769 cc_library {
1770 name: "libx",
1771 shared_libs: ["liba"],
1772 system_shared_libs: [],
1773 stl: "none",
1774 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001775 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001776 }
1777
1778 cc_library {
1779 name: "liby",
1780 shared_libs: ["liba"],
1781 system_shared_libs: [],
1782 stl: "none",
1783 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001784 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001785 }
1786
1787 cc_library {
1788 name: "liba",
1789 shared_libs: ["libz"],
1790 system_shared_libs: [],
1791 stl: "none",
1792 apex_available: [
1793 "//apex_available:anyapex",
1794 "//apex_available:platform",
1795 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001796 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001797 }
1798
1799 cc_library {
1800 name: "libz",
1801 system_shared_libs: [],
1802 stl: "none",
1803 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001804 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001805 },
1806 }
Jooyung Han749dc692020-04-15 11:03:39 +09001807 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001808
1809 expectLink := func(from, from_variant, to, to_variant string) {
1810 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1811 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1812 }
1813 expectNoLink := func(from, from_variant, to, to_variant string) {
1814 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1815 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1816 }
1817 // platform liba is linked to non-stub version
1818 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001819 // liba in myapex is linked to current
1820 expectLink("liba", "shared_apex29", "libz", "shared_current")
1821 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001822 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001823 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001824 // liba in otherapex is linked to current
1825 expectLink("liba", "shared_apex30", "libz", "shared_current")
1826 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001827 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1828 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001829}
1830
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001832 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001833 apex {
1834 name: "myapex",
1835 key: "myapex.key",
1836 native_shared_libs: ["libx"],
1837 min_sdk_version: "R",
1838 }
1839
1840 apex_key {
1841 name: "myapex.key",
1842 public_key: "testkey.avbpubkey",
1843 private_key: "testkey.pem",
1844 }
1845
1846 cc_library {
1847 name: "libx",
1848 shared_libs: ["libz"],
1849 system_shared_libs: [],
1850 stl: "none",
1851 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001852 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001853 }
1854
1855 cc_library {
1856 name: "libz",
1857 system_shared_libs: [],
1858 stl: "none",
1859 stubs: {
1860 versions: ["29", "R"],
1861 },
1862 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001863 `,
1864 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1865 variables.Platform_version_active_codenames = []string{"R"}
1866 }),
1867 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001868
1869 expectLink := func(from, from_variant, to, to_variant string) {
1870 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1871 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1872 }
1873 expectNoLink := func(from, from_variant, to, to_variant string) {
1874 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1875 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1876 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001877 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1878 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001879 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1880 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001881}
1882
Jooyung Han4c4da062021-06-23 10:23:16 +09001883func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1884 testApex(t, `
1885 apex {
1886 name: "myapex",
1887 key: "myapex.key",
1888 java_libs: ["libx"],
1889 min_sdk_version: "S",
1890 }
1891
1892 apex_key {
1893 name: "myapex.key",
1894 public_key: "testkey.avbpubkey",
1895 private_key: "testkey.pem",
1896 }
1897
1898 java_library {
1899 name: "libx",
1900 srcs: ["a.java"],
1901 apex_available: [ "myapex" ],
1902 sdk_version: "current",
1903 min_sdk_version: "S", // should be okay
1904 }
1905 `,
1906 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1907 variables.Platform_version_active_codenames = []string{"S"}
1908 variables.Platform_sdk_codename = proptools.StringPtr("S")
1909 }),
1910 )
1911}
1912
Jooyung Han749dc692020-04-15 11:03:39 +09001913func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001914 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001915 apex {
1916 name: "myapex",
1917 key: "myapex.key",
1918 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001919 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001920 }
1921
1922 apex_key {
1923 name: "myapex.key",
1924 public_key: "testkey.avbpubkey",
1925 private_key: "testkey.pem",
1926 }
1927
1928 cc_library {
1929 name: "libx",
1930 shared_libs: ["libz"],
1931 system_shared_libs: [],
1932 stl: "none",
1933 apex_available: [ "myapex" ],
1934 }
1935
1936 cc_library {
1937 name: "libz",
1938 system_shared_libs: [],
1939 stl: "none",
1940 stubs: {
1941 versions: ["1", "2"],
1942 },
1943 }
1944 `)
1945
1946 expectLink := func(from, from_variant, to, to_variant string) {
1947 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1948 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1949 }
1950 expectNoLink := func(from, from_variant, to, to_variant string) {
1951 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1952 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1953 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001954 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001955 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001956 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001957 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001958}
1959
Jooyung Handfc864c2023-03-20 18:19:07 +09001960func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001961 ctx := testApex(t, `
1962 apex {
1963 name: "myapex",
1964 key: "myapex.key",
1965 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001966 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001967 vendor: true,
1968 min_sdk_version: "29",
1969 }
1970
1971 apex_key {
1972 name: "myapex.key",
1973 public_key: "testkey.avbpubkey",
1974 private_key: "testkey.pem",
1975 }
1976
1977 cc_library {
1978 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001979 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001980 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001981 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001982 shared_libs: ["libbar"],
1983 }
1984
1985 cc_library {
1986 name: "libbar",
1987 stubs: { versions: ["29", "30"] },
1988 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001989 }
1990 `)
1991
1992 vendorVariant := "android_vendor.29_arm64_armv8-a"
1993
Jooyung Handfc864c2023-03-20 18:19:07 +09001994 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1995
1996 // Ensure that mylib links with "current" LLNDK
1997 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1998 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1999
2000 // Ensure that mylib is targeting 29
2001 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2002 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2003
2004 // Ensure that the correct variant of crtbegin_so is used.
2005 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2006 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002007
2008 // Ensure that the crtbegin_so used by the APEX is targeting 29
2009 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2010 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2011}
2012
Jooyung Han4495f842023-04-25 16:39:59 +09002013func TestTrackAllowedDeps(t *testing.T) {
2014 ctx := testApex(t, `
2015 apex {
2016 name: "myapex",
2017 key: "myapex.key",
2018 updatable: true,
2019 native_shared_libs: [
2020 "mylib",
2021 "yourlib",
2022 ],
2023 min_sdk_version: "29",
2024 }
2025
2026 apex {
2027 name: "myapex2",
2028 key: "myapex.key",
2029 updatable: false,
2030 native_shared_libs: ["yourlib"],
2031 }
2032
2033 apex_key {
2034 name: "myapex.key",
2035 public_key: "testkey.avbpubkey",
2036 private_key: "testkey.pem",
2037 }
2038
2039 cc_library {
2040 name: "mylib",
2041 srcs: ["mylib.cpp"],
2042 shared_libs: ["libbar"],
2043 min_sdk_version: "29",
2044 apex_available: ["myapex"],
2045 }
2046
2047 cc_library {
2048 name: "libbar",
2049 stubs: { versions: ["29", "30"] },
2050 }
2051
2052 cc_library {
2053 name: "yourlib",
2054 srcs: ["mylib.cpp"],
2055 min_sdk_version: "29",
2056 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2057 }
2058 `, withFiles(android.MockFS{
2059 "packages/modules/common/build/allowed_deps.txt": nil,
2060 }))
2061
2062 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2063 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2064 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002065 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002066 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002067 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002068
Jooyung Hana0503a52023-08-23 13:12:50 +09002069 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002070 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2071 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002072 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2073 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2074 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2075 flatlist, "mylib:(minSdkVersion:29)")
2076 android.AssertStringListContains(t, "track platform-available lib",
2077 flatlist, "yourlib(minSdkVersion:29)")
2078}
2079
2080func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2081 ctx := testApex(t, `
2082 apex {
2083 name: "myapex",
2084 key: "myapex.key",
2085 updatable: true,
2086 min_sdk_version: "29",
2087 }
2088
2089 apex_key {
2090 name: "myapex.key",
2091 public_key: "testkey.avbpubkey",
2092 private_key: "testkey.pem",
2093 }
2094 `)
2095 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2096 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2097 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2098 }
2099}
2100
Jooyung Han03b51852020-02-26 22:45:42 +09002101func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002102 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002103 apex {
2104 name: "myapex",
2105 key: "myapex.key",
2106 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002107 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002108 }
2109
2110 apex_key {
2111 name: "myapex.key",
2112 public_key: "testkey.avbpubkey",
2113 private_key: "testkey.pem",
2114 }
2115
2116 cc_library {
2117 name: "libx",
2118 system_shared_libs: [],
2119 stl: "none",
2120 apex_available: [ "myapex" ],
2121 stubs: {
2122 versions: ["1", "2"],
2123 },
2124 }
2125
2126 cc_library {
2127 name: "libz",
2128 shared_libs: ["libx"],
2129 system_shared_libs: [],
2130 stl: "none",
2131 }
2132 `)
2133
2134 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002135 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002136 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2137 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2138 }
2139 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002140 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002141 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2142 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2143 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002144 expectLink("libz", "shared", "libx", "shared_current")
2145 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002146 expectNoLink("libz", "shared", "libz", "shared_1")
2147 expectNoLink("libz", "shared", "libz", "shared")
2148}
2149
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002150var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2151 func(variables android.FixtureProductVariables) {
2152 variables.SanitizeDevice = []string{"hwaddress"}
2153 },
2154)
2155
Jooyung Han75568392020-03-20 04:29:24 +09002156func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002157 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002158 apex {
2159 name: "myapex",
2160 key: "myapex.key",
2161 native_shared_libs: ["libx"],
2162 min_sdk_version: "29",
2163 }
2164
2165 apex_key {
2166 name: "myapex.key",
2167 public_key: "testkey.avbpubkey",
2168 private_key: "testkey.pem",
2169 }
2170
2171 cc_library {
2172 name: "libx",
2173 shared_libs: ["libbar"],
2174 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002175 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002176 }
2177
2178 cc_library {
2179 name: "libbar",
2180 stubs: {
2181 versions: ["29", "30"],
2182 },
2183 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002184 `,
2185 prepareForTestWithSantitizeHwaddress,
2186 )
Jooyung Han03b51852020-02-26 22:45:42 +09002187 expectLink := func(from, from_variant, to, to_variant string) {
2188 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2189 libFlags := ld.Args["libFlags"]
2190 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2191 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002192 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002193}
2194
Jooyung Han75568392020-03-20 04:29:24 +09002195func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002196 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002197 apex {
2198 name: "myapex",
2199 key: "myapex.key",
2200 native_shared_libs: ["libx"],
2201 min_sdk_version: "29",
2202 }
2203
2204 apex_key {
2205 name: "myapex.key",
2206 public_key: "testkey.avbpubkey",
2207 private_key: "testkey.pem",
2208 }
2209
2210 cc_library {
2211 name: "libx",
2212 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002213 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002214 }
Jooyung Han75568392020-03-20 04:29:24 +09002215 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002216
2217 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002218 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002219 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002220 // note that platform variant is not.
2221 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002222 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002223}
2224
Jooyung Han749dc692020-04-15 11:03:39 +09002225func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2226 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002227 apex {
2228 name: "myapex",
2229 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002230 native_shared_libs: ["mylib"],
2231 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002232 }
2233
2234 apex_key {
2235 name: "myapex.key",
2236 public_key: "testkey.avbpubkey",
2237 private_key: "testkey.pem",
2238 }
Jooyung Han749dc692020-04-15 11:03:39 +09002239
2240 cc_library {
2241 name: "mylib",
2242 srcs: ["mylib.cpp"],
2243 system_shared_libs: [],
2244 stl: "none",
2245 apex_available: [
2246 "myapex",
2247 ],
2248 min_sdk_version: "30",
2249 }
2250 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002251
2252 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2253 apex {
2254 name: "myapex",
2255 key: "myapex.key",
2256 native_shared_libs: ["libfoo.ffi"],
2257 min_sdk_version: "29",
2258 }
2259
2260 apex_key {
2261 name: "myapex.key",
2262 public_key: "testkey.avbpubkey",
2263 private_key: "testkey.pem",
2264 }
2265
2266 rust_ffi_shared {
2267 name: "libfoo.ffi",
2268 srcs: ["foo.rs"],
2269 crate_name: "foo",
2270 apex_available: [
2271 "myapex",
2272 ],
2273 min_sdk_version: "30",
2274 }
2275 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002276
2277 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2278 apex {
2279 name: "myapex",
2280 key: "myapex.key",
2281 java_libs: ["libfoo"],
2282 min_sdk_version: "29",
2283 }
2284
2285 apex_key {
2286 name: "myapex.key",
2287 public_key: "testkey.avbpubkey",
2288 private_key: "testkey.pem",
2289 }
2290
2291 java_import {
2292 name: "libfoo",
2293 jars: ["libfoo.jar"],
2294 apex_available: [
2295 "myapex",
2296 ],
2297 min_sdk_version: "30",
2298 }
2299 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002300
2301 // Skip check for modules compiling against core API surface
2302 testApex(t, `
2303 apex {
2304 name: "myapex",
2305 key: "myapex.key",
2306 java_libs: ["libfoo"],
2307 min_sdk_version: "29",
2308 }
2309
2310 apex_key {
2311 name: "myapex.key",
2312 public_key: "testkey.avbpubkey",
2313 private_key: "testkey.pem",
2314 }
2315
2316 java_library {
2317 name: "libfoo",
2318 srcs: ["Foo.java"],
2319 apex_available: [
2320 "myapex",
2321 ],
2322 // Compile against core API surface
2323 sdk_version: "core_current",
2324 min_sdk_version: "30",
2325 }
2326 `)
2327
Jooyung Han749dc692020-04-15 11:03:39 +09002328}
2329
2330func TestApexMinSdkVersion_Okay(t *testing.T) {
2331 testApex(t, `
2332 apex {
2333 name: "myapex",
2334 key: "myapex.key",
2335 native_shared_libs: ["libfoo"],
2336 java_libs: ["libbar"],
2337 min_sdk_version: "29",
2338 }
2339
2340 apex_key {
2341 name: "myapex.key",
2342 public_key: "testkey.avbpubkey",
2343 private_key: "testkey.pem",
2344 }
2345
2346 cc_library {
2347 name: "libfoo",
2348 srcs: ["mylib.cpp"],
2349 shared_libs: ["libfoo_dep"],
2350 apex_available: ["myapex"],
2351 min_sdk_version: "29",
2352 }
2353
2354 cc_library {
2355 name: "libfoo_dep",
2356 srcs: ["mylib.cpp"],
2357 apex_available: ["myapex"],
2358 min_sdk_version: "29",
2359 }
2360
2361 java_library {
2362 name: "libbar",
2363 sdk_version: "current",
2364 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002365 static_libs: [
2366 "libbar_dep",
2367 "libbar_import_dep",
2368 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002369 apex_available: ["myapex"],
2370 min_sdk_version: "29",
2371 }
2372
2373 java_library {
2374 name: "libbar_dep",
2375 sdk_version: "current",
2376 srcs: ["a.java"],
2377 apex_available: ["myapex"],
2378 min_sdk_version: "29",
2379 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002380
2381 java_import {
2382 name: "libbar_import_dep",
2383 jars: ["libbar.jar"],
2384 apex_available: ["myapex"],
2385 min_sdk_version: "29",
2386 }
Jooyung Han03b51852020-02-26 22:45:42 +09002387 `)
2388}
2389
Colin Cross8ca61c12022-10-06 21:00:14 -07002390func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2391 // Tests that an apex dependency with min_sdk_version higher than the
2392 // min_sdk_version of the apex is allowed as long as the dependency's
2393 // min_sdk_version is less than or equal to the api level that the
2394 // architecture was introduced in. In this case, arm64 didn't exist
2395 // until api level 21, so the arm64 code will never need to run on
2396 // an api level 20 device, even if other architectures of the apex
2397 // will.
2398 testApex(t, `
2399 apex {
2400 name: "myapex",
2401 key: "myapex.key",
2402 native_shared_libs: ["libfoo"],
2403 min_sdk_version: "20",
2404 }
2405
2406 apex_key {
2407 name: "myapex.key",
2408 public_key: "testkey.avbpubkey",
2409 private_key: "testkey.pem",
2410 }
2411
2412 cc_library {
2413 name: "libfoo",
2414 srcs: ["mylib.cpp"],
2415 apex_available: ["myapex"],
2416 min_sdk_version: "21",
2417 stl: "none",
2418 }
2419 `)
2420}
2421
Artur Satayev8cf899a2020-04-15 17:29:42 +01002422func TestJavaStableSdkVersion(t *testing.T) {
2423 testCases := []struct {
2424 name string
2425 expectedError string
2426 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002427 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002428 }{
2429 {
2430 name: "Non-updatable apex with non-stable dep",
2431 bp: `
2432 apex {
2433 name: "myapex",
2434 java_libs: ["myjar"],
2435 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002436 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002437 }
2438 apex_key {
2439 name: "myapex.key",
2440 public_key: "testkey.avbpubkey",
2441 private_key: "testkey.pem",
2442 }
2443 java_library {
2444 name: "myjar",
2445 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002446 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002447 apex_available: ["myapex"],
2448 }
2449 `,
2450 },
2451 {
2452 name: "Updatable apex with stable dep",
2453 bp: `
2454 apex {
2455 name: "myapex",
2456 java_libs: ["myjar"],
2457 key: "myapex.key",
2458 updatable: true,
2459 min_sdk_version: "29",
2460 }
2461 apex_key {
2462 name: "myapex.key",
2463 public_key: "testkey.avbpubkey",
2464 private_key: "testkey.pem",
2465 }
2466 java_library {
2467 name: "myjar",
2468 srcs: ["foo/bar/MyClass.java"],
2469 sdk_version: "current",
2470 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002471 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002472 }
2473 `,
2474 },
2475 {
2476 name: "Updatable apex with non-stable dep",
2477 expectedError: "cannot depend on \"myjar\"",
2478 bp: `
2479 apex {
2480 name: "myapex",
2481 java_libs: ["myjar"],
2482 key: "myapex.key",
2483 updatable: true,
2484 }
2485 apex_key {
2486 name: "myapex.key",
2487 public_key: "testkey.avbpubkey",
2488 private_key: "testkey.pem",
2489 }
2490 java_library {
2491 name: "myjar",
2492 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002493 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002494 apex_available: ["myapex"],
2495 }
2496 `,
2497 },
2498 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002499 name: "Updatable apex with non-stable legacy core platform dep",
2500 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2501 bp: `
2502 apex {
2503 name: "myapex",
2504 java_libs: ["myjar-uses-legacy"],
2505 key: "myapex.key",
2506 updatable: true,
2507 }
2508 apex_key {
2509 name: "myapex.key",
2510 public_key: "testkey.avbpubkey",
2511 private_key: "testkey.pem",
2512 }
2513 java_library {
2514 name: "myjar-uses-legacy",
2515 srcs: ["foo/bar/MyClass.java"],
2516 sdk_version: "core_platform",
2517 apex_available: ["myapex"],
2518 }
2519 `,
2520 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2521 },
2522 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002523 name: "Updatable apex with non-stable transitive dep",
2524 // This is not actually detecting that the transitive dependency is unstable, rather it is
2525 // detecting that the transitive dependency is building against a wider API surface than the
2526 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002527 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002528 bp: `
2529 apex {
2530 name: "myapex",
2531 java_libs: ["myjar"],
2532 key: "myapex.key",
2533 updatable: true,
2534 }
2535 apex_key {
2536 name: "myapex.key",
2537 public_key: "testkey.avbpubkey",
2538 private_key: "testkey.pem",
2539 }
2540 java_library {
2541 name: "myjar",
2542 srcs: ["foo/bar/MyClass.java"],
2543 sdk_version: "current",
2544 apex_available: ["myapex"],
2545 static_libs: ["transitive-jar"],
2546 }
2547 java_library {
2548 name: "transitive-jar",
2549 srcs: ["foo/bar/MyClass.java"],
2550 sdk_version: "core_platform",
2551 apex_available: ["myapex"],
2552 }
2553 `,
2554 },
2555 }
2556
2557 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002558 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2559 continue
2560 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002561 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002562 errorHandler := android.FixtureExpectsNoErrors
2563 if test.expectedError != "" {
2564 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002565 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002566 android.GroupFixturePreparers(
2567 java.PrepareForTestWithJavaDefaultModules,
2568 PrepareForTestWithApexBuildComponents,
2569 prepareForTestWithMyapex,
2570 android.OptionalFixturePreparer(test.preparer),
2571 ).
2572 ExtendWithErrorHandler(errorHandler).
2573 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002574 })
2575 }
2576}
2577
Jooyung Han749dc692020-04-15 11:03:39 +09002578func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2579 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2580 apex {
2581 name: "myapex",
2582 key: "myapex.key",
2583 native_shared_libs: ["mylib"],
2584 min_sdk_version: "29",
2585 }
2586
2587 apex_key {
2588 name: "myapex.key",
2589 public_key: "testkey.avbpubkey",
2590 private_key: "testkey.pem",
2591 }
2592
2593 cc_library {
2594 name: "mylib",
2595 srcs: ["mylib.cpp"],
2596 shared_libs: ["mylib2"],
2597 system_shared_libs: [],
2598 stl: "none",
2599 apex_available: [
2600 "myapex",
2601 ],
2602 min_sdk_version: "29",
2603 }
2604
2605 // indirect part of the apex
2606 cc_library {
2607 name: "mylib2",
2608 srcs: ["mylib.cpp"],
2609 system_shared_libs: [],
2610 stl: "none",
2611 apex_available: [
2612 "myapex",
2613 ],
2614 min_sdk_version: "30",
2615 }
2616 `)
2617}
2618
2619func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2620 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2621 apex {
2622 name: "myapex",
2623 key: "myapex.key",
2624 apps: ["AppFoo"],
2625 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002626 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002627 }
2628
2629 apex_key {
2630 name: "myapex.key",
2631 public_key: "testkey.avbpubkey",
2632 private_key: "testkey.pem",
2633 }
2634
2635 android_app {
2636 name: "AppFoo",
2637 srcs: ["foo/bar/MyClass.java"],
2638 sdk_version: "current",
2639 min_sdk_version: "29",
2640 system_modules: "none",
2641 stl: "none",
2642 static_libs: ["bar"],
2643 apex_available: [ "myapex" ],
2644 }
2645
2646 java_library {
2647 name: "bar",
2648 sdk_version: "current",
2649 srcs: ["a.java"],
2650 apex_available: [ "myapex" ],
2651 }
2652 `)
2653}
2654
2655func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002656 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002657 apex {
2658 name: "myapex",
2659 key: "myapex.key",
2660 native_shared_libs: ["mylib"],
2661 min_sdk_version: "29",
2662 }
2663
2664 apex_key {
2665 name: "myapex.key",
2666 public_key: "testkey.avbpubkey",
2667 private_key: "testkey.pem",
2668 }
2669
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002670 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002671 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2672 cc_library {
2673 name: "mylib",
2674 srcs: ["mylib.cpp"],
2675 shared_libs: ["mylib2"],
2676 system_shared_libs: [],
2677 stl: "none",
2678 apex_available: ["myapex", "otherapex"],
2679 min_sdk_version: "29",
2680 }
2681
2682 cc_library {
2683 name: "mylib2",
2684 srcs: ["mylib.cpp"],
2685 system_shared_libs: [],
2686 stl: "none",
2687 apex_available: ["otherapex"],
2688 stubs: { versions: ["29", "30"] },
2689 min_sdk_version: "30",
2690 }
2691
2692 apex {
2693 name: "otherapex",
2694 key: "myapex.key",
2695 native_shared_libs: ["mylib", "mylib2"],
2696 min_sdk_version: "30",
2697 }
2698 `)
2699 expectLink := func(from, from_variant, to, to_variant string) {
2700 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2701 libFlags := ld.Args["libFlags"]
2702 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2703 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002704 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002705 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002706}
2707
Jooyung Haned124c32021-01-26 11:43:46 +09002708func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002709 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2710 func(variables android.FixtureProductVariables) {
2711 variables.Platform_sdk_codename = proptools.StringPtr("S")
2712 variables.Platform_version_active_codenames = []string{"S"}
2713 },
2714 )
Jooyung Haned124c32021-01-26 11:43:46 +09002715 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2716 apex {
2717 name: "myapex",
2718 key: "myapex.key",
2719 native_shared_libs: ["libfoo"],
2720 min_sdk_version: "S",
2721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 cc_library {
2728 name: "libfoo",
2729 shared_libs: ["libbar"],
2730 apex_available: ["myapex"],
2731 min_sdk_version: "29",
2732 }
2733 cc_library {
2734 name: "libbar",
2735 apex_available: ["myapex"],
2736 }
2737 `, withSAsActiveCodeNames)
2738}
2739
2740func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002741 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2742 variables.Platform_sdk_codename = proptools.StringPtr("S")
2743 variables.Platform_version_active_codenames = []string{"S", "T"}
2744 })
Colin Cross1c460562021-02-16 17:55:47 -08002745 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002746 apex {
2747 name: "myapex",
2748 key: "myapex.key",
2749 native_shared_libs: ["libfoo"],
2750 min_sdk_version: "S",
2751 }
2752 apex_key {
2753 name: "myapex.key",
2754 public_key: "testkey.avbpubkey",
2755 private_key: "testkey.pem",
2756 }
2757 cc_library {
2758 name: "libfoo",
2759 shared_libs: ["libbar"],
2760 apex_available: ["myapex"],
2761 min_sdk_version: "S",
2762 }
2763 cc_library {
2764 name: "libbar",
2765 stubs: {
2766 symbol_file: "libbar.map.txt",
2767 versions: ["30", "S", "T"],
2768 },
2769 }
2770 `, withSAsActiveCodeNames)
2771
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002772 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002773 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2774 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002775 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002776}
2777
Jiyong Park7c2ee712018-12-07 00:42:25 +09002778func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002779 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002780 apex {
2781 name: "myapex",
2782 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002783 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002784 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002785 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002786 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002787 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 }
2789
2790 apex_key {
2791 name: "myapex.key",
2792 public_key: "testkey.avbpubkey",
2793 private_key: "testkey.pem",
2794 }
2795
2796 prebuilt_etc {
2797 name: "myetc",
2798 src: "myprebuilt",
2799 sub_dir: "foo/bar",
2800 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002801
2802 cc_library {
2803 name: "mylib",
2804 srcs: ["mylib.cpp"],
2805 relative_install_path: "foo/bar",
2806 system_shared_libs: [],
2807 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002808 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002809 }
2810
2811 cc_binary {
2812 name: "mybin",
2813 srcs: ["mylib.cpp"],
2814 relative_install_path: "foo/bar",
2815 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002816 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002817 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002818 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002819
2820 rust_binary {
2821 name: "mybin.rust",
2822 srcs: ["foo.rs"],
2823 relative_install_path: "rust_subdir",
2824 apex_available: [ "myapex" ],
2825 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002826 `)
2827
Jooyung Hana0503a52023-08-23 13:12:50 +09002828 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002829 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002830
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002831 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002832 ensureContains(t, cmd, "/etc ")
2833 ensureContains(t, cmd, "/etc/foo ")
2834 ensureContains(t, cmd, "/etc/foo/bar ")
2835 ensureContains(t, cmd, "/lib64 ")
2836 ensureContains(t, cmd, "/lib64/foo ")
2837 ensureContains(t, cmd, "/lib64/foo/bar ")
2838 ensureContains(t, cmd, "/lib ")
2839 ensureContains(t, cmd, "/lib/foo ")
2840 ensureContains(t, cmd, "/lib/foo/bar ")
2841 ensureContains(t, cmd, "/bin ")
2842 ensureContains(t, cmd, "/bin/foo ")
2843 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002844 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002845}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002846
Jooyung Han35155c42020-02-06 17:33:20 +09002847func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002848 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002849 apex {
2850 name: "myapex",
2851 key: "myapex.key",
2852 multilib: {
2853 both: {
2854 native_shared_libs: ["mylib"],
2855 binaries: ["mybin"],
2856 },
2857 },
2858 compile_multilib: "both",
2859 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002860 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002861 }
2862
2863 apex_key {
2864 name: "myapex.key",
2865 public_key: "testkey.avbpubkey",
2866 private_key: "testkey.pem",
2867 }
2868
2869 cc_library {
2870 name: "mylib",
2871 relative_install_path: "foo/bar",
2872 system_shared_libs: [],
2873 stl: "none",
2874 apex_available: [ "myapex" ],
2875 native_bridge_supported: true,
2876 }
2877
2878 cc_binary {
2879 name: "mybin",
2880 relative_install_path: "foo/bar",
2881 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002882 stl: "none",
2883 apex_available: [ "myapex" ],
2884 native_bridge_supported: true,
2885 compile_multilib: "both", // default is "first" for binary
2886 multilib: {
2887 lib64: {
2888 suffix: "64",
2889 },
2890 },
2891 }
2892 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002893 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002894 "bin/foo/bar/mybin",
2895 "bin/foo/bar/mybin64",
2896 "bin/arm/foo/bar/mybin",
2897 "bin/arm64/foo/bar/mybin64",
2898 "lib/foo/bar/mylib.so",
2899 "lib/arm/foo/bar/mylib.so",
2900 "lib64/foo/bar/mylib.so",
2901 "lib64/arm64/foo/bar/mylib.so",
2902 })
2903}
2904
Jooyung Han85d61762020-06-24 23:50:26 +09002905func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002906 result := android.GroupFixturePreparers(
2907 prepareForApexTest,
2908 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2909 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002910 apex {
2911 name: "myapex",
2912 key: "myapex.key",
2913 binaries: ["mybin"],
2914 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002915 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002916 }
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922 cc_binary {
2923 name: "mybin",
2924 vendor: true,
2925 shared_libs: ["libfoo"],
2926 }
2927 cc_library {
2928 name: "libfoo",
2929 proprietary: true,
2930 }
2931 `)
2932
Jooyung Hana0503a52023-08-23 13:12:50 +09002933 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002934 "bin/mybin",
2935 "lib64/libfoo.so",
2936 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2937 "lib64/libc++.so",
2938 })
2939
Jooyung Hana0503a52023-08-23 13:12:50 +09002940 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002941 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002942 name := apexBundle.BaseModuleName()
2943 prefix := "TARGET_"
2944 var builder strings.Builder
2945 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002946 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002947 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002948 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002949
Jooyung Hana0503a52023-08-23 13:12:50 +09002950 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002951 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2952 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002953}
2954
Jooyung Hanc5a96762022-02-04 11:54:50 +09002955func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2956 testApexError(t, `Trying to include a VNDK library`, `
2957 apex {
2958 name: "myapex",
2959 key: "myapex.key",
2960 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2961 vendor: true,
2962 use_vndk_as_stable: true,
2963 updatable: false,
2964 }
2965 apex_key {
2966 name: "myapex.key",
2967 public_key: "testkey.avbpubkey",
2968 private_key: "testkey.pem",
2969 }`)
2970}
2971
Jooyung Handf78e212020-07-22 15:54:47 +09002972func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002973 // myapex myapex2
2974 // | |
2975 // mybin ------. mybin2
2976 // \ \ / |
2977 // (stable) .---\--------` |
2978 // \ / \ |
2979 // \ / \ /
2980 // libvndk libvendor
2981 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002982 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002983 apex {
2984 name: "myapex",
2985 key: "myapex.key",
2986 binaries: ["mybin"],
2987 vendor: true,
2988 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002989 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002990 }
2991 apex_key {
2992 name: "myapex.key",
2993 public_key: "testkey.avbpubkey",
2994 private_key: "testkey.pem",
2995 }
2996 cc_binary {
2997 name: "mybin",
2998 vendor: true,
2999 shared_libs: ["libvndk", "libvendor"],
3000 }
3001 cc_library {
3002 name: "libvndk",
3003 vndk: {
3004 enabled: true,
3005 },
3006 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003007 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09003008 }
3009 cc_library {
3010 name: "libvendor",
3011 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09003012 stl: "none",
3013 }
3014 apex {
3015 name: "myapex2",
3016 key: "myapex.key",
3017 binaries: ["mybin2"],
3018 vendor: true,
3019 use_vndk_as_stable: false,
3020 updatable: false,
3021 }
3022 cc_binary {
3023 name: "mybin2",
3024 vendor: true,
3025 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09003026 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09003027 `,
3028 android.FixtureModifyConfig(func(config android.Config) {
3029 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
3030 }),
3031 )
Jooyung Handf78e212020-07-22 15:54:47 +09003032
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003033 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003034
Jooyung Han91f92032022-02-04 12:36:33 +09003035 for _, tc := range []struct {
3036 name string
3037 apexName string
3038 moduleName string
3039 moduleVariant string
3040 libs []string
3041 contents []string
3042 requireVndkNamespace bool
3043 }{
3044 {
3045 name: "use_vndk_as_stable",
3046 apexName: "myapex",
3047 moduleName: "mybin",
3048 moduleVariant: vendorVariant + "_apex10000",
3049 libs: []string{
3050 // should link with vendor variants of VNDK libs(libvndk/libc++)
3051 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3052 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3053 // unstable Vendor libs as APEX variant
3054 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3055 },
3056 contents: []string{
3057 "bin/mybin",
3058 "lib64/libvendor.so",
3059 // VNDK libs (libvndk/libc++) are not included
3060 },
3061 requireVndkNamespace: true,
3062 },
3063 {
3064 name: "!use_vndk_as_stable",
3065 apexName: "myapex2",
3066 moduleName: "mybin2",
3067 moduleVariant: vendorVariant + "_myapex2",
3068 libs: []string{
3069 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3070 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3071 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3072 // unstable vendor libs have "merged" APEX variants
3073 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3074 },
3075 contents: []string{
3076 "bin/mybin2",
3077 "lib64/libvendor.so",
3078 // VNDK libs are included as well
3079 "lib64/libvndk.so",
3080 "lib64/libc++.so",
3081 },
3082 requireVndkNamespace: false,
3083 },
3084 } {
3085 t.Run(tc.name, func(t *testing.T) {
3086 // Check linked libs
3087 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3088 libs := names(ldRule.Args["libFlags"])
3089 for _, lib := range tc.libs {
3090 ensureListContains(t, libs, lib)
3091 }
3092 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003093 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003094
Jooyung Han91f92032022-02-04 12:36:33 +09003095 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003096 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003097 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3098 if tc.requireVndkNamespace {
3099 ensureListContains(t, requireNativeLibs, ":vndk")
3100 } else {
3101 ensureListNotContains(t, requireNativeLibs, ":vndk")
3102 }
3103 })
3104 }
Jooyung Handf78e212020-07-22 15:54:47 +09003105}
3106
Justin Yun13decfb2021-03-08 19:25:55 +09003107func TestProductVariant(t *testing.T) {
3108 ctx := testApex(t, `
3109 apex {
3110 name: "myapex",
3111 key: "myapex.key",
3112 updatable: false,
3113 product_specific: true,
3114 binaries: ["foo"],
3115 }
3116
3117 apex_key {
3118 name: "myapex.key",
3119 public_key: "testkey.avbpubkey",
3120 private_key: "testkey.pem",
3121 }
3122
3123 cc_binary {
3124 name: "foo",
3125 product_available: true,
3126 apex_available: ["myapex"],
3127 srcs: ["foo.cpp"],
3128 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003129 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003130
3131 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003132 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003133 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3134 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3135 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3136 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3137}
3138
Jooyung Han8e5685d2020-09-21 11:02:57 +09003139func TestApex_withPrebuiltFirmware(t *testing.T) {
3140 testCases := []struct {
3141 name string
3142 additionalProp string
3143 }{
3144 {"system apex with prebuilt_firmware", ""},
3145 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3146 }
3147 for _, tc := range testCases {
3148 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003149 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003150 apex {
3151 name: "myapex",
3152 key: "myapex.key",
3153 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003154 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003155 `+tc.additionalProp+`
3156 }
3157 apex_key {
3158 name: "myapex.key",
3159 public_key: "testkey.avbpubkey",
3160 private_key: "testkey.pem",
3161 }
3162 prebuilt_firmware {
3163 name: "myfirmware",
3164 src: "myfirmware.bin",
3165 filename_from_src: true,
3166 `+tc.additionalProp+`
3167 }
3168 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003169 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003170 "etc/firmware/myfirmware.bin",
3171 })
3172 })
3173 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003174}
3175
Jooyung Hanefb184e2020-06-25 17:14:25 +09003176func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 vendor: true,
3182 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003183 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003184 }
3185
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191
3192 cc_library {
3193 name: "mylib",
3194 vendor_available: true,
3195 }
3196 `)
3197
Jooyung Hana0503a52023-08-23 13:12:50 +09003198 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003199 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003200 name := apexBundle.BaseModuleName()
3201 prefix := "TARGET_"
3202 var builder strings.Builder
3203 data.Custom(&builder, name, prefix, "", data)
3204 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003205 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003206}
3207
Jooyung Han2ed99d02020-06-24 23:26:26 +09003208func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003209 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003210 apex {
3211 name: "myapex",
3212 key: "myapex.key",
3213 vintf_fragments: ["fragment.xml"],
3214 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003215 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003216 }
3217 apex_key {
3218 name: "myapex.key",
3219 public_key: "testkey.avbpubkey",
3220 private_key: "testkey.pem",
3221 }
3222 cc_binary {
3223 name: "mybin",
3224 }
3225 `)
3226
Jooyung Hana0503a52023-08-23 13:12:50 +09003227 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003228 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003229 name := apexBundle.BaseModuleName()
3230 prefix := "TARGET_"
3231 var builder strings.Builder
3232 data.Custom(&builder, name, prefix, "", data)
3233 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003234 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003235 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003236}
3237
Jiyong Park16e91a02018-12-20 18:18:08 +09003238func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003239 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003240 apex {
3241 name: "myapex",
3242 key: "myapex.key",
3243 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003244 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003245 }
3246
3247 apex_key {
3248 name: "myapex.key",
3249 public_key: "testkey.avbpubkey",
3250 private_key: "testkey.pem",
3251 }
3252
3253 cc_library {
3254 name: "mylib",
3255 srcs: ["mylib.cpp"],
3256 system_shared_libs: [],
3257 stl: "none",
3258 stubs: {
3259 versions: ["1", "2", "3"],
3260 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003261 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003262 }
3263
3264 cc_binary {
3265 name: "not_in_apex",
3266 srcs: ["mylib.cpp"],
3267 static_libs: ["mylib"],
3268 static_executable: true,
3269 system_shared_libs: [],
3270 stl: "none",
3271 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003272 `)
3273
Colin Cross7113d202019-11-20 16:39:12 -08003274 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003275
3276 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003277 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003278}
Jiyong Park9335a262018-12-24 11:31:58 +09003279
3280func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003281 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003282 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003283 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003284 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003285 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003286 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003287 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003288 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003289 }
3290
3291 cc_library {
3292 name: "mylib",
3293 srcs: ["mylib.cpp"],
3294 system_shared_libs: [],
3295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003296 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003297 }
3298
3299 apex_key {
3300 name: "myapex.key",
3301 public_key: "testkey.avbpubkey",
3302 private_key: "testkey.pem",
3303 }
3304
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003305 android_app_certificate {
3306 name: "myapex.certificate",
3307 certificate: "testkey",
3308 }
3309
3310 android_app_certificate {
3311 name: "myapex.certificate.override",
3312 certificate: "testkey.override",
3313 }
3314
Jiyong Park9335a262018-12-24 11:31:58 +09003315 `)
3316
3317 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003318 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003319
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003320 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3321 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003322 "vendor/foo/devkeys/testkey.avbpubkey")
3323 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003324 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3325 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003326 "vendor/foo/devkeys/testkey.pem")
3327 }
3328
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003329 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003330 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003331 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003332 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003333 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003334 }
3335}
Jiyong Park58e364a2019-01-19 19:24:06 +09003336
Jooyung Hanf121a652019-12-17 14:30:11 +09003337func TestCertificate(t *testing.T) {
3338 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003339 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 apex {
3341 name: "myapex",
3342 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003343 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 }
3345 apex_key {
3346 name: "myapex.key",
3347 public_key: "testkey.avbpubkey",
3348 private_key: "testkey.pem",
3349 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003350 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3352 if actual := rule.Args["certificates"]; actual != expected {
3353 t.Errorf("certificates should be %q, not %q", expected, actual)
3354 }
3355 })
3356 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003357 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003358 apex {
3359 name: "myapex_keytest",
3360 key: "myapex.key",
3361 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003362 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003363 }
3364 apex_key {
3365 name: "myapex.key",
3366 public_key: "testkey.avbpubkey",
3367 private_key: "testkey.pem",
3368 }
3369 android_app_certificate {
3370 name: "myapex.certificate.override",
3371 certificate: "testkey.override",
3372 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003373 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 expected := "testkey.override.x509.pem testkey.override.pk8"
3375 if actual := rule.Args["certificates"]; actual != expected {
3376 t.Errorf("certificates should be %q, not %q", expected, actual)
3377 }
3378 })
3379 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003380 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003381 apex {
3382 name: "myapex",
3383 key: "myapex.key",
3384 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003385 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003386 }
3387 apex_key {
3388 name: "myapex.key",
3389 public_key: "testkey.avbpubkey",
3390 private_key: "testkey.pem",
3391 }
3392 android_app_certificate {
3393 name: "myapex.certificate",
3394 certificate: "testkey",
3395 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003396 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 expected := "testkey.x509.pem testkey.pk8"
3398 if actual := rule.Args["certificates"]; actual != expected {
3399 t.Errorf("certificates should be %q, not %q", expected, actual)
3400 }
3401 })
3402 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003403 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003404 apex {
3405 name: "myapex_keytest",
3406 key: "myapex.key",
3407 file_contexts: ":myapex-file_contexts",
3408 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003409 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003410 }
3411 apex_key {
3412 name: "myapex.key",
3413 public_key: "testkey.avbpubkey",
3414 private_key: "testkey.pem",
3415 }
3416 android_app_certificate {
3417 name: "myapex.certificate.override",
3418 certificate: "testkey.override",
3419 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003420 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003421 expected := "testkey.override.x509.pem testkey.override.pk8"
3422 if actual := rule.Args["certificates"]; actual != expected {
3423 t.Errorf("certificates should be %q, not %q", expected, actual)
3424 }
3425 })
3426 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003427 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003428 apex {
3429 name: "myapex",
3430 key: "myapex.key",
3431 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003433 }
3434 apex_key {
3435 name: "myapex.key",
3436 public_key: "testkey.avbpubkey",
3437 private_key: "testkey.pem",
3438 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003439 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003440 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3441 if actual := rule.Args["certificates"]; actual != expected {
3442 t.Errorf("certificates should be %q, not %q", expected, actual)
3443 }
3444 })
3445 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003446 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 apex {
3448 name: "myapex_keytest",
3449 key: "myapex.key",
3450 file_contexts: ":myapex-file_contexts",
3451 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003452 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003453 }
3454 apex_key {
3455 name: "myapex.key",
3456 public_key: "testkey.avbpubkey",
3457 private_key: "testkey.pem",
3458 }
3459 android_app_certificate {
3460 name: "myapex.certificate.override",
3461 certificate: "testkey.override",
3462 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003463 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003464 expected := "testkey.override.x509.pem testkey.override.pk8"
3465 if actual := rule.Args["certificates"]; actual != expected {
3466 t.Errorf("certificates should be %q, not %q", expected, actual)
3467 }
3468 })
3469}
3470
Jiyong Park58e364a2019-01-19 19:24:06 +09003471func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003472 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003473 apex {
3474 name: "myapex",
3475 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003476 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003477 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003478 }
3479
3480 apex {
3481 name: "otherapex",
3482 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003483 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003484 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003485 }
3486
3487 apex_key {
3488 name: "myapex.key",
3489 public_key: "testkey.avbpubkey",
3490 private_key: "testkey.pem",
3491 }
3492
3493 cc_library {
3494 name: "mylib",
3495 srcs: ["mylib.cpp"],
3496 system_shared_libs: [],
3497 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003498 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003499 "myapex",
3500 "otherapex",
3501 ],
Jooyung Han24282772020-03-21 23:20:55 +09003502 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003503 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003504 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003505 cc_library {
3506 name: "mylib2",
3507 srcs: ["mylib.cpp"],
3508 system_shared_libs: [],
3509 stl: "none",
3510 apex_available: [
3511 "myapex",
3512 "otherapex",
3513 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003514 static_libs: ["mylib3"],
3515 recovery_available: true,
3516 min_sdk_version: "29",
3517 }
3518 cc_library {
3519 name: "mylib3",
3520 srcs: ["mylib.cpp"],
3521 system_shared_libs: [],
3522 stl: "none",
3523 apex_available: [
3524 "myapex",
3525 "otherapex",
3526 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003527 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003528 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003529 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003530 `)
3531
Jooyung Hanc87a0592020-03-02 17:44:33 +09003532 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003533 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003534 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003535
Vinh Tranf9754732023-01-19 22:41:46 -05003536 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003537 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003539
Vinh Tranf9754732023-01-19 22:41:46 -05003540 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003541 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003542 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003543
Colin Crossaede88c2020-08-11 12:17:01 -07003544 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3545 // each variant defines additional macros to distinguish which apex variant it is built for
3546
3547 // non-APEX variant does not have __ANDROID_APEX__ defined
3548 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3549 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3550
Vinh Tranf9754732023-01-19 22:41:46 -05003551 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003552 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3553 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003554
Jooyung Hanc87a0592020-03-02 17:44:33 +09003555 // non-APEX variant does not have __ANDROID_APEX__ defined
3556 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3557 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3558
Vinh Tranf9754732023-01-19 22:41:46 -05003559 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003560 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003561 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003562}
Jiyong Park7e636d02019-01-28 16:16:54 +09003563
3564func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003565 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003566 apex {
3567 name: "myapex",
3568 key: "myapex.key",
3569 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003570 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003571 }
3572
3573 apex_key {
3574 name: "myapex.key",
3575 public_key: "testkey.avbpubkey",
3576 private_key: "testkey.pem",
3577 }
3578
3579 cc_library_headers {
3580 name: "mylib_headers",
3581 export_include_dirs: ["my_include"],
3582 system_shared_libs: [],
3583 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003584 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003585 }
3586
3587 cc_library {
3588 name: "mylib",
3589 srcs: ["mylib.cpp"],
3590 system_shared_libs: [],
3591 stl: "none",
3592 header_libs: ["mylib_headers"],
3593 export_header_lib_headers: ["mylib_headers"],
3594 stubs: {
3595 versions: ["1", "2", "3"],
3596 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003597 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003598 }
3599
3600 cc_library {
3601 name: "otherlib",
3602 srcs: ["mylib.cpp"],
3603 system_shared_libs: [],
3604 stl: "none",
3605 shared_libs: ["mylib"],
3606 }
3607 `)
3608
Colin Cross7113d202019-11-20 16:39:12 -08003609 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003610
3611 // Ensure that the include path of the header lib is exported to 'otherlib'
3612 ensureContains(t, cFlags, "-Imy_include")
3613}
Alex Light9670d332019-01-29 18:07:33 -08003614
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615type fileInApex struct {
3616 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003617 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003618 isLink bool
3619}
3620
Jooyung Han1724d582022-12-21 10:17:44 +09003621func (f fileInApex) String() string {
3622 return f.src + ":" + f.path
3623}
3624
3625func (f fileInApex) match(expectation string) bool {
3626 parts := strings.Split(expectation, ":")
3627 if len(parts) == 1 {
3628 match, _ := path.Match(parts[0], f.path)
3629 return match
3630 }
3631 if len(parts) == 2 {
3632 matchSrc, _ := path.Match(parts[0], f.src)
3633 matchDst, _ := path.Match(parts[1], f.path)
3634 return matchSrc && matchDst
3635 }
3636 panic("invalid expected file specification: " + expectation)
3637}
3638
Jooyung Hana57af4a2020-01-23 05:36:59 +00003639func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003641 module := ctx.ModuleForTests(moduleName, variant)
3642 apexRule := module.MaybeRule("apexRule")
3643 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003644 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003646 for _, cmd := range strings.Split(copyCmds, "&&") {
3647 cmd = strings.TrimSpace(cmd)
3648 if cmd == "" {
3649 continue
3650 }
3651 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003653 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 switch terms[0] {
3655 case "mkdir":
3656 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003657 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003658 t.Fatal("copyCmds contains invalid cp command", cmd)
3659 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003661 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003662 isLink = false
3663 case "ln":
3664 if len(terms) != 3 && len(terms) != 4 {
3665 // ln LINK TARGET or ln -s LINK TARGET
3666 t.Fatal("copyCmds contains invalid ln command", cmd)
3667 }
3668 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003669 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 isLink = true
3671 default:
3672 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3673 }
3674 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003675 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003676 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003677 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003678 }
Jooyung Han1724d582022-12-21 10:17:44 +09003679 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003680 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003681 }
3682 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003683 return ret
3684}
3685
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003686func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003687 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003688 var failed bool
3689 var surplus []string
3690 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003691 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003692 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003693 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003694 if file.match(expected) {
3695 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003696 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003697 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003698 }
3699 }
Jooyung Han1724d582022-12-21 10:17:44 +09003700 if !matchFound {
3701 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003702 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003703 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003704
Jooyung Han31c470b2019-10-18 16:26:59 +09003705 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003706 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003707 t.Log("surplus files", surplus)
3708 failed = true
3709 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003710
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003711 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003712 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003713 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003714 if !filesMatched[expected] {
3715 missing = append(missing, expected)
3716 }
3717 }
3718 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003719 t.Log("missing files", missing)
3720 failed = true
3721 }
3722 if failed {
3723 t.Fail()
3724 }
3725}
3726
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003727func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3728 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3729}
3730
3731func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003732 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003733 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3734 if deapexer.Output != nil {
3735 outputs = append(outputs, deapexer.Output.String())
3736 }
3737 for _, output := range deapexer.ImplicitOutputs {
3738 outputs = append(outputs, output.String())
3739 }
3740 actualFiles := make([]fileInApex, 0, len(outputs))
3741 for _, output := range outputs {
3742 dir := "/deapexer/"
3743 pos := strings.LastIndex(output, dir)
3744 if pos == -1 {
3745 t.Fatal("Unknown deapexer output ", output)
3746 }
3747 path := output[pos+len(dir):]
3748 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3749 }
3750 assertFileListEquals(t, files, actualFiles)
3751}
3752
Jooyung Han344d5432019-08-23 11:17:39 +09003753func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003754 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003755 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003756 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003757 "etc/llndk.libraries.29.txt",
3758 "etc/vndkcore.libraries.29.txt",
3759 "etc/vndksp.libraries.29.txt",
3760 "etc/vndkprivate.libraries.29.txt",
3761 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003762 }
3763 testCases := []struct {
3764 vndkVersion string
3765 expectedFiles []string
3766 }{
3767 {
3768 vndkVersion: "current",
3769 expectedFiles: append(commonFiles,
3770 "lib/libvndk.so",
3771 "lib/libvndksp.so",
3772 "lib64/libvndk.so",
3773 "lib64/libvndksp.so"),
3774 },
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003775 }
3776 for _, tc := range testCases {
3777 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3778 ctx := testApex(t, `
3779 apex_vndk {
3780 name: "com.android.vndk.current",
3781 key: "com.android.vndk.current.key",
3782 updatable: false,
3783 }
3784
3785 apex_key {
3786 name: "com.android.vndk.current.key",
3787 public_key: "testkey.avbpubkey",
3788 private_key: "testkey.pem",
3789 }
3790
3791 cc_library {
3792 name: "libvndk",
3793 srcs: ["mylib.cpp"],
3794 vendor_available: true,
3795 product_available: true,
3796 vndk: {
3797 enabled: true,
3798 },
3799 system_shared_libs: [],
3800 stl: "none",
3801 apex_available: [ "com.android.vndk.current" ],
3802 }
3803
3804 cc_library {
3805 name: "libvndksp",
3806 srcs: ["mylib.cpp"],
3807 vendor_available: true,
3808 product_available: true,
3809 vndk: {
3810 enabled: true,
3811 support_system_process: true,
3812 },
3813 system_shared_libs: [],
3814 stl: "none",
3815 apex_available: [ "com.android.vndk.current" ],
3816 }
3817
3818 // VNDK-Ext should not cause any problems
3819
3820 cc_library {
3821 name: "libvndk.ext",
3822 srcs: ["mylib2.cpp"],
3823 vendor: true,
3824 vndk: {
3825 enabled: true,
3826 extends: "libvndk",
3827 },
3828 system_shared_libs: [],
3829 stl: "none",
3830 }
3831
3832 cc_library {
3833 name: "libvndksp.ext",
3834 srcs: ["mylib2.cpp"],
3835 vendor: true,
3836 vndk: {
3837 enabled: true,
3838 support_system_process: true,
3839 extends: "libvndksp",
3840 },
3841 system_shared_libs: [],
3842 stl: "none",
3843 }
3844 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3845 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003846 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003847 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003848 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003849 })
3850 }
Jooyung Han344d5432019-08-23 11:17:39 +09003851}
3852
3853func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003854 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003855 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003856 name: "com.android.vndk.current",
3857 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003858 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003859 }
3860
3861 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003862 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003863 public_key: "testkey.avbpubkey",
3864 private_key: "testkey.pem",
3865 }
3866
3867 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 name: "libvndk",
3869 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003870 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003871 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003872 vndk: {
3873 enabled: true,
3874 },
3875 system_shared_libs: [],
3876 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003877 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003878 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003879
3880 cc_prebuilt_library_shared {
3881 name: "libvndk.arm",
3882 srcs: ["libvndk.arm.so"],
3883 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003884 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003885 vndk: {
3886 enabled: true,
3887 },
3888 enabled: false,
3889 arch: {
3890 arm: {
3891 enabled: true,
3892 },
3893 },
3894 system_shared_libs: [],
3895 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003896 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003897 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003898 `+vndkLibrariesTxtFiles("current"),
3899 withFiles(map[string][]byte{
3900 "libvndk.so": nil,
3901 "libvndk.arm.so": nil,
3902 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003903 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 "lib/libvndk.so",
3905 "lib/libvndk.arm.so",
3906 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003907 "lib/libc++.so",
3908 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003909 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003910 })
Jooyung Han344d5432019-08-23 11:17:39 +09003911}
3912
Jooyung Han39edb6c2019-11-06 16:53:07 +09003913func vndkLibrariesTxtFiles(vers ...string) (result string) {
3914 for _, v := range vers {
3915 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003916 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003917 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003918 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003920 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003921 }
3922 `
3923 }
Justin Yund5784122023-10-25 13:25:32 +09003924 result += `
3925 llndk_libraries_txt {
3926 name: "llndk.libraries.txt",
3927 }
3928 llndk_libraries_txt_for_apex {
3929 name: "llndk.libraries.txt.apex",
3930 stem: "llndk.libraries.txt",
3931 insert_vndk_version: true,
3932 }
3933 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003934 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003935 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003936 result += `
3937 prebuilt_etc {
3938 name: "` + txt + `.libraries.` + v + `.txt",
3939 src: "dummy.txt",
3940 }
3941 `
3942 }
3943 }
3944 }
3945 return
3946}
3947
Jooyung Han344d5432019-08-23 11:17:39 +09003948func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003949 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003950 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003951 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003952 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003953 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003954 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003955 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003956 }
3957
3958 apex_key {
3959 name: "myapex.key",
3960 public_key: "testkey.avbpubkey",
3961 private_key: "testkey.pem",
3962 }
3963
Jooyung Han31c470b2019-10-18 16:26:59 +09003964 vndk_prebuilt_shared {
3965 name: "libvndk27",
3966 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003967 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003968 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003969 vndk: {
3970 enabled: true,
3971 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003972 target_arch: "arm64",
3973 arch: {
3974 arm: {
3975 srcs: ["libvndk27_arm.so"],
3976 },
3977 arm64: {
3978 srcs: ["libvndk27_arm64.so"],
3979 },
3980 },
Colin Cross2807f002021-03-02 10:15:29 -08003981 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003982 }
3983
3984 vndk_prebuilt_shared {
3985 name: "libvndk27",
3986 version: "27",
3987 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003988 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003989 vndk: {
3990 enabled: true,
3991 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003992 target_arch: "x86_64",
3993 arch: {
3994 x86: {
3995 srcs: ["libvndk27_x86.so"],
3996 },
3997 x86_64: {
3998 srcs: ["libvndk27_x86_64.so"],
3999 },
4000 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004001 }
4002 `+vndkLibrariesTxtFiles("27"),
4003 withFiles(map[string][]byte{
4004 "libvndk27_arm.so": nil,
4005 "libvndk27_arm64.so": nil,
4006 "libvndk27_x86.so": nil,
4007 "libvndk27_x86_64.so": nil,
4008 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004009
Jooyung Hana0503a52023-08-23 13:12:50 +09004010 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004011 "lib/libvndk27_arm.so",
4012 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004013 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004014 })
Jooyung Han344d5432019-08-23 11:17:39 +09004015}
4016
Jooyung Han90eee022019-10-01 20:02:42 +09004017func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004018 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004019 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004020 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09004021 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004022 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004023 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004024 }
4025 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004026 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004027 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004028 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004029 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004030 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004031 }
4032 apex_key {
4033 name: "myapex.key",
4034 public_key: "testkey.avbpubkey",
4035 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004036 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004037
4038 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004039 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004040 apexManifestRule := module.Rule("apexManifestRule")
4041 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004042 }
4043
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004044 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004045 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004046}
4047
Jooyung Han344d5432019-08-23 11:17:39 +09004048func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004049 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004050 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004051 name: "com.android.vndk.current",
4052 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004053 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004054 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004055 }
4056
4057 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004059 public_key: "testkey.avbpubkey",
4060 private_key: "testkey.pem",
4061 }
4062
4063 cc_library {
4064 name: "libvndk",
4065 srcs: ["mylib.cpp"],
4066 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004067 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004068 native_bridge_supported: true,
4069 host_supported: true,
4070 vndk: {
4071 enabled: true,
4072 },
4073 system_shared_libs: [],
4074 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004075 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004076 }
Colin Cross2807f002021-03-02 10:15:29 -08004077 `+vndkLibrariesTxtFiles("current"),
4078 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004079
Jooyung Hana0503a52023-08-23 13:12:50 +09004080 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 "lib/libvndk.so",
4082 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004083 "lib/libc++.so",
4084 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004085 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004086 })
Jooyung Han344d5432019-08-23 11:17:39 +09004087}
4088
4089func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004090 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004091 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004092 name: "com.android.vndk.current",
4093 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004094 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004095 native_bridge_supported: true,
4096 }
4097
4098 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004100 public_key: "testkey.avbpubkey",
4101 private_key: "testkey.pem",
4102 }
4103
4104 cc_library {
4105 name: "libvndk",
4106 srcs: ["mylib.cpp"],
4107 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004108 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004109 native_bridge_supported: true,
4110 host_supported: true,
4111 vndk: {
4112 enabled: true,
4113 },
4114 system_shared_libs: [],
4115 stl: "none",
4116 }
4117 `)
4118}
4119
Jooyung Han31c470b2019-10-18 16:26:59 +09004120func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004121 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004122 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004123 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004124 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004125 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004126 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004127 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }
4129
4130 apex_key {
4131 name: "myapex.key",
4132 public_key: "testkey.avbpubkey",
4133 private_key: "testkey.pem",
4134 }
4135
4136 vndk_prebuilt_shared {
4137 name: "libvndk27",
4138 version: "27",
4139 target_arch: "arm",
4140 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004141 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004142 vndk: {
4143 enabled: true,
4144 },
4145 arch: {
4146 arm: {
4147 srcs: ["libvndk27.so"],
4148 }
4149 },
4150 }
4151
4152 vndk_prebuilt_shared {
4153 name: "libvndk27",
4154 version: "27",
4155 target_arch: "arm",
4156 binder32bit: true,
4157 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004158 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004159 vndk: {
4160 enabled: true,
4161 },
4162 arch: {
4163 arm: {
4164 srcs: ["libvndk27binder32.so"],
4165 }
4166 },
Colin Cross2807f002021-03-02 10:15:29 -08004167 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004168 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004169 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004170 withFiles(map[string][]byte{
4171 "libvndk27.so": nil,
4172 "libvndk27binder32.so": nil,
4173 }),
4174 withBinder32bit,
4175 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004176 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004177 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4178 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004179 },
4180 }),
4181 )
4182
Jooyung Hana0503a52023-08-23 13:12:50 +09004183 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004184 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004185 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004186 })
4187}
4188
Jooyung Han45a96772020-06-15 14:59:42 +09004189func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004190 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004191 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004192 name: "com.android.vndk.current",
4193 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004194 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004195 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004196 }
4197
4198 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004199 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004200 public_key: "testkey.avbpubkey",
4201 private_key: "testkey.pem",
4202 }
4203
4204 cc_library {
4205 name: "libz",
4206 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004207 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004208 vndk: {
4209 enabled: true,
4210 },
4211 stubs: {
4212 symbol_file: "libz.map.txt",
4213 versions: ["30"],
4214 }
4215 }
4216 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4217 "libz.map.txt": nil,
4218 }))
4219
Jooyung Hana0503a52023-08-23 13:12:50 +09004220 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004221 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4222 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004223 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004224 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4225 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4226 "*/*",
4227 })
Jooyung Han45a96772020-06-15 14:59:42 +09004228}
4229
Jooyung Hane3f02812023-05-08 13:54:50 +09004230func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4231 ctx := testApex(t, "",
4232 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4233 variables.DeviceVndkVersion = proptools.StringPtr("27")
4234 }),
4235 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4236 cc.RegisterVendorSnapshotModules(ctx)
4237 }),
4238 withFiles(map[string][]byte{
4239 "vendor/foo/Android.bp": []byte(`
4240 apex {
4241 name: "myapex",
4242 binaries: ["foo"],
4243 key: "myapex.key",
4244 min_sdk_version: "27",
4245 vendor: true,
4246 }
4247
4248 cc_binary {
4249 name: "foo",
4250 vendor: true,
4251 srcs: ["abc.cpp"],
4252 shared_libs: [
4253 "libllndk",
4254 "libvndk",
4255 ],
4256 nocrt: true,
4257 system_shared_libs: [],
4258 min_sdk_version: "27",
4259 }
4260
4261 apex_key {
4262 name: "myapex.key",
4263 public_key: "testkey.avbpubkey",
4264 private_key: "testkey.pem",
4265 }
4266 `),
4267 // Simulate VNDK prebuilts with vendor_snapshot
4268 "prebuilts/vndk/Android.bp": []byte(`
4269 vndk_prebuilt_shared {
4270 name: "libllndk",
4271 version: "27",
4272 vendor_available: true,
4273 product_available: true,
4274 target_arch: "arm64",
4275 arch: {
4276 arm64: {
4277 srcs: ["libllndk.so"],
4278 },
4279 },
4280 }
4281
4282 vndk_prebuilt_shared {
4283 name: "libvndk",
4284 version: "27",
4285 vendor_available: true,
4286 product_available: true,
4287 target_arch: "arm64",
4288 arch: {
4289 arm64: {
4290 srcs: ["libvndk.so"],
4291 },
4292 },
4293 vndk: {
4294 enabled: true,
4295 },
4296 min_sdk_version: "27",
4297 }
4298
4299 vndk_prebuilt_shared {
4300 name: "libc++",
4301 version: "27",
4302 target_arch: "arm64",
4303 vendor_available: true,
4304 product_available: true,
4305 vndk: {
4306 enabled: true,
4307 support_system_process: true,
4308 },
4309 arch: {
4310 arm64: {
4311 srcs: ["libc++.so"],
4312 },
4313 },
4314 min_sdk_version: "apex_inherit",
4315 }
4316
4317 vendor_snapshot {
4318 name: "vendor_snapshot",
4319 version: "27",
4320 arch: {
4321 arm64: {
4322 vndk_libs: [
4323 "libc++",
4324 "libllndk",
4325 "libvndk",
4326 ],
4327 static_libs: [
4328 "libc++demangle",
4329 "libclang_rt.builtins",
4330 "libunwind",
4331 ],
4332 },
4333 }
4334 }
4335
4336 vendor_snapshot_static {
4337 name: "libclang_rt.builtins",
4338 version: "27",
4339 target_arch: "arm64",
4340 vendor: true,
4341 arch: {
4342 arm64: {
4343 src: "libclang_rt.builtins-aarch64-android.a",
4344 },
4345 },
4346 }
4347
4348 vendor_snapshot_static {
4349 name: "libc++demangle",
4350 version: "27",
4351 target_arch: "arm64",
4352 compile_multilib: "64",
4353 vendor: true,
4354 arch: {
4355 arm64: {
4356 src: "libc++demangle.a",
4357 },
4358 },
4359 min_sdk_version: "apex_inherit",
4360 }
4361
4362 vendor_snapshot_static {
4363 name: "libunwind",
4364 version: "27",
4365 target_arch: "arm64",
4366 compile_multilib: "64",
4367 vendor: true,
4368 arch: {
4369 arm64: {
4370 src: "libunwind.a",
4371 },
4372 },
4373 min_sdk_version: "apex_inherit",
4374 }
4375 `),
4376 }))
4377
4378 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004379 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004380 "bin/foo",
4381 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4382 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4383 })
4384
4385 // Should link foo with prebuilt libraries (shared/static)
4386 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4387 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4388 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4389 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4390 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4391
4392 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004393 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004394 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4395 ensureListContains(t, requireNativeLibs, "libllndk.so")
4396}
4397
Jooyung Hane1633032019-08-01 17:41:43 +09004398func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004399 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004400 apex {
4401 name: "myapex_nodep",
4402 key: "myapex.key",
4403 native_shared_libs: ["lib_nodep"],
4404 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004405 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004406 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004407 }
4408
4409 apex {
4410 name: "myapex_dep",
4411 key: "myapex.key",
4412 native_shared_libs: ["lib_dep"],
4413 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004414 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004415 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004416 }
4417
4418 apex {
4419 name: "myapex_provider",
4420 key: "myapex.key",
4421 native_shared_libs: ["libfoo"],
4422 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004423 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004424 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004425 }
4426
4427 apex {
4428 name: "myapex_selfcontained",
4429 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004430 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004431 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004432 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004433 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004434 }
4435
4436 apex_key {
4437 name: "myapex.key",
4438 public_key: "testkey.avbpubkey",
4439 private_key: "testkey.pem",
4440 }
4441
4442 cc_library {
4443 name: "lib_nodep",
4444 srcs: ["mylib.cpp"],
4445 system_shared_libs: [],
4446 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004447 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004448 }
4449
4450 cc_library {
4451 name: "lib_dep",
4452 srcs: ["mylib.cpp"],
4453 shared_libs: ["libfoo"],
4454 system_shared_libs: [],
4455 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004456 apex_available: [
4457 "myapex_dep",
4458 "myapex_provider",
4459 "myapex_selfcontained",
4460 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004461 }
4462
4463 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004464 name: "lib_dep_on_bar",
4465 srcs: ["mylib.cpp"],
4466 shared_libs: ["libbar"],
4467 system_shared_libs: [],
4468 stl: "none",
4469 apex_available: [
4470 "myapex_selfcontained",
4471 ],
4472 }
4473
4474
4475 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004476 name: "libfoo",
4477 srcs: ["mytest.cpp"],
4478 stubs: {
4479 versions: ["1"],
4480 },
4481 system_shared_libs: [],
4482 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004483 apex_available: [
4484 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004485 ],
4486 }
4487
4488 cc_library {
4489 name: "libbar",
4490 srcs: ["mytest.cpp"],
4491 stubs: {
4492 versions: ["1"],
4493 },
4494 system_shared_libs: [],
4495 stl: "none",
4496 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004497 "myapex_selfcontained",
4498 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004499 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004500
Jooyung Hane1633032019-08-01 17:41:43 +09004501 `)
4502
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004503 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004504 var provideNativeLibs, requireNativeLibs []string
4505
Jooyung Hana0503a52023-08-23 13:12:50 +09004506 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004507 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4508 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004509 ensureListEmpty(t, provideNativeLibs)
4510 ensureListEmpty(t, requireNativeLibs)
4511
Jooyung Hana0503a52023-08-23 13:12:50 +09004512 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004513 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4514 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, provideNativeLibs)
4516 ensureListContains(t, requireNativeLibs, "libfoo.so")
4517
Jooyung Hana0503a52023-08-23 13:12:50 +09004518 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004519 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4520 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004521 ensureListContains(t, provideNativeLibs, "libfoo.so")
4522 ensureListEmpty(t, requireNativeLibs)
4523
Jooyung Hana0503a52023-08-23 13:12:50 +09004524 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004525 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4526 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004527 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004528 ensureListEmpty(t, requireNativeLibs)
4529}
4530
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004531func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4532 ctx := testApex(t, `
4533 apex {
4534 name: "myapex",
4535 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004536 native_shared_libs: ["mylib"],
4537 updatable: false,
4538 }
4539
4540 apex_key {
4541 name: "myapex.key",
4542 public_key: "testkey.avbpubkey",
4543 private_key: "testkey.pem",
4544 }
4545
4546 cc_library {
4547 name: "mylib",
4548 srcs: ["mylib.cpp"],
4549 system_shared_libs: [],
4550 stl: "none",
4551 apex_available: [
4552 "//apex_available:platform",
4553 "myapex",
4554 ],
4555 }
4556 `, android.FixtureMergeEnv(map[string]string{
4557 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4558 }))
4559
Jooyung Hana0503a52023-08-23 13:12:50 +09004560 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004561 apexManifestRule := module.Rule("apexManifestRule")
4562 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4563}
4564
Vinh Tran8f5310f2022-10-07 18:16:47 -04004565func TestCompileMultilibProp(t *testing.T) {
4566 testCases := []struct {
4567 compileMultiLibProp string
4568 containedLibs []string
4569 notContainedLibs []string
4570 }{
4571 {
4572 containedLibs: []string{
4573 "image.apex/lib64/mylib.so",
4574 "image.apex/lib/mylib.so",
4575 },
4576 compileMultiLibProp: `compile_multilib: "both",`,
4577 },
4578 {
4579 containedLibs: []string{"image.apex/lib64/mylib.so"},
4580 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4581 compileMultiLibProp: `compile_multilib: "first",`,
4582 },
4583 {
4584 containedLibs: []string{"image.apex/lib64/mylib.so"},
4585 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4586 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4587 },
4588 {
4589 containedLibs: []string{"image.apex/lib64/mylib.so"},
4590 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4591 compileMultiLibProp: `compile_multilib: "64",`,
4592 },
4593 {
4594 containedLibs: []string{"image.apex/lib/mylib.so"},
4595 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4596 compileMultiLibProp: `compile_multilib: "32",`,
4597 },
4598 }
4599 for _, testCase := range testCases {
4600 ctx := testApex(t, fmt.Sprintf(`
4601 apex {
4602 name: "myapex",
4603 key: "myapex.key",
4604 %s
4605 native_shared_libs: ["mylib"],
4606 updatable: false,
4607 }
4608 apex_key {
4609 name: "myapex.key",
4610 public_key: "testkey.avbpubkey",
4611 private_key: "testkey.pem",
4612 }
4613 cc_library {
4614 name: "mylib",
4615 srcs: ["mylib.cpp"],
4616 apex_available: [
4617 "//apex_available:platform",
4618 "myapex",
4619 ],
4620 }
4621 `, testCase.compileMultiLibProp),
4622 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004623 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004624 apexRule := module.Rule("apexRule")
4625 copyCmds := apexRule.Args["copy_commands"]
4626 for _, containedLib := range testCase.containedLibs {
4627 ensureContains(t, copyCmds, containedLib)
4628 }
4629 for _, notContainedLib := range testCase.notContainedLibs {
4630 ensureNotContains(t, copyCmds, notContainedLib)
4631 }
4632 }
4633}
4634
Alex Light0851b882019-02-07 13:20:53 -08004635func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004636 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004637 apex {
4638 name: "myapex",
4639 key: "myapex.key",
4640 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004641 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004642 }
4643
4644 apex_key {
4645 name: "myapex.key",
4646 public_key: "testkey.avbpubkey",
4647 private_key: "testkey.pem",
4648 }
4649
4650 cc_library {
4651 name: "mylib_common",
4652 srcs: ["mylib.cpp"],
4653 system_shared_libs: [],
4654 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004655 apex_available: [
4656 "//apex_available:platform",
4657 "myapex",
4658 ],
Alex Light0851b882019-02-07 13:20:53 -08004659 }
4660 `)
4661
Jooyung Hana0503a52023-08-23 13:12:50 +09004662 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004663 apexRule := module.Rule("apexRule")
4664 copyCmds := apexRule.Args["copy_commands"]
4665
4666 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4667 t.Log("Apex was a test apex!")
4668 t.Fail()
4669 }
4670 // Ensure that main rule creates an output
4671 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4672
4673 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004674 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004675
4676 // Ensure that both direct and indirect deps are copied into apex
4677 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4678
Colin Cross7113d202019-11-20 16:39:12 -08004679 // Ensure that the platform variant ends with _shared
4680 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004681
Colin Cross56a83212020-09-15 18:30:11 -07004682 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004683 t.Log("Found mylib_common not in any apex!")
4684 t.Fail()
4685 }
4686}
4687
4688func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004689 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004690 apex_test {
4691 name: "myapex",
4692 key: "myapex.key",
4693 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004694 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004695 }
4696
4697 apex_key {
4698 name: "myapex.key",
4699 public_key: "testkey.avbpubkey",
4700 private_key: "testkey.pem",
4701 }
4702
4703 cc_library {
4704 name: "mylib_common_test",
4705 srcs: ["mylib.cpp"],
4706 system_shared_libs: [],
4707 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004708 // TODO: remove //apex_available:platform
4709 apex_available: [
4710 "//apex_available:platform",
4711 "myapex",
4712 ],
Alex Light0851b882019-02-07 13:20:53 -08004713 }
4714 `)
4715
Jooyung Hana0503a52023-08-23 13:12:50 +09004716 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004717 apexRule := module.Rule("apexRule")
4718 copyCmds := apexRule.Args["copy_commands"]
4719
4720 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4721 t.Log("Apex was not a test apex!")
4722 t.Fail()
4723 }
4724 // Ensure that main rule creates an output
4725 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4726
4727 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004728 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004729
4730 // Ensure that both direct and indirect deps are copied into apex
4731 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4732
Colin Cross7113d202019-11-20 16:39:12 -08004733 // Ensure that the platform variant ends with _shared
4734 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004735}
4736
Jooyung Han85707de2023-12-01 14:21:13 +09004737func TestLibzVendorIsntStable(t *testing.T) {
4738 ctx := testApex(t, `
4739 apex {
4740 name: "myapex",
4741 key: "myapex.key",
4742 updatable: false,
4743 binaries: ["mybin"],
4744 }
4745 apex {
4746 name: "myvendorapex",
4747 key: "myapex.key",
4748 file_contexts: "myvendorapex_file_contexts",
4749 vendor: true,
4750 updatable: false,
4751 binaries: ["mybin"],
4752 }
4753 apex_key {
4754 name: "myapex.key",
4755 public_key: "testkey.avbpubkey",
4756 private_key: "testkey.pem",
4757 }
4758 cc_binary {
4759 name: "mybin",
4760 vendor_available: true,
4761 system_shared_libs: [],
4762 stl: "none",
4763 shared_libs: ["libz"],
4764 apex_available: ["//apex_available:anyapex"],
4765 }
4766 cc_library {
4767 name: "libz",
4768 vendor_available: true,
4769 system_shared_libs: [],
4770 stl: "none",
4771 stubs: {
4772 versions: ["28", "30"],
4773 },
4774 target: {
4775 vendor: {
4776 no_stubs: true,
4777 },
4778 },
4779 }
4780 `, withFiles(map[string][]byte{
4781 "myvendorapex_file_contexts": nil,
4782 }))
4783
4784 // libz provides stubs for core variant.
4785 {
4786 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4787 "bin/mybin",
4788 })
4789 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4790 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4791 }
4792 // libz doesn't provide stubs for vendor variant.
4793 {
4794 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4795 "bin/mybin",
4796 "lib64/libz.so",
4797 })
4798 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4799 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4800 }
4801}
4802
Alex Light9670d332019-01-29 18:07:33 -08004803func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004804 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004805 apex {
4806 name: "myapex",
4807 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004808 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004809 multilib: {
4810 first: {
4811 native_shared_libs: ["mylib_common"],
4812 }
4813 },
4814 target: {
4815 android: {
4816 multilib: {
4817 first: {
4818 native_shared_libs: ["mylib"],
4819 }
4820 }
4821 },
4822 host: {
4823 multilib: {
4824 first: {
4825 native_shared_libs: ["mylib2"],
4826 }
4827 }
4828 }
4829 }
4830 }
4831
4832 apex_key {
4833 name: "myapex.key",
4834 public_key: "testkey.avbpubkey",
4835 private_key: "testkey.pem",
4836 }
4837
4838 cc_library {
4839 name: "mylib",
4840 srcs: ["mylib.cpp"],
4841 system_shared_libs: [],
4842 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004843 // TODO: remove //apex_available:platform
4844 apex_available: [
4845 "//apex_available:platform",
4846 "myapex",
4847 ],
Alex Light9670d332019-01-29 18:07:33 -08004848 }
4849
4850 cc_library {
4851 name: "mylib_common",
4852 srcs: ["mylib.cpp"],
4853 system_shared_libs: [],
4854 stl: "none",
4855 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004856 // TODO: remove //apex_available:platform
4857 apex_available: [
4858 "//apex_available:platform",
4859 "myapex",
4860 ],
Alex Light9670d332019-01-29 18:07:33 -08004861 }
4862
4863 cc_library {
4864 name: "mylib2",
4865 srcs: ["mylib.cpp"],
4866 system_shared_libs: [],
4867 stl: "none",
4868 compile_multilib: "first",
4869 }
4870 `)
4871
Jooyung Hana0503a52023-08-23 13:12:50 +09004872 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004873 copyCmds := apexRule.Args["copy_commands"]
4874
4875 // Ensure that main rule creates an output
4876 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4877
4878 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004879 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4880 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4881 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004882
4883 // Ensure that both direct and indirect deps are copied into apex
4884 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4885 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4886 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4887
Colin Cross7113d202019-11-20 16:39:12 -08004888 // Ensure that the platform variant ends with _shared
4889 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4890 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4891 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004892}
Jiyong Park04480cf2019-02-06 00:16:29 +09004893
Jiyong Park59140302020-12-14 18:44:04 +09004894func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004895 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004896 apex {
4897 name: "myapex",
4898 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004899 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004900 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004901 arch: {
4902 arm64: {
4903 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004904 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004905 },
4906 x86_64: {
4907 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004908 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004909 },
4910 }
4911 }
4912
4913 apex_key {
4914 name: "myapex.key",
4915 public_key: "testkey.avbpubkey",
4916 private_key: "testkey.pem",
4917 }
4918
4919 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004920 name: "mylib.generic",
4921 srcs: ["mylib.cpp"],
4922 system_shared_libs: [],
4923 stl: "none",
4924 // TODO: remove //apex_available:platform
4925 apex_available: [
4926 "//apex_available:platform",
4927 "myapex",
4928 ],
4929 }
4930
4931 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004932 name: "mylib.arm64",
4933 srcs: ["mylib.cpp"],
4934 system_shared_libs: [],
4935 stl: "none",
4936 // TODO: remove //apex_available:platform
4937 apex_available: [
4938 "//apex_available:platform",
4939 "myapex",
4940 ],
4941 }
4942
4943 cc_library {
4944 name: "mylib.x64",
4945 srcs: ["mylib.cpp"],
4946 system_shared_libs: [],
4947 stl: "none",
4948 // TODO: remove //apex_available:platform
4949 apex_available: [
4950 "//apex_available:platform",
4951 "myapex",
4952 ],
4953 }
4954 `)
4955
Jooyung Hana0503a52023-08-23 13:12:50 +09004956 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004957 copyCmds := apexRule.Args["copy_commands"]
4958
4959 // Ensure that apex variant is created for the direct dep
4960 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004961 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004962 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4963
4964 // Ensure that both direct and indirect deps are copied into apex
4965 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4966 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4967}
4968
Jiyong Park04480cf2019-02-06 00:16:29 +09004969func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004970 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004971 apex {
4972 name: "myapex",
4973 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004974 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004975 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004976 }
4977
4978 apex_key {
4979 name: "myapex.key",
4980 public_key: "testkey.avbpubkey",
4981 private_key: "testkey.pem",
4982 }
4983
4984 sh_binary {
4985 name: "myscript",
4986 src: "mylib.cpp",
4987 filename: "myscript.sh",
4988 sub_dir: "script",
4989 }
4990 `)
4991
Jooyung Hana0503a52023-08-23 13:12:50 +09004992 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004993 copyCmds := apexRule.Args["copy_commands"]
4994
4995 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4996}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004997
Jooyung Han91df2082019-11-20 01:49:42 +09004998func TestApexInVariousPartition(t *testing.T) {
4999 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005000 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005001 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005002 {"", "system"},
5003 {"product_specific: true", "product"},
5004 {"soc_specific: true", "vendor"},
5005 {"proprietary: true", "vendor"},
5006 {"vendor: true", "vendor"},
5007 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005008 }
5009 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005010 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005011 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005012 apex {
5013 name: "myapex",
5014 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005016 `+tc.propName+`
5017 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005018
Jooyung Han91df2082019-11-20 01:49:42 +09005019 apex_key {
5020 name: "myapex.key",
5021 public_key: "testkey.avbpubkey",
5022 private_key: "testkey.pem",
5023 }
5024 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005025
Jooyung Hana0503a52023-08-23 13:12:50 +09005026 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005027 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005028 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005029 if actual != expected {
5030 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5031 }
Jooyung Han91df2082019-11-20 01:49:42 +09005032 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005033 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005034}
Jiyong Park67882562019-03-21 01:11:21 +09005035
Jooyung Han580eb4f2020-06-24 19:33:06 +09005036func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005037 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005038 apex {
5039 name: "myapex",
5040 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005041 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005042 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005043
Jooyung Han580eb4f2020-06-24 19:33:06 +09005044 apex_key {
5045 name: "myapex.key",
5046 public_key: "testkey.avbpubkey",
5047 private_key: "testkey.pem",
5048 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005049 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005050 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005051 rule := module.Output("file_contexts")
5052 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5053}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005054
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005056 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005057 apex {
5058 name: "myapex",
5059 key: "myapex.key",
5060 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005061 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005063
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex_key {
5065 name: "myapex.key",
5066 public_key: "testkey.avbpubkey",
5067 private_key: "testkey.pem",
5068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069 `, withFiles(map[string][]byte{
5070 "my_own_file_contexts": nil,
5071 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005072}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005073
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076 apex {
5077 name: "myapex",
5078 key: "myapex.key",
5079 product_specific: true,
5080 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005081 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005082 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005083
Jooyung Han580eb4f2020-06-24 19:33:06 +09005084 apex_key {
5085 name: "myapex.key",
5086 public_key: "testkey.avbpubkey",
5087 private_key: "testkey.pem",
5088 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005089 `)
5090
Colin Cross1c460562021-02-16 17:55:47 -08005091 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005092 apex {
5093 name: "myapex",
5094 key: "myapex.key",
5095 product_specific: true,
5096 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005097 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005098 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005099
Jooyung Han580eb4f2020-06-24 19:33:06 +09005100 apex_key {
5101 name: "myapex.key",
5102 public_key: "testkey.avbpubkey",
5103 private_key: "testkey.pem",
5104 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005105 `, withFiles(map[string][]byte{
5106 "product_specific_file_contexts": nil,
5107 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005108 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005109 rule := module.Output("file_contexts")
5110 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5111}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005112
Jooyung Han580eb4f2020-06-24 19:33:06 +09005113func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005114 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005115 apex {
5116 name: "myapex",
5117 key: "myapex.key",
5118 product_specific: true,
5119 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005120 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005121 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005122
Jooyung Han580eb4f2020-06-24 19:33:06 +09005123 apex_key {
5124 name: "myapex.key",
5125 public_key: "testkey.avbpubkey",
5126 private_key: "testkey.pem",
5127 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005128
Jooyung Han580eb4f2020-06-24 19:33:06 +09005129 filegroup {
5130 name: "my-file-contexts",
5131 srcs: ["product_specific_file_contexts"],
5132 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005133 `, withFiles(map[string][]byte{
5134 "product_specific_file_contexts": nil,
5135 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005136 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005137 rule := module.Output("file_contexts")
5138 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005139}
5140
Jiyong Park67882562019-03-21 01:11:21 +09005141func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005142 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005143 apex_key {
5144 name: "myapex.key",
5145 public_key: ":my.avbpubkey",
5146 private_key: ":my.pem",
5147 product_specific: true,
5148 }
5149
5150 filegroup {
5151 name: "my.avbpubkey",
5152 srcs: ["testkey2.avbpubkey"],
5153 }
5154
5155 filegroup {
5156 name: "my.pem",
5157 srcs: ["testkey2.pem"],
5158 }
5159 `)
5160
5161 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5162 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005163 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005164 if actual_pubkey != expected_pubkey {
5165 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5166 }
5167 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005168 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005169 if actual_privkey != expected_privkey {
5170 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5171 }
5172}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005173
5174func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005175 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005176 prebuilt_apex {
5177 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005178 arch: {
5179 arm64: {
5180 src: "myapex-arm64.apex",
5181 },
5182 arm: {
5183 src: "myapex-arm.apex",
5184 },
5185 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005186 }
5187 `)
5188
Wei Li340ee8e2022-03-18 17:33:24 -07005189 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5190 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005191
Jiyong Parkc95714e2019-03-29 14:23:10 +09005192 expectedInput := "myapex-arm64.apex"
5193 if prebuilt.inputApex.String() != expectedInput {
5194 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5195 }
Wei Li340ee8e2022-03-18 17:33:24 -07005196 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5197 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5198 rule := testingModule.Rule("genProvenanceMetaData")
5199 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5200 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5201 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5202 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005203
5204 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5205 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005206}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005207
Paul Duffinc0609c62021-03-01 17:27:16 +00005208func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005209 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005210 prebuilt_apex {
5211 name: "myapex",
5212 }
5213 `)
5214}
5215
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005216func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005217 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005218 prebuilt_apex {
5219 name: "myapex",
5220 src: "myapex-arm.apex",
5221 filename: "notmyapex.apex",
5222 }
5223 `)
5224
Wei Li340ee8e2022-03-18 17:33:24 -07005225 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5226 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005227
5228 expected := "notmyapex.apex"
5229 if p.installFilename != expected {
5230 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5231 }
Wei Li340ee8e2022-03-18 17:33:24 -07005232 rule := testingModule.Rule("genProvenanceMetaData")
5233 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5234 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5235 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5236 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005237}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005238
Samiul Islam7c02e262021-09-08 17:48:28 +01005239func TestApexSetFilenameOverride(t *testing.T) {
5240 testApex(t, `
5241 apex_set {
5242 name: "com.company.android.myapex",
5243 apex_name: "com.android.myapex",
5244 set: "company-myapex.apks",
5245 filename: "com.company.android.myapex.apex"
5246 }
5247 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5248
5249 testApex(t, `
5250 apex_set {
5251 name: "com.company.android.myapex",
5252 apex_name: "com.android.myapex",
5253 set: "company-myapex.apks",
5254 filename: "com.company.android.myapex.capex"
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257
5258 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5259 apex_set {
5260 name: "com.company.android.myapex",
5261 apex_name: "com.android.myapex",
5262 set: "company-myapex.apks",
5263 filename: "some-random-suffix"
5264 }
5265 `)
5266}
5267
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005268func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005269 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005270 prebuilt_apex {
5271 name: "myapex.prebuilt",
5272 src: "myapex-arm.apex",
5273 overrides: [
5274 "myapex",
5275 ],
5276 }
5277 `)
5278
Wei Li340ee8e2022-03-18 17:33:24 -07005279 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5280 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005281
5282 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005283 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005284 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005285 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005286 }
Wei Li340ee8e2022-03-18 17:33:24 -07005287 rule := testingModule.Rule("genProvenanceMetaData")
5288 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5289 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5290 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5291 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005292}
5293
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005294func TestPrebuiltApexName(t *testing.T) {
5295 testApex(t, `
5296 prebuilt_apex {
5297 name: "com.company.android.myapex",
5298 apex_name: "com.android.myapex",
5299 src: "company-myapex-arm.apex",
5300 }
5301 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5302
5303 testApex(t, `
5304 apex_set {
5305 name: "com.company.android.myapex",
5306 apex_name: "com.android.myapex",
5307 set: "company-myapex.apks",
5308 }
5309 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5310}
5311
5312func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5313 _ = android.GroupFixturePreparers(
5314 java.PrepareForTestWithJavaDefaultModules,
5315 PrepareForTestWithApexBuildComponents,
5316 android.FixtureWithRootAndroidBp(`
5317 platform_bootclasspath {
5318 name: "platform-bootclasspath",
5319 fragments: [
5320 {
5321 apex: "com.android.art",
5322 module: "art-bootclasspath-fragment",
5323 },
5324 ],
5325 }
5326
5327 prebuilt_apex {
5328 name: "com.company.android.art",
5329 apex_name: "com.android.art",
5330 src: "com.company.android.art-arm.apex",
5331 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5332 }
5333
5334 prebuilt_bootclasspath_fragment {
5335 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005336 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005337 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005338 hidden_api: {
5339 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5340 metadata: "my-bootclasspath-fragment/metadata.csv",
5341 index: "my-bootclasspath-fragment/index.csv",
5342 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5343 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5344 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005345 }
5346
5347 java_import {
5348 name: "core-oj",
5349 jars: ["prebuilt.jar"],
5350 }
5351 `),
5352 ).RunTest(t)
5353}
5354
Spandan Das59a4a2b2024-01-09 21:35:56 +00005355// A minimal context object for use with DexJarBuildPath
5356type moduleErrorfTestCtx struct {
5357}
5358
5359func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5360}
5361
Paul Duffin092153d2021-01-26 11:42:39 +00005362// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5363// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005364func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005365 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005366
Paul Duffin89886cb2021-02-05 16:44:03 +00005367 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005368 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005369 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005370 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005371 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005372 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005373 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005374 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005375 android.NormalizePathForTesting(dexJarBuildPath))
5376 }
5377
5378 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005379 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005380 // Make sure the import has been given the correct path to the dex jar.
5381 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5382 dexJarBuildPath := p.DexJarInstallPath()
5383 stem := android.RemoveOptionalPrebuiltPrefix(name)
5384 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5385 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5386 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005387 }
5388
Paul Duffin39853512021-02-26 11:09:39 +00005389 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005390 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005391 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005392 android.AssertArrayString(t, "Check if there is no source variant",
5393 []string{"android_common"},
5394 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005395 }
5396
5397 t.Run("prebuilt only", func(t *testing.T) {
5398 bp := `
5399 prebuilt_apex {
5400 name: "myapex",
5401 arch: {
5402 arm64: {
5403 src: "myapex-arm64.apex",
5404 },
5405 arm: {
5406 src: "myapex-arm.apex",
5407 },
5408 },
Paul Duffin39853512021-02-26 11:09:39 +00005409 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005410 }
5411
5412 java_import {
5413 name: "libfoo",
5414 jars: ["libfoo.jar"],
5415 }
Paul Duffin39853512021-02-26 11:09:39 +00005416
5417 java_sdk_library_import {
5418 name: "libbar",
5419 public: {
5420 jars: ["libbar.jar"],
5421 },
5422 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005423 `
5424
5425 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5426 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5427
Spandan Das3576e762024-01-03 18:57:03 +00005428 deapexerName := deapexerModuleName("prebuilt_myapex")
5429 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005430
Paul Duffinf6932af2021-02-26 18:21:56 +00005431 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005432 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005433 rule := deapexer.Rule("deapexer")
5434 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5435 t.Errorf("expected: %q, found: %q", expected, actual)
5436 }
5437
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005438 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005439 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005440 rule = prebuiltApex.Rule("android/soong/android.Cp")
5441 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5442 t.Errorf("expected: %q, found: %q", expected, actual)
5443 }
5444
Paul Duffin89886cb2021-02-05 16:44:03 +00005445 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005446 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005447
5448 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005450 })
5451
5452 t.Run("prebuilt with source preferred", func(t *testing.T) {
5453
5454 bp := `
5455 prebuilt_apex {
5456 name: "myapex",
5457 arch: {
5458 arm64: {
5459 src: "myapex-arm64.apex",
5460 },
5461 arm: {
5462 src: "myapex-arm.apex",
5463 },
5464 },
Paul Duffin39853512021-02-26 11:09:39 +00005465 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005466 }
5467
5468 java_import {
5469 name: "libfoo",
5470 jars: ["libfoo.jar"],
5471 }
5472
5473 java_library {
5474 name: "libfoo",
5475 }
Paul Duffin39853512021-02-26 11:09:39 +00005476
5477 java_sdk_library_import {
5478 name: "libbar",
5479 public: {
5480 jars: ["libbar.jar"],
5481 },
5482 }
5483
5484 java_sdk_library {
5485 name: "libbar",
5486 srcs: ["foo/bar/MyClass.java"],
5487 unsafe_ignore_missing_latest_api: true,
5488 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005489 `
5490
5491 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5492 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5493
Paul Duffin89886cb2021-02-05 16:44:03 +00005494 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005495 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005496 ensureNoSourceVariant(t, ctx, "libfoo")
5497
5498 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005499 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005500 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005501 })
5502
5503 t.Run("prebuilt preferred with source", func(t *testing.T) {
5504 bp := `
5505 prebuilt_apex {
5506 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005507 arch: {
5508 arm64: {
5509 src: "myapex-arm64.apex",
5510 },
5511 arm: {
5512 src: "myapex-arm.apex",
5513 },
5514 },
Paul Duffin39853512021-02-26 11:09:39 +00005515 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005516 }
5517
5518 java_import {
5519 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005520 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005521 jars: ["libfoo.jar"],
5522 }
5523
5524 java_library {
5525 name: "libfoo",
5526 }
Paul Duffin39853512021-02-26 11:09:39 +00005527
5528 java_sdk_library_import {
5529 name: "libbar",
5530 prefer: true,
5531 public: {
5532 jars: ["libbar.jar"],
5533 },
5534 }
5535
5536 java_sdk_library {
5537 name: "libbar",
5538 srcs: ["foo/bar/MyClass.java"],
5539 unsafe_ignore_missing_latest_api: true,
5540 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005541 `
5542
5543 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5544 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5545
Paul Duffin89886cb2021-02-05 16:44:03 +00005546 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005547 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005548 ensureNoSourceVariant(t, ctx, "libfoo")
5549
5550 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005551 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005552 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005553 })
5554}
5555
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005556func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005557 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005558 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005559 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5560 // is disabled.
5561 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5562 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563
Paul Duffin37856732021-02-26 14:24:15 +00005564 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5565 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005566 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005568 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005569 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005570 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005571 foundLibfooJar = true
5572 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005573 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005574 }
5575 }
5576 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005577 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 +00005578 }
5579 }
5580
Paul Duffin40a3f652021-07-19 13:11:24 +01005581 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005582 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005583 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005584 var rule android.TestingBuildParams
5585
5586 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5587 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005588 }
5589
Paul Duffin40a3f652021-07-19 13:11:24 +01005590 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5591 t.Helper()
5592 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5593 var rule android.TestingBuildParams
5594
5595 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5596 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5597 }
5598
Paul Duffin89f570a2021-06-16 01:42:33 +01005599 fragment := java.ApexVariantReference{
5600 Apex: proptools.StringPtr("myapex"),
5601 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5602 }
5603
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 t.Run("prebuilt only", func(t *testing.T) {
5605 bp := `
5606 prebuilt_apex {
5607 name: "myapex",
5608 arch: {
5609 arm64: {
5610 src: "myapex-arm64.apex",
5611 },
5612 arm: {
5613 src: "myapex-arm.apex",
5614 },
5615 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005616 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5617 }
5618
5619 prebuilt_bootclasspath_fragment {
5620 name: "my-bootclasspath-fragment",
5621 contents: ["libfoo", "libbar"],
5622 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005623 hidden_api: {
5624 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5625 metadata: "my-bootclasspath-fragment/metadata.csv",
5626 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005627 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5628 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5629 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005630 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631 }
5632
5633 java_import {
5634 name: "libfoo",
5635 jars: ["libfoo.jar"],
5636 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005637 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005638 }
Paul Duffin37856732021-02-26 14:24:15 +00005639
5640 java_sdk_library_import {
5641 name: "libbar",
5642 public: {
5643 jars: ["libbar.jar"],
5644 },
5645 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005646 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005647 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005648 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005649 `
5650
Paul Duffin89f570a2021-06-16 01:42:33 +01005651 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005652 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5653 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005654
Paul Duffin537ea3d2021-05-14 10:38:00 +01005655 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005656 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005657 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005658 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005659 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005660 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 +01005661 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005662 })
5663
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005664 t.Run("apex_set only", func(t *testing.T) {
5665 bp := `
5666 apex_set {
5667 name: "myapex",
5668 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005669 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005670 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005671 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5672 }
5673
5674 java_import {
5675 name: "myjavalib",
5676 jars: ["myjavalib.jar"],
5677 apex_available: ["myapex"],
5678 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005679 }
5680
5681 prebuilt_bootclasspath_fragment {
5682 name: "my-bootclasspath-fragment",
5683 contents: ["libfoo", "libbar"],
5684 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005685 hidden_api: {
5686 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5687 metadata: "my-bootclasspath-fragment/metadata.csv",
5688 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005689 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5690 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5691 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005692 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005693 }
5694
Liz Kammer2dc72442023-04-20 10:10:48 -04005695 prebuilt_systemserverclasspath_fragment {
5696 name: "my-systemserverclasspath-fragment",
5697 contents: ["libbaz"],
5698 apex_available: ["myapex"],
5699 }
5700
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005701 java_import {
5702 name: "libfoo",
5703 jars: ["libfoo.jar"],
5704 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005705 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005706 }
5707
5708 java_sdk_library_import {
5709 name: "libbar",
5710 public: {
5711 jars: ["libbar.jar"],
5712 },
5713 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005714 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005715 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005716 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005717
5718 java_sdk_library_import {
5719 name: "libbaz",
5720 public: {
5721 jars: ["libbaz.jar"],
5722 },
5723 apex_available: ["myapex"],
5724 shared_library: false,
5725 permitted_packages: ["baz"],
5726 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005727 `
5728
Paul Duffin89f570a2021-06-16 01:42:33 +01005729 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005730 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5731 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005732
Paul Duffin537ea3d2021-05-14 10:38:00 +01005733 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005734 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005735 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005736 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005737 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005738 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 +01005739 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005740
5741 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5742
5743 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005744 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005745 "myjavalib.myapex",
5746 "libfoo.myapex",
5747 "libbar.myapex",
5748 "libbaz.myapex",
5749 }
5750 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5751 for i, e := range mkEntries {
5752 g := e.OverrideName
5753 if w := overrideNames[i]; w != g {
5754 t.Errorf("Expected override name %q, got %q", w, g)
5755 }
5756 }
5757
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005758 })
5759
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005760 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5761 bp := `
5762 prebuilt_apex {
5763 name: "myapex",
5764 arch: {
5765 arm64: {
5766 src: "myapex-arm64.apex",
5767 },
5768 arm: {
5769 src: "myapex-arm.apex",
5770 },
5771 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005772 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5773 }
5774
5775 prebuilt_bootclasspath_fragment {
5776 name: "my-bootclasspath-fragment",
5777 contents: ["libfoo", "libbar"],
5778 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005779 hidden_api: {
5780 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5781 metadata: "my-bootclasspath-fragment/metadata.csv",
5782 index: "my-bootclasspath-fragment/index.csv",
5783 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5784 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5785 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005786 }
5787
5788 java_import {
5789 name: "libfoo",
5790 jars: ["libfoo.jar"],
5791 apex_available: ["myapex"],
5792 }
5793
5794 java_library {
5795 name: "libfoo",
5796 srcs: ["foo/bar/MyClass.java"],
5797 apex_available: ["myapex"],
5798 }
Paul Duffin37856732021-02-26 14:24:15 +00005799
5800 java_sdk_library_import {
5801 name: "libbar",
5802 public: {
5803 jars: ["libbar.jar"],
5804 },
5805 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005806 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005807 }
5808
5809 java_sdk_library {
5810 name: "libbar",
5811 srcs: ["foo/bar/MyClass.java"],
5812 unsafe_ignore_missing_latest_api: true,
5813 apex_available: ["myapex"],
5814 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005815 `
5816
5817 // In this test the source (java_library) libfoo is active since the
5818 // prebuilt (java_import) defaults to prefer:false. However the
5819 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5820 // find the dex boot jar in it. We either need to disable the source libfoo
5821 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005822 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005823 // dexbootjar check is skipped if AllowMissingDependencies is true
5824 preparerAllowMissingDeps := android.GroupFixturePreparers(
5825 preparer,
5826 android.PrepareForTestWithAllowMissingDependencies,
5827 )
5828 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005829 })
5830
5831 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5832 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005833 apex {
5834 name: "myapex",
5835 key: "myapex.key",
5836 updatable: false,
5837 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5838 }
5839
5840 apex_key {
5841 name: "myapex.key",
5842 public_key: "testkey.avbpubkey",
5843 private_key: "testkey.pem",
5844 }
5845
5846 bootclasspath_fragment {
5847 name: "my-bootclasspath-fragment",
5848 contents: ["libfoo", "libbar"],
5849 apex_available: ["myapex"],
5850 hidden_api: {
5851 split_packages: ["*"],
5852 },
5853 }
5854
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005855 prebuilt_apex {
5856 name: "myapex",
5857 arch: {
5858 arm64: {
5859 src: "myapex-arm64.apex",
5860 },
5861 arm: {
5862 src: "myapex-arm.apex",
5863 },
5864 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005865 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5866 }
5867
5868 prebuilt_bootclasspath_fragment {
5869 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005870 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005871 contents: ["libfoo", "libbar"],
5872 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005873 hidden_api: {
5874 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5875 metadata: "my-bootclasspath-fragment/metadata.csv",
5876 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005877 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5878 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5879 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005880 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005881 }
5882
5883 java_import {
5884 name: "libfoo",
5885 prefer: true,
5886 jars: ["libfoo.jar"],
5887 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005888 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005889 }
5890
5891 java_library {
5892 name: "libfoo",
5893 srcs: ["foo/bar/MyClass.java"],
5894 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005895 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005896 }
Paul Duffin37856732021-02-26 14:24:15 +00005897
5898 java_sdk_library_import {
5899 name: "libbar",
5900 prefer: true,
5901 public: {
5902 jars: ["libbar.jar"],
5903 },
5904 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005905 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005906 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005907 }
5908
5909 java_sdk_library {
5910 name: "libbar",
5911 srcs: ["foo/bar/MyClass.java"],
5912 unsafe_ignore_missing_latest_api: true,
5913 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005914 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005915 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005916 `
5917
Paul Duffin89f570a2021-06-16 01:42:33 +01005918 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005919 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5920 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005921
Paul Duffin537ea3d2021-05-14 10:38:00 +01005922 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005923 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005924 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005925 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005926 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005927 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 +01005928 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005929 })
5930
5931 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5932 bp := `
5933 apex {
5934 name: "myapex",
5935 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005936 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005937 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005938 }
5939
5940 apex_key {
5941 name: "myapex.key",
5942 public_key: "testkey.avbpubkey",
5943 private_key: "testkey.pem",
5944 }
5945
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005946 bootclasspath_fragment {
5947 name: "my-bootclasspath-fragment",
5948 contents: ["libfoo", "libbar"],
5949 apex_available: ["myapex"],
5950 hidden_api: {
5951 split_packages: ["*"],
5952 },
5953 }
5954
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005955 prebuilt_apex {
5956 name: "myapex",
5957 arch: {
5958 arm64: {
5959 src: "myapex-arm64.apex",
5960 },
5961 arm: {
5962 src: "myapex-arm.apex",
5963 },
5964 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005965 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5966 }
5967
5968 prebuilt_bootclasspath_fragment {
5969 name: "my-bootclasspath-fragment",
5970 contents: ["libfoo", "libbar"],
5971 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005972 hidden_api: {
5973 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5974 metadata: "my-bootclasspath-fragment/metadata.csv",
5975 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005976 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5977 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5978 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005979 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005980 }
5981
5982 java_import {
5983 name: "libfoo",
5984 jars: ["libfoo.jar"],
5985 apex_available: ["myapex"],
5986 }
5987
5988 java_library {
5989 name: "libfoo",
5990 srcs: ["foo/bar/MyClass.java"],
5991 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005992 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005993 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005994 }
Paul Duffin37856732021-02-26 14:24:15 +00005995
5996 java_sdk_library_import {
5997 name: "libbar",
5998 public: {
5999 jars: ["libbar.jar"],
6000 },
6001 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006002 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00006003 }
6004
6005 java_sdk_library {
6006 name: "libbar",
6007 srcs: ["foo/bar/MyClass.java"],
6008 unsafe_ignore_missing_latest_api: true,
6009 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006010 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006011 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006012 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006013 `
6014
Paul Duffin89f570a2021-06-16 01:42:33 +01006015 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00006016 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
6017 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 +00006018
Paul Duffin537ea3d2021-05-14 10:38:00 +01006019 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006020 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006021 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
6022 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006023 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
6024 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 +01006025 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006026 })
6027
6028 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
6029 bp := `
6030 apex {
6031 name: "myapex",
6032 enabled: false,
6033 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006034 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006035 }
6036
6037 apex_key {
6038 name: "myapex.key",
6039 public_key: "testkey.avbpubkey",
6040 private_key: "testkey.pem",
6041 }
6042
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006043 bootclasspath_fragment {
6044 name: "my-bootclasspath-fragment",
6045 enabled: false,
6046 contents: ["libfoo", "libbar"],
6047 apex_available: ["myapex"],
6048 hidden_api: {
6049 split_packages: ["*"],
6050 },
6051 }
6052
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006053 prebuilt_apex {
6054 name: "myapex",
6055 arch: {
6056 arm64: {
6057 src: "myapex-arm64.apex",
6058 },
6059 arm: {
6060 src: "myapex-arm.apex",
6061 },
6062 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006063 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6064 }
6065
6066 prebuilt_bootclasspath_fragment {
6067 name: "my-bootclasspath-fragment",
6068 contents: ["libfoo", "libbar"],
6069 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006070 hidden_api: {
6071 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6072 metadata: "my-bootclasspath-fragment/metadata.csv",
6073 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006074 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6075 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6076 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006077 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006078 }
6079
6080 java_import {
6081 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006082 jars: ["libfoo.jar"],
6083 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006084 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006085 }
6086
6087 java_library {
6088 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006089 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006090 srcs: ["foo/bar/MyClass.java"],
6091 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006092 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006093 }
Paul Duffin37856732021-02-26 14:24:15 +00006094
6095 java_sdk_library_import {
6096 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006097 public: {
6098 jars: ["libbar.jar"],
6099 },
6100 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006101 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006102 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006103 }
6104
6105 java_sdk_library {
6106 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006107 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006108 srcs: ["foo/bar/MyClass.java"],
6109 unsafe_ignore_missing_latest_api: true,
6110 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006111 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006112 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006113 `
6114
Paul Duffin89f570a2021-06-16 01:42:33 +01006115 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00006116 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6117 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006118
Paul Duffin537ea3d2021-05-14 10:38:00 +01006119 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006120 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006121 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006122 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006123 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006124 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 +01006125 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006126 })
Spandan Das3a392012024-01-17 18:26:27 +00006127
6128 t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
6129 bp := `
6130 // Source
6131 apex {
6132 name: "myapex",
6133 enabled: false,
6134 key: "myapex.key",
6135 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 // Prebuilt
6145 prebuilt_apex {
6146 name: "myapex.v1",
6147 source_apex_name: "myapex",
6148 arch: {
6149 arm64: {
6150 src: "myapex-arm64.apex",
6151 },
6152 arm: {
6153 src: "myapex-arm.apex",
6154 },
6155 },
6156 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6157 prefer: true,
6158 }
6159 prebuilt_apex {
6160 name: "myapex.v2",
6161 source_apex_name: "myapex",
6162 arch: {
6163 arm64: {
6164 src: "myapex-arm64.apex",
6165 },
6166 arm: {
6167 src: "myapex-arm.apex",
6168 },
6169 },
6170 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6171 prefer: true,
6172 }
6173
6174 prebuilt_bootclasspath_fragment {
6175 name: "my-bootclasspath-fragment",
6176 contents: ["libfoo", "libbar"],
6177 apex_available: ["myapex"],
6178 hidden_api: {
6179 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6180 metadata: "my-bootclasspath-fragment/metadata.csv",
6181 index: "my-bootclasspath-fragment/index.csv",
6182 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6183 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6184 },
6185 prefer: true,
6186 }
6187
6188 java_import {
6189 name: "libfoo",
6190 jars: ["libfoo.jar"],
6191 apex_available: ["myapex"],
6192 prefer: true,
6193 }
6194 java_import {
6195 name: "libbar",
6196 jars: ["libbar.jar"],
6197 apex_available: ["myapex"],
6198 prefer: true,
6199 }
6200 `
6201
6202 testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
6203 })
6204
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006205}
6206
Roland Levillain630846d2019-06-26 12:48:34 +01006207func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006208 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006209 apex_test {
6210 name: "myapex",
6211 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006212 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006213 tests: [
6214 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006215 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006216 ],
6217 }
6218
6219 apex_key {
6220 name: "myapex.key",
6221 public_key: "testkey.avbpubkey",
6222 private_key: "testkey.pem",
6223 }
6224
Liz Kammer1c14a212020-05-12 15:26:55 -07006225 filegroup {
6226 name: "fg",
6227 srcs: [
6228 "baz",
6229 "bar/baz"
6230 ],
6231 }
6232
Roland Levillain630846d2019-06-26 12:48:34 +01006233 cc_test {
6234 name: "mytest",
6235 gtest: false,
6236 srcs: ["mytest.cpp"],
6237 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006238 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006239 system_shared_libs: [],
6240 static_executable: true,
6241 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006242 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006243 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006244
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006245 cc_library {
6246 name: "mylib",
6247 srcs: ["mylib.cpp"],
6248 system_shared_libs: [],
6249 stl: "none",
6250 }
6251
Liz Kammer5bd365f2020-05-27 15:15:11 -07006252 filegroup {
6253 name: "fg2",
6254 srcs: [
6255 "testdata/baz"
6256 ],
6257 }
6258
Roland Levillain9b5fde92019-06-28 15:41:19 +01006259 cc_test {
6260 name: "mytests",
6261 gtest: false,
6262 srcs: [
6263 "mytest1.cpp",
6264 "mytest2.cpp",
6265 "mytest3.cpp",
6266 ],
6267 test_per_src: true,
6268 relative_install_path: "test",
6269 system_shared_libs: [],
6270 static_executable: true,
6271 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006272 data: [
6273 ":fg",
6274 ":fg2",
6275 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006276 }
Roland Levillain630846d2019-06-26 12:48:34 +01006277 `)
6278
Jooyung Hana0503a52023-08-23 13:12:50 +09006279 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006280 copyCmds := apexRule.Args["copy_commands"]
6281
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006282 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006283 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006284 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006285
Liz Kammer1c14a212020-05-12 15:26:55 -07006286 //Ensure that test data are copied into apex.
6287 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6288 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6289
Roland Levillain9b5fde92019-06-28 15:41:19 +01006290 // Ensure that test deps built with `test_per_src` are copied into apex.
6291 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6292 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6293 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006294
6295 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006296 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006297 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006298 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006299 prefix := "TARGET_"
6300 var builder strings.Builder
6301 data.Custom(&builder, name, prefix, "", data)
6302 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006303 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6304 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6305 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6306 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006307 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006308}
6309
Jooyung Hand48f3c32019-08-23 11:18:57 +09006310func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6311 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6312 apex {
6313 name: "myapex",
6314 key: "myapex.key",
6315 native_shared_libs: ["libfoo"],
6316 }
6317
6318 apex_key {
6319 name: "myapex.key",
6320 public_key: "testkey.avbpubkey",
6321 private_key: "testkey.pem",
6322 }
6323
6324 cc_library {
6325 name: "libfoo",
6326 stl: "none",
6327 system_shared_libs: [],
6328 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006329 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006330 }
6331 `)
6332 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6333 apex {
6334 name: "myapex",
6335 key: "myapex.key",
6336 java_libs: ["myjar"],
6337 }
6338
6339 apex_key {
6340 name: "myapex.key",
6341 public_key: "testkey.avbpubkey",
6342 private_key: "testkey.pem",
6343 }
6344
6345 java_library {
6346 name: "myjar",
6347 srcs: ["foo/bar/MyClass.java"],
6348 sdk_version: "none",
6349 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006350 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006351 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006352 }
6353 `)
6354}
6355
Bill Peckhama41a6962021-01-11 10:58:54 -08006356func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006357 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006358 apex {
6359 name: "myapex",
6360 key: "myapex.key",
6361 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006362 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006363 }
6364
6365 apex_key {
6366 name: "myapex.key",
6367 public_key: "testkey.avbpubkey",
6368 private_key: "testkey.pem",
6369 }
6370
6371 java_import {
6372 name: "myjavaimport",
6373 apex_available: ["myapex"],
6374 jars: ["my.jar"],
6375 compile_dex: true,
6376 }
6377 `)
6378
Jooyung Hana0503a52023-08-23 13:12:50 +09006379 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006380 apexRule := module.Rule("apexRule")
6381 copyCmds := apexRule.Args["copy_commands"]
6382 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6383}
6384
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006385func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006386 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006387 apex {
6388 name: "myapex",
6389 key: "myapex.key",
6390 apps: [
6391 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006392 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006393 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006394 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006395 }
6396
6397 apex_key {
6398 name: "myapex.key",
6399 public_key: "testkey.avbpubkey",
6400 private_key: "testkey.pem",
6401 }
6402
6403 android_app {
6404 name: "AppFoo",
6405 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006406 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006407 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006408 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006409 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006410 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006411 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006412
6413 android_app {
6414 name: "AppFooPriv",
6415 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006416 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006417 system_modules: "none",
6418 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006419 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006420 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006421 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006422 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006423
6424 cc_library_shared {
6425 name: "libjni",
6426 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006427 shared_libs: ["libfoo"],
6428 stl: "none",
6429 system_shared_libs: [],
6430 apex_available: [ "myapex" ],
6431 sdk_version: "current",
6432 }
6433
6434 cc_library_shared {
6435 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006436 stl: "none",
6437 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006438 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006439 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006440 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006441 `)
6442
Jooyung Hana0503a52023-08-23 13:12:50 +09006443 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006444 apexRule := module.Rule("apexRule")
6445 copyCmds := apexRule.Args["copy_commands"]
6446
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006447 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6448 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006449 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006450
Colin Crossaede88c2020-08-11 12:17:01 -07006451 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006452 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006453 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006454 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006455 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006456 // JNI libraries including transitive deps are
6457 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006458 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006459 // ... embedded inside APK (jnilibs.zip)
6460 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6461 // ... and not directly inside the APEX
6462 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6463 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006464
6465 apexBundle := module.Module().(*apexBundle)
6466 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6467 var builder strings.Builder
6468 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6469 androidMk := builder.String()
6470 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6471 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6472 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6473 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6474 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6475 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 +01006476}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006477
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006478func TestApexWithAppImportBuildId(t *testing.T) {
6479 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6480 for _, id := range invalidBuildIds {
6481 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6482 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6483 variables.BuildId = proptools.StringPtr(id)
6484 })
6485 testApexError(t, message, `apex {
6486 name: "myapex",
6487 key: "myapex.key",
6488 apps: ["AppFooPrebuilt"],
6489 updatable: false,
6490 }
6491
6492 apex_key {
6493 name: "myapex.key",
6494 public_key: "testkey.avbpubkey",
6495 private_key: "testkey.pem",
6496 }
6497
6498 android_app_import {
6499 name: "AppFooPrebuilt",
6500 apk: "PrebuiltAppFoo.apk",
6501 presigned: true,
6502 apex_available: ["myapex"],
6503 }
6504 `, fixture)
6505 }
6506}
6507
Dario Frenicde2a032019-10-27 00:29:22 +01006508func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006509 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006510 apex {
6511 name: "myapex",
6512 key: "myapex.key",
6513 apps: [
6514 "AppFooPrebuilt",
6515 "AppFooPrivPrebuilt",
6516 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006517 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006518 }
6519
6520 apex_key {
6521 name: "myapex.key",
6522 public_key: "testkey.avbpubkey",
6523 private_key: "testkey.pem",
6524 }
6525
6526 android_app_import {
6527 name: "AppFooPrebuilt",
6528 apk: "PrebuiltAppFoo.apk",
6529 presigned: true,
6530 dex_preopt: {
6531 enabled: false,
6532 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006533 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006534 }
6535
6536 android_app_import {
6537 name: "AppFooPrivPrebuilt",
6538 apk: "PrebuiltAppFooPriv.apk",
6539 privileged: true,
6540 presigned: true,
6541 dex_preopt: {
6542 enabled: false,
6543 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006544 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006545 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006546 }
6547 `)
6548
Jooyung Hana0503a52023-08-23 13:12:50 +09006549 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006550 apexRule := module.Rule("apexRule")
6551 copyCmds := apexRule.Args["copy_commands"]
6552
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006553 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6554 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006555}
6556
6557func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006558 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006559 apex {
6560 name: "myapex",
6561 key: "myapex.key",
6562 apps: [
6563 "AppFoo",
6564 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006565 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006566 }
6567
6568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 android_app {
6575 name: "AppFoo",
6576 srcs: ["foo/bar/MyClass.java"],
6577 sdk_version: "none",
6578 system_modules: "none",
6579 apex_available: [ "myapex" ],
6580 }
6581
6582 android_app_import {
6583 name: "AppFoo",
6584 apk: "AppFooPrebuilt.apk",
6585 filename: "AppFooPrebuilt.apk",
6586 presigned: true,
6587 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006588 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006589 }
6590 `, withFiles(map[string][]byte{
6591 "AppFooPrebuilt.apk": nil,
6592 }))
6593
Jooyung Hana0503a52023-08-23 13:12:50 +09006594 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006595 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006596 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006597}
6598
Dario Freni6f3937c2019-12-20 22:58:03 +00006599func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006600 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006601 apex {
6602 name: "myapex",
6603 key: "myapex.key",
6604 apps: [
6605 "TesterHelpAppFoo",
6606 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006607 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006608 }
6609
6610 apex_key {
6611 name: "myapex.key",
6612 public_key: "testkey.avbpubkey",
6613 private_key: "testkey.pem",
6614 }
6615
6616 android_test_helper_app {
6617 name: "TesterHelpAppFoo",
6618 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006619 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006620 }
6621
6622 `)
6623
Jooyung Hana0503a52023-08-23 13:12:50 +09006624 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006625 apexRule := module.Rule("apexRule")
6626 copyCmds := apexRule.Args["copy_commands"]
6627
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006628 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006629}
6630
Jooyung Han18020ea2019-11-13 10:50:48 +09006631func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6632 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006633 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006634 apex {
6635 name: "myapex",
6636 key: "myapex.key",
6637 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006638 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006639 }
6640
6641 apex_key {
6642 name: "myapex.key",
6643 public_key: "testkey.avbpubkey",
6644 private_key: "testkey.pem",
6645 }
6646
6647 apex {
6648 name: "otherapex",
6649 key: "myapex.key",
6650 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006651 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006652 }
6653
6654 cc_defaults {
6655 name: "libfoo-defaults",
6656 apex_available: ["otherapex"],
6657 }
6658
6659 cc_library {
6660 name: "libfoo",
6661 defaults: ["libfoo-defaults"],
6662 stl: "none",
6663 system_shared_libs: [],
6664 }`)
6665}
6666
Paul Duffine52e66f2020-03-30 17:54:29 +01006667func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006668 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006669 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006670 apex {
6671 name: "myapex",
6672 key: "myapex.key",
6673 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006674 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006675 }
6676
6677 apex_key {
6678 name: "myapex.key",
6679 public_key: "testkey.avbpubkey",
6680 private_key: "testkey.pem",
6681 }
6682
6683 apex {
6684 name: "otherapex",
6685 key: "otherapex.key",
6686 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006687 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006688 }
6689
6690 apex_key {
6691 name: "otherapex.key",
6692 public_key: "testkey.avbpubkey",
6693 private_key: "testkey.pem",
6694 }
6695
6696 cc_library {
6697 name: "libfoo",
6698 stl: "none",
6699 system_shared_libs: [],
6700 apex_available: ["otherapex"],
6701 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006702}
Jiyong Park127b40b2019-09-30 16:04:35 +09006703
Paul Duffine52e66f2020-03-30 17:54:29 +01006704func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006705 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006706 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006707.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006708.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006709.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006710.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006711.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006712.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006713 apex {
6714 name: "myapex",
6715 key: "myapex.key",
6716 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006717 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006718 }
6719
6720 apex_key {
6721 name: "myapex.key",
6722 public_key: "testkey.avbpubkey",
6723 private_key: "testkey.pem",
6724 }
6725
Jiyong Park127b40b2019-09-30 16:04:35 +09006726 cc_library {
6727 name: "libfoo",
6728 stl: "none",
6729 shared_libs: ["libbar"],
6730 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006731 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006732 }
6733
6734 cc_library {
6735 name: "libbar",
6736 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006737 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006738 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006739 apex_available: ["myapex"],
6740 }
6741
6742 cc_library {
6743 name: "libbaz",
6744 stl: "none",
6745 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006746 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006747}
Jiyong Park127b40b2019-09-30 16:04:35 +09006748
Liz Kammer5f108fa2023-05-11 14:33:17 -04006749func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6750 testApex(t, `
6751 apex {
6752 name: "myapex",
6753 key: "myapex.key",
6754 native_shared_libs: ["libfoo"],
6755 updatable: false,
6756 }
6757
6758 apex_key {
6759 name: "myapex.key",
6760 public_key: "testkey.avbpubkey",
6761 private_key: "testkey.pem",
6762 }
6763
6764 cc_library {
6765 name: "libfoo",
6766 stl: "none",
6767 static_libs: ["libbar"],
6768 system_shared_libs: [],
6769 apex_available: ["myapex"],
6770 }
6771
6772 cc_library {
6773 name: "libbar",
6774 stl: "none",
6775 shared_libs: ["libbaz"],
6776 system_shared_libs: [],
6777 apex_available: ["myapex"],
6778 }
6779
6780 cc_library {
6781 name: "libbaz",
6782 stl: "none",
6783 system_shared_libs: [],
6784 }`)
6785
6786 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6787 apex {
6788 name: "myapex",
6789 key: "myapex.key",
6790 native_shared_libs: ["libfoo"],
6791 updatable: false,
6792 }
6793
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799
6800 cc_library {
6801 name: "libfoo",
6802 stl: "none",
6803 static_libs: ["libbar"],
6804 system_shared_libs: [],
6805 apex_available: ["myapex"],
6806 }
6807
6808 cc_library {
6809 name: "libbar",
6810 stl: "none",
6811 system_shared_libs: [],
6812 }`)
6813}
6814
Paul Duffine52e66f2020-03-30 17:54:29 +01006815func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006816 testApexError(t, "\"otherapex\" is not a valid module name", `
6817 apex {
6818 name: "myapex",
6819 key: "myapex.key",
6820 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006821 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006822 }
6823
6824 apex_key {
6825 name: "myapex.key",
6826 public_key: "testkey.avbpubkey",
6827 private_key: "testkey.pem",
6828 }
6829
6830 cc_library {
6831 name: "libfoo",
6832 stl: "none",
6833 system_shared_libs: [],
6834 apex_available: ["otherapex"],
6835 }`)
6836
Paul Duffine52e66f2020-03-30 17:54:29 +01006837 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006838 apex {
6839 name: "myapex",
6840 key: "myapex.key",
6841 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006842 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006843 }
6844
6845 apex_key {
6846 name: "myapex.key",
6847 public_key: "testkey.avbpubkey",
6848 private_key: "testkey.pem",
6849 }
6850
6851 cc_library {
6852 name: "libfoo",
6853 stl: "none",
6854 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006855 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006856 apex_available: ["myapex"],
6857 }
6858
6859 cc_library {
6860 name: "libbar",
6861 stl: "none",
6862 system_shared_libs: [],
6863 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006864 }
6865
6866 cc_library {
6867 name: "libbaz",
6868 stl: "none",
6869 system_shared_libs: [],
6870 stubs: {
6871 versions: ["10", "20", "30"],
6872 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006873 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006874}
Jiyong Park127b40b2019-09-30 16:04:35 +09006875
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006876func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6877 t.Run("negative variant_version produces error", func(t *testing.T) {
6878 testApexError(t, "expected an integer between 0-9; got -1", `
6879 apex {
6880 name: "myapex",
6881 key: "myapex.key",
6882 apex_available_name: "com.android.foo",
6883 variant_version: "-1",
6884 updatable: false,
6885 }
6886 apex_key {
6887 name: "myapex.key",
6888 public_key: "testkey.avbpubkey",
6889 private_key: "testkey.pem",
6890 }
6891 `)
6892 })
6893
6894 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6895 testApexError(t, "expected an integer between 0-9; got 10", `
6896 apex {
6897 name: "myapex",
6898 key: "myapex.key",
6899 apex_available_name: "com.android.foo",
6900 variant_version: "10",
6901 updatable: false,
6902 }
6903 apex_key {
6904 name: "myapex.key",
6905 public_key: "testkey.avbpubkey",
6906 private_key: "testkey.pem",
6907 }
6908 `)
6909 })
6910}
6911
6912func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6913 context := android.GroupFixturePreparers(
6914 android.PrepareForIntegrationTestWithAndroid,
6915 PrepareForTestWithApexBuildComponents,
6916 android.FixtureMergeMockFs(android.MockFS{
6917 "system/sepolicy/apex/foo-file_contexts": nil,
6918 "system/sepolicy/apex/bar-file_contexts": nil,
6919 }),
6920 )
6921 result := context.RunTestWithBp(t, `
6922 apex {
6923 name: "foo",
6924 key: "myapex.key",
6925 apex_available_name: "com.android.foo",
6926 variant_version: "0",
6927 updatable: false,
6928 }
6929 apex {
6930 name: "bar",
6931 key: "myapex.key",
6932 apex_available_name: "com.android.foo",
6933 variant_version: "3",
6934 updatable: false,
6935 }
6936 apex_key {
6937 name: "myapex.key",
6938 public_key: "testkey.avbpubkey",
6939 private_key: "testkey.pem",
6940 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006941 override_apex {
6942 name: "myoverrideapex",
6943 base: "bar",
6944 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006945 `)
6946
Jooyung Hana0503a52023-08-23 13:12:50 +09006947 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006948 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6949 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6950 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6951 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6952 }
6953
Jooyung Hana0503a52023-08-23 13:12:50 +09006954 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006955 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6956 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6957 barActualDefaultVersion := barManifestRule.Args["default_version"]
6958 if barActualDefaultVersion != barExpectedDefaultVersion {
6959 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6960 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006961
Jooyung Hana0503a52023-08-23 13:12:50 +09006962 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006963 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6964 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6965 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6966 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006967}
6968
Sam Delmericoca816532023-06-02 14:09:50 -04006969func TestApexAvailable_ApexAvailableName(t *testing.T) {
6970 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6971 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6972 apex {
6973 name: "myapex_sminus",
6974 key: "myapex.key",
6975 apps: ["AppFoo"],
6976 apex_available_name: "myapex",
6977 updatable: false,
6978 }
6979 apex {
6980 name: "myapex",
6981 key: "myapex.key",
6982 apps: ["AppFoo"],
6983 updatable: false,
6984 }
6985 apex_key {
6986 name: "myapex.key",
6987 public_key: "testkey.avbpubkey",
6988 private_key: "testkey.pem",
6989 }
6990 android_app {
6991 name: "AppFoo",
6992 srcs: ["foo/bar/MyClass.java"],
6993 sdk_version: "none",
6994 system_modules: "none",
6995 apex_available: [ "myapex_sminus" ],
6996 }`,
6997 android.FixtureMergeMockFs(android.MockFS{
6998 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6999 }),
7000 )
7001 })
7002
7003 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
7004 testApex(t, `
7005 apex {
7006 name: "myapex_sminus",
7007 key: "myapex.key",
7008 apps: ["AppFoo"],
7009 apex_available_name: "myapex",
7010 updatable: false,
7011 }
7012 apex {
7013 name: "myapex",
7014 key: "myapex.key",
7015 apps: ["AppFoo"],
7016 updatable: false,
7017 }
7018 apex_key {
7019 name: "myapex.key",
7020 public_key: "testkey.avbpubkey",
7021 private_key: "testkey.pem",
7022 }
7023 android_app {
7024 name: "AppFoo",
7025 srcs: ["foo/bar/MyClass.java"],
7026 sdk_version: "none",
7027 system_modules: "none",
7028 apex_available: [ "myapex" ],
7029 }`,
7030 android.FixtureMergeMockFs(android.MockFS{
7031 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7032 }),
7033 )
7034 })
7035
7036 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
7037 testApex(t, `
7038 override_apex {
7039 name: "myoverrideapex_sminus",
7040 base: "myapex_sminus",
7041 key: "myapex.key",
7042 apps: ["AppFooOverride"],
7043 }
7044 override_apex {
7045 name: "myoverrideapex",
7046 base: "myapex",
7047 key: "myapex.key",
7048 apps: ["AppFooOverride"],
7049 }
7050 apex {
7051 name: "myapex_sminus",
7052 key: "myapex.key",
7053 apps: ["AppFoo"],
7054 apex_available_name: "myapex",
7055 updatable: false,
7056 }
7057 apex {
7058 name: "myapex",
7059 key: "myapex.key",
7060 apps: ["AppFoo"],
7061 updatable: false,
7062 }
7063 apex_key {
7064 name: "myapex.key",
7065 public_key: "testkey.avbpubkey",
7066 private_key: "testkey.pem",
7067 }
7068 android_app {
7069 name: "AppFooOverride",
7070 srcs: ["foo/bar/MyClass.java"],
7071 sdk_version: "none",
7072 system_modules: "none",
7073 apex_available: [ "myapex" ],
7074 }
7075 android_app {
7076 name: "AppFoo",
7077 srcs: ["foo/bar/MyClass.java"],
7078 sdk_version: "none",
7079 system_modules: "none",
7080 apex_available: [ "myapex" ],
7081 }`,
7082 android.FixtureMergeMockFs(android.MockFS{
7083 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7084 }),
7085 )
7086 })
7087}
7088
7089func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
7090 context := android.GroupFixturePreparers(
7091 android.PrepareForIntegrationTestWithAndroid,
7092 PrepareForTestWithApexBuildComponents,
7093 java.PrepareForTestWithDexpreopt,
7094 android.FixtureMergeMockFs(android.MockFS{
7095 "system/sepolicy/apex/myapex-file_contexts": nil,
7096 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7097 }),
7098 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7099 variables.BuildId = proptools.StringPtr("buildid")
7100 }),
7101 )
7102 context.RunTestWithBp(t, `
7103 override_apex {
7104 name: "myoverrideapex_sminus",
7105 base: "myapex_sminus",
7106 }
7107 override_apex {
7108 name: "myoverrideapex",
7109 base: "myapex",
7110 }
7111 apex {
7112 name: "myapex",
7113 key: "myapex.key",
7114 apps: ["AppFoo"],
7115 updatable: false,
7116 }
7117 apex {
7118 name: "myapex_sminus",
7119 apex_available_name: "myapex",
7120 key: "myapex.key",
7121 apps: ["AppFoo_sminus"],
7122 updatable: false,
7123 }
7124 apex_key {
7125 name: "myapex.key",
7126 public_key: "testkey.avbpubkey",
7127 private_key: "testkey.pem",
7128 }
7129 android_app {
7130 name: "AppFoo",
7131 srcs: ["foo/bar/MyClass.java"],
7132 sdk_version: "none",
7133 system_modules: "none",
7134 apex_available: [ "myapex" ],
7135 }
7136 android_app {
7137 name: "AppFoo_sminus",
7138 srcs: ["foo/bar/MyClass.java"],
7139 sdk_version: "none",
7140 min_sdk_version: "29",
7141 system_modules: "none",
7142 apex_available: [ "myapex" ],
7143 }`)
7144}
7145
Jiyong Park89e850a2020-04-07 16:37:39 +09007146func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007147 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007148 apex {
7149 name: "myapex",
7150 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007151 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007152 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007153 }
7154
7155 apex_key {
7156 name: "myapex.key",
7157 public_key: "testkey.avbpubkey",
7158 private_key: "testkey.pem",
7159 }
7160
7161 cc_library {
7162 name: "libfoo",
7163 stl: "none",
7164 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007165 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007166 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007167 }
7168
7169 cc_library {
7170 name: "libfoo2",
7171 stl: "none",
7172 system_shared_libs: [],
7173 shared_libs: ["libbaz"],
7174 apex_available: ["//apex_available:platform"],
7175 }
7176
7177 cc_library {
7178 name: "libbar",
7179 stl: "none",
7180 system_shared_libs: [],
7181 apex_available: ["myapex"],
7182 }
7183
7184 cc_library {
7185 name: "libbaz",
7186 stl: "none",
7187 system_shared_libs: [],
7188 apex_available: ["myapex"],
7189 stubs: {
7190 versions: ["1"],
7191 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007192 }`)
7193
Jiyong Park89e850a2020-04-07 16:37:39 +09007194 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7195 // because it depends on libbar which isn't available to platform
7196 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7197 if libfoo.NotAvailableForPlatform() != true {
7198 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7199 }
7200
7201 // libfoo2 however can be available to platform because it depends on libbaz which provides
7202 // stubs
7203 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7204 if libfoo2.NotAvailableForPlatform() == true {
7205 t.Errorf("%q should be available to platform", libfoo2.String())
7206 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007207}
Jiyong Parka90ca002019-10-07 15:47:24 +09007208
Paul Duffine52e66f2020-03-30 17:54:29 +01007209func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007210 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007211 apex {
7212 name: "myapex",
7213 key: "myapex.key",
7214 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007215 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007216 }
7217
7218 apex_key {
7219 name: "myapex.key",
7220 public_key: "testkey.avbpubkey",
7221 private_key: "testkey.pem",
7222 }
7223
7224 cc_library {
7225 name: "libfoo",
7226 stl: "none",
7227 system_shared_libs: [],
7228 apex_available: ["myapex"],
7229 static: {
7230 apex_available: ["//apex_available:platform"],
7231 },
7232 }`)
7233
Jiyong Park89e850a2020-04-07 16:37:39 +09007234 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7235 if libfooShared.NotAvailableForPlatform() != true {
7236 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7237 }
7238 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7239 if libfooStatic.NotAvailableForPlatform() != false {
7240 t.Errorf("%q should be available to platform", libfooStatic.String())
7241 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007242}
7243
Jiyong Park5d790c32019-11-15 18:40:32 +09007244func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007245 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007246 apex {
7247 name: "myapex",
7248 key: "myapex.key",
7249 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007250 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007251 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007252 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007253 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007254 }
7255
7256 override_apex {
7257 name: "override_myapex",
7258 base: "myapex",
7259 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007260 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007261 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007262 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007263 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007264 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007265 key: "mynewapex.key",
7266 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007267 }
7268
7269 apex_key {
7270 name: "myapex.key",
7271 public_key: "testkey.avbpubkey",
7272 private_key: "testkey.pem",
7273 }
7274
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007275 apex_key {
7276 name: "mynewapex.key",
7277 public_key: "testkey2.avbpubkey",
7278 private_key: "testkey2.pem",
7279 }
7280
7281 android_app_certificate {
7282 name: "myapex.certificate",
7283 certificate: "testkey",
7284 }
7285
Jiyong Park5d790c32019-11-15 18:40:32 +09007286 android_app {
7287 name: "app",
7288 srcs: ["foo/bar/MyClass.java"],
7289 package_name: "foo",
7290 sdk_version: "none",
7291 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007292 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007293 }
7294
7295 override_android_app {
7296 name: "override_app",
7297 base: "app",
7298 package_name: "bar",
7299 }
markchien7c803b82021-08-26 22:10:06 +08007300
7301 bpf {
7302 name: "bpf",
7303 srcs: ["bpf.c"],
7304 }
7305
7306 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007307 name: "overrideBpf",
7308 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007309 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007310
7311 prebuilt_etc {
7312 name: "myetc",
7313 src: "myprebuilt",
7314 }
7315
7316 prebuilt_etc {
7317 name: "override_myetc",
7318 src: "override_myprebuilt",
7319 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007320 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007321
Jooyung Hana0503a52023-08-23 13:12:50 +09007322 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7323 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007324 if originalVariant.GetOverriddenBy() != "" {
7325 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7326 }
7327 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7328 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7329 }
7330
Jooyung Hana0503a52023-08-23 13:12:50 +09007331 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007332 apexRule := module.Rule("apexRule")
7333 copyCmds := apexRule.Args["copy_commands"]
7334
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007335 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7336 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007337
markchien7c803b82021-08-26 22:10:06 +08007338 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007339 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007340
Daniel Norman5a3ce132021-08-26 15:44:43 -07007341 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7342 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7343
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007344 apexBundle := module.Module().(*apexBundle)
7345 name := apexBundle.Name()
7346 if name != "override_myapex" {
7347 t.Errorf("name should be \"override_myapex\", but was %q", name)
7348 }
7349
Baligh Uddin004d7172020-02-19 21:29:28 -08007350 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7351 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7352 }
7353
Jiyong Park20bacab2020-03-03 11:45:41 +09007354 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007355 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007356 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7357
7358 signApkRule := module.Rule("signapk")
7359 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007360
Colin Crossaa255532020-07-03 13:18:24 -07007361 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007362 var builder strings.Builder
7363 data.Custom(&builder, name, "TARGET_", "", data)
7364 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007365 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7366 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007367 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007368 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007369 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007370 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007371 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007372 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007373}
7374
Albert Martineefabcf2022-03-21 20:11:16 +00007375func TestMinSdkVersionOverride(t *testing.T) {
7376 // Override from 29 to 31
7377 minSdkOverride31 := "31"
7378 ctx := testApex(t, `
7379 apex {
7380 name: "myapex",
7381 key: "myapex.key",
7382 native_shared_libs: ["mylib"],
7383 updatable: true,
7384 min_sdk_version: "29"
7385 }
7386
7387 override_apex {
7388 name: "override_myapex",
7389 base: "myapex",
7390 logging_parent: "com.foo.bar",
7391 package_name: "test.overridden.package"
7392 }
7393
7394 apex_key {
7395 name: "myapex.key",
7396 public_key: "testkey.avbpubkey",
7397 private_key: "testkey.pem",
7398 }
7399
7400 cc_library {
7401 name: "mylib",
7402 srcs: ["mylib.cpp"],
7403 runtime_libs: ["libbar"],
7404 system_shared_libs: [],
7405 stl: "none",
7406 apex_available: [ "myapex" ],
7407 min_sdk_version: "apex_inherit"
7408 }
7409
7410 cc_library {
7411 name: "libbar",
7412 srcs: ["mylib.cpp"],
7413 system_shared_libs: [],
7414 stl: "none",
7415 apex_available: [ "myapex" ],
7416 min_sdk_version: "apex_inherit"
7417 }
7418
7419 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7420
Jooyung Hana0503a52023-08-23 13:12:50 +09007421 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007422 copyCmds := apexRule.Args["copy_commands"]
7423
7424 // Ensure that direct non-stubs dep is always included
7425 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7426
7427 // Ensure that runtime_libs dep in included
7428 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7429
7430 // Ensure libraries target overridden min_sdk_version value
7431 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7432}
7433
7434func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7435 // Attempt to override from 31 to 29, should be a NOOP
7436 minSdkOverride29 := "29"
7437 ctx := testApex(t, `
7438 apex {
7439 name: "myapex",
7440 key: "myapex.key",
7441 native_shared_libs: ["mylib"],
7442 updatable: true,
7443 min_sdk_version: "31"
7444 }
7445
7446 override_apex {
7447 name: "override_myapex",
7448 base: "myapex",
7449 logging_parent: "com.foo.bar",
7450 package_name: "test.overridden.package"
7451 }
7452
7453 apex_key {
7454 name: "myapex.key",
7455 public_key: "testkey.avbpubkey",
7456 private_key: "testkey.pem",
7457 }
7458
7459 cc_library {
7460 name: "mylib",
7461 srcs: ["mylib.cpp"],
7462 runtime_libs: ["libbar"],
7463 system_shared_libs: [],
7464 stl: "none",
7465 apex_available: [ "myapex" ],
7466 min_sdk_version: "apex_inherit"
7467 }
7468
7469 cc_library {
7470 name: "libbar",
7471 srcs: ["mylib.cpp"],
7472 system_shared_libs: [],
7473 stl: "none",
7474 apex_available: [ "myapex" ],
7475 min_sdk_version: "apex_inherit"
7476 }
7477
7478 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7479
Jooyung Hana0503a52023-08-23 13:12:50 +09007480 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007481 copyCmds := apexRule.Args["copy_commands"]
7482
7483 // Ensure that direct non-stubs dep is always included
7484 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7485
7486 // Ensure that runtime_libs dep in included
7487 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7488
7489 // Ensure libraries target the original min_sdk_version value rather than the overridden
7490 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7491}
7492
Jooyung Han214bf372019-11-12 13:03:50 +09007493func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007494 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007495 apex {
7496 name: "myapex",
7497 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007498 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007499 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007500 }
7501
7502 apex_key {
7503 name: "myapex.key",
7504 public_key: "testkey.avbpubkey",
7505 private_key: "testkey.pem",
7506 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007507
7508 cc_library {
7509 name: "mylib",
7510 srcs: ["mylib.cpp"],
7511 stl: "libc++",
7512 system_shared_libs: [],
7513 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007514 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007515 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007516 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007517
Jooyung Hana0503a52023-08-23 13:12:50 +09007518 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007519 args := module.Rule("apexRule").Args
7520 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007521 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007522
7523 // The copies of the libraries in the apex should have one more dependency than
7524 // the ones outside the apex, namely the unwinder. Ideally we should check
7525 // the dependency names directly here but for some reason the names are blank in
7526 // this test.
7527 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007528 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007529 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7530 if len(apexImplicits) != len(nonApexImplicits)+1 {
7531 t.Errorf("%q missing unwinder dep", lib)
7532 }
7533 }
Jooyung Han214bf372019-11-12 13:03:50 +09007534}
7535
Paul Duffine05480a2021-03-08 15:07:14 +00007536var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007537 "api/current.txt": nil,
7538 "api/removed.txt": nil,
7539 "api/system-current.txt": nil,
7540 "api/system-removed.txt": nil,
7541 "api/test-current.txt": nil,
7542 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007543
Anton Hanssondff2c782020-12-21 17:10:01 +00007544 "100/public/api/foo.txt": nil,
7545 "100/public/api/foo-removed.txt": nil,
7546 "100/system/api/foo.txt": nil,
7547 "100/system/api/foo-removed.txt": nil,
7548
Paul Duffineedc5d52020-06-12 17:46:39 +01007549 // For java_sdk_library_import
7550 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007551}
7552
Jooyung Han58f26ab2019-12-18 15:34:32 +09007553func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007554 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007555 apex {
7556 name: "myapex",
7557 key: "myapex.key",
7558 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007559 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007560 }
7561
7562 apex_key {
7563 name: "myapex.key",
7564 public_key: "testkey.avbpubkey",
7565 private_key: "testkey.pem",
7566 }
7567
7568 java_sdk_library {
7569 name: "foo",
7570 srcs: ["a.java"],
7571 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007572 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007573 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007574
7575 prebuilt_apis {
7576 name: "sdk",
7577 api_dirs: ["100"],
7578 }
Paul Duffin9b879592020-05-26 13:21:35 +01007579 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007580
7581 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007582 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007583 "javalib/foo.jar",
7584 "etc/permissions/foo.xml",
7585 })
7586 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007587 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007588 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 +09007589}
7590
Paul Duffin9b879592020-05-26 13:21:35 +01007591func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007592 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007593 apex {
7594 name: "myapex",
7595 key: "myapex.key",
7596 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007597 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007598 }
7599
7600 apex_key {
7601 name: "myapex.key",
7602 public_key: "testkey.avbpubkey",
7603 private_key: "testkey.pem",
7604 }
7605
7606 java_sdk_library {
7607 name: "foo",
7608 srcs: ["a.java"],
7609 api_packages: ["foo"],
7610 apex_available: ["myapex"],
7611 sdk_version: "none",
7612 system_modules: "none",
7613 }
7614
7615 java_library {
7616 name: "bar",
7617 srcs: ["a.java"],
7618 libs: ["foo"],
7619 apex_available: ["myapex"],
7620 sdk_version: "none",
7621 system_modules: "none",
7622 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007623
7624 prebuilt_apis {
7625 name: "sdk",
7626 api_dirs: ["100"],
7627 }
Paul Duffin9b879592020-05-26 13:21:35 +01007628 `, withFiles(filesForSdkLibrary))
7629
7630 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007631 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007632 "javalib/bar.jar",
7633 "javalib/foo.jar",
7634 "etc/permissions/foo.xml",
7635 })
7636
7637 // The bar library should depend on the implementation jar.
7638 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007639 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007640 t.Errorf("expected %q, found %#q", expected, actual)
7641 }
7642}
7643
7644func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007645 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007646 apex {
7647 name: "myapex",
7648 key: "myapex.key",
7649 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007650 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007651 }
7652
7653 apex_key {
7654 name: "myapex.key",
7655 public_key: "testkey.avbpubkey",
7656 private_key: "testkey.pem",
7657 }
7658
7659 java_sdk_library {
7660 name: "foo",
7661 srcs: ["a.java"],
7662 api_packages: ["foo"],
7663 apex_available: ["myapex"],
7664 sdk_version: "none",
7665 system_modules: "none",
7666 }
7667
7668 java_library {
7669 name: "bar",
7670 srcs: ["a.java"],
7671 libs: ["foo"],
7672 sdk_version: "none",
7673 system_modules: "none",
7674 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007675
7676 prebuilt_apis {
7677 name: "sdk",
7678 api_dirs: ["100"],
7679 }
Paul Duffin9b879592020-05-26 13:21:35 +01007680 `, withFiles(filesForSdkLibrary))
7681
7682 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007683 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007684 "javalib/foo.jar",
7685 "etc/permissions/foo.xml",
7686 })
7687
7688 // The bar library should depend on the stubs jar.
7689 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007690 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007691 t.Errorf("expected %q, found %#q", expected, actual)
7692 }
7693}
7694
Paul Duffineedc5d52020-06-12 17:46:39 +01007695func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007696 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007697 prebuilt_apis {
7698 name: "sdk",
7699 api_dirs: ["100"],
7700 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007701 withFiles(map[string][]byte{
7702 "apex/a.java": nil,
7703 "apex/apex_manifest.json": nil,
7704 "apex/Android.bp": []byte(`
7705 package {
7706 default_visibility: ["//visibility:private"],
7707 }
7708
7709 apex {
7710 name: "myapex",
7711 key: "myapex.key",
7712 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007713 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007714 }
7715
7716 apex_key {
7717 name: "myapex.key",
7718 public_key: "testkey.avbpubkey",
7719 private_key: "testkey.pem",
7720 }
7721
7722 java_library {
7723 name: "bar",
7724 srcs: ["a.java"],
7725 libs: ["foo"],
7726 apex_available: ["myapex"],
7727 sdk_version: "none",
7728 system_modules: "none",
7729 }
7730`),
7731 "source/a.java": nil,
7732 "source/api/current.txt": nil,
7733 "source/api/removed.txt": nil,
7734 "source/Android.bp": []byte(`
7735 package {
7736 default_visibility: ["//visibility:private"],
7737 }
7738
7739 java_sdk_library {
7740 name: "foo",
7741 visibility: ["//apex"],
7742 srcs: ["a.java"],
7743 api_packages: ["foo"],
7744 apex_available: ["myapex"],
7745 sdk_version: "none",
7746 system_modules: "none",
7747 public: {
7748 enabled: true,
7749 },
7750 }
7751`),
7752 "prebuilt/a.jar": nil,
7753 "prebuilt/Android.bp": []byte(`
7754 package {
7755 default_visibility: ["//visibility:private"],
7756 }
7757
7758 java_sdk_library_import {
7759 name: "foo",
7760 visibility: ["//apex", "//source"],
7761 apex_available: ["myapex"],
7762 prefer: true,
7763 public: {
7764 jars: ["a.jar"],
7765 },
7766 }
7767`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007768 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007769 )
7770
7771 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007772 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007773 "javalib/bar.jar",
7774 "javalib/foo.jar",
7775 "etc/permissions/foo.xml",
7776 })
7777
7778 // The bar library should depend on the implementation jar.
7779 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007780 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007781 t.Errorf("expected %q, found %#q", expected, actual)
7782 }
7783}
7784
7785func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7786 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007791 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007792 }
7793
7794 apex_key {
7795 name: "myapex.key",
7796 public_key: "testkey.avbpubkey",
7797 private_key: "testkey.pem",
7798 }
7799
7800 java_sdk_library_import {
7801 name: "foo",
7802 apex_available: ["myapex"],
7803 prefer: true,
7804 public: {
7805 jars: ["a.jar"],
7806 },
7807 }
7808
7809 `, withFiles(filesForSdkLibrary))
7810}
7811
atrost6e126252020-01-27 17:01:16 +00007812func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007813 result := android.GroupFixturePreparers(
7814 prepareForApexTest,
7815 java.PrepareForTestWithPlatformCompatConfig,
7816 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007817 apex {
7818 name: "myapex",
7819 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007820 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007821 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007822 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007823 }
7824
7825 apex_key {
7826 name: "myapex.key",
7827 public_key: "testkey.avbpubkey",
7828 private_key: "testkey.pem",
7829 }
7830
7831 platform_compat_config {
7832 name: "myjar-platform-compat-config",
7833 src: ":myjar",
7834 }
7835
7836 java_library {
7837 name: "myjar",
7838 srcs: ["foo/bar/MyClass.java"],
7839 sdk_version: "none",
7840 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007841 apex_available: [ "myapex" ],
7842 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007843
7844 // Make sure that a preferred prebuilt does not affect the apex contents.
7845 prebuilt_platform_compat_config {
7846 name: "myjar-platform-compat-config",
7847 metadata: "compat-config/metadata.xml",
7848 prefer: true,
7849 }
atrost6e126252020-01-27 17:01:16 +00007850 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007851 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007852 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007853 "etc/compatconfig/myjar-platform-compat-config.xml",
7854 "javalib/myjar.jar",
7855 })
7856}
7857
Jooyung Han862c0d62022-12-21 10:15:37 +09007858func TestNoDupeApexFiles(t *testing.T) {
7859 android.GroupFixturePreparers(
7860 android.PrepareForTestWithAndroidBuildComponents,
7861 PrepareForTestWithApexBuildComponents,
7862 prepareForTestWithMyapex,
7863 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7864 ).
7865 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7866 RunTestWithBp(t, `
7867 apex {
7868 name: "myapex",
7869 key: "myapex.key",
7870 prebuilts: ["foo", "bar"],
7871 updatable: false,
7872 }
7873
7874 apex_key {
7875 name: "myapex.key",
7876 public_key: "testkey.avbpubkey",
7877 private_key: "testkey.pem",
7878 }
7879
7880 prebuilt_etc {
7881 name: "foo",
7882 src: "myprebuilt",
7883 filename_from_src: true,
7884 }
7885
7886 prebuilt_etc {
7887 name: "bar",
7888 src: "myprebuilt",
7889 filename_from_src: true,
7890 }
7891 `)
7892}
7893
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007894func TestApexUnwantedTransitiveDeps(t *testing.T) {
7895 bp := `
7896 apex {
7897 name: "myapex",
7898 key: "myapex.key",
7899 native_shared_libs: ["libfoo"],
7900 updatable: false,
7901 unwanted_transitive_deps: ["libbar"],
7902 }
7903
7904 apex_key {
7905 name: "myapex.key",
7906 public_key: "testkey.avbpubkey",
7907 private_key: "testkey.pem",
7908 }
7909
7910 cc_library {
7911 name: "libfoo",
7912 srcs: ["foo.cpp"],
7913 shared_libs: ["libbar"],
7914 apex_available: ["myapex"],
7915 }
7916
7917 cc_library {
7918 name: "libbar",
7919 srcs: ["bar.cpp"],
7920 apex_available: ["myapex"],
7921 }`
7922 ctx := testApex(t, bp)
7923 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7924 "*/libc++.so",
7925 "*/libfoo.so",
7926 // not libbar.so
7927 })
7928}
7929
Jiyong Park479321d2019-12-16 11:47:12 +09007930func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7931 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7932 apex {
7933 name: "myapex",
7934 key: "myapex.key",
7935 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007936 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007937 }
7938
7939 apex_key {
7940 name: "myapex.key",
7941 public_key: "testkey.avbpubkey",
7942 private_key: "testkey.pem",
7943 }
7944
7945 java_library {
7946 name: "myjar",
7947 srcs: ["foo/bar/MyClass.java"],
7948 sdk_version: "none",
7949 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007950 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007951 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007952 }
7953 `)
7954}
7955
Jiyong Park7afd1072019-12-30 16:56:33 +09007956func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007957 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007958 apex {
7959 name: "myapex",
7960 key: "myapex.key",
7961 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007962 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007963 }
7964
7965 apex_key {
7966 name: "myapex.key",
7967 public_key: "testkey.avbpubkey",
7968 private_key: "testkey.pem",
7969 }
7970
7971 cc_library {
7972 name: "mylib",
7973 srcs: ["mylib.cpp"],
7974 system_shared_libs: [],
7975 stl: "none",
7976 required: ["a", "b"],
7977 host_required: ["c", "d"],
7978 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007979 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007980 }
7981 `)
7982
Jooyung Hana0503a52023-08-23 13:12:50 +09007983 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007984 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007985 name := apexBundle.BaseModuleName()
7986 prefix := "TARGET_"
7987 var builder strings.Builder
7988 data.Custom(&builder, name, prefix, "", data)
7989 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007990 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007991 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7992 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007993}
7994
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995func TestSymlinksFromApexToSystem(t *testing.T) {
7996 bp := `
7997 apex {
7998 name: "myapex",
7999 key: "myapex.key",
8000 native_shared_libs: ["mylib"],
8001 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008002 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008003 }
8004
Jiyong Park9d677202020-02-19 16:29:35 +09008005 apex {
8006 name: "myapex.updatable",
8007 key: "myapex.key",
8008 native_shared_libs: ["mylib"],
8009 java_libs: ["myjar"],
8010 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008011 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008012 }
8013
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 apex_key {
8015 name: "myapex.key",
8016 public_key: "testkey.avbpubkey",
8017 private_key: "testkey.pem",
8018 }
8019
8020 cc_library {
8021 name: "mylib",
8022 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008023 shared_libs: [
8024 "myotherlib",
8025 "myotherlib_ext",
8026 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008027 system_shared_libs: [],
8028 stl: "none",
8029 apex_available: [
8030 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008031 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008032 "//apex_available:platform",
8033 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008034 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008035 }
8036
8037 cc_library {
8038 name: "myotherlib",
8039 srcs: ["mylib.cpp"],
8040 system_shared_libs: [],
8041 stl: "none",
8042 apex_available: [
8043 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008044 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008045 "//apex_available:platform",
8046 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008047 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008048 }
8049
Jiyong Parkce243632023-02-17 18:22:25 +09008050 cc_library {
8051 name: "myotherlib_ext",
8052 srcs: ["mylib.cpp"],
8053 system_shared_libs: [],
8054 system_ext_specific: true,
8055 stl: "none",
8056 apex_available: [
8057 "myapex",
8058 "myapex.updatable",
8059 "//apex_available:platform",
8060 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008061 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008062 }
8063
Jiyong Park7cd10e32020-01-14 09:22:18 +09008064 java_library {
8065 name: "myjar",
8066 srcs: ["foo/bar/MyClass.java"],
8067 sdk_version: "none",
8068 system_modules: "none",
8069 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008070 apex_available: [
8071 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008072 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008073 "//apex_available:platform",
8074 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008075 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008076 }
8077
8078 java_library {
8079 name: "myotherjar",
8080 srcs: ["foo/bar/MyClass.java"],
8081 sdk_version: "none",
8082 system_modules: "none",
8083 apex_available: [
8084 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008085 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008086 "//apex_available:platform",
8087 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008088 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008089 }
8090 `
8091
8092 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8093 for _, f := range files {
8094 if f.path == file {
8095 if f.isLink {
8096 t.Errorf("%q is not a real file", file)
8097 }
8098 return
8099 }
8100 }
8101 t.Errorf("%q is not found", file)
8102 }
8103
Jiyong Parkce243632023-02-17 18:22:25 +09008104 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008105 for _, f := range files {
8106 if f.path == file {
8107 if !f.isLink {
8108 t.Errorf("%q is not a symlink", file)
8109 }
Jiyong Parkce243632023-02-17 18:22:25 +09008110 if f.src != target {
8111 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8112 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008113 return
8114 }
8115 }
8116 t.Errorf("%q is not found", file)
8117 }
8118
Jiyong Park9d677202020-02-19 16:29:35 +09008119 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8120 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008121 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008122 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008123 ensureRealfileExists(t, files, "javalib/myjar.jar")
8124 ensureRealfileExists(t, files, "lib64/mylib.so")
8125 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008126 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008127
Jooyung Hana0503a52023-08-23 13:12:50 +09008128 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008129 ensureRealfileExists(t, files, "javalib/myjar.jar")
8130 ensureRealfileExists(t, files, "lib64/mylib.so")
8131 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008132 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008133
8134 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008135 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008136 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008137 ensureRealfileExists(t, files, "javalib/myjar.jar")
8138 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008139 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8140 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008141
Jooyung Hana0503a52023-08-23 13:12:50 +09008142 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008143 ensureRealfileExists(t, files, "javalib/myjar.jar")
8144 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008145 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8146 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008147}
8148
Yo Chiange8128052020-07-23 20:09:18 +08008149func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008150 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008151 apex {
8152 name: "myapex",
8153 key: "myapex.key",
8154 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008155 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008156 }
8157
8158 apex_key {
8159 name: "myapex.key",
8160 public_key: "testkey.avbpubkey",
8161 private_key: "testkey.pem",
8162 }
8163
8164 cc_library_shared {
8165 name: "mylib",
8166 srcs: ["mylib.cpp"],
8167 shared_libs: ["myotherlib"],
8168 system_shared_libs: [],
8169 stl: "none",
8170 apex_available: [
8171 "myapex",
8172 "//apex_available:platform",
8173 ],
8174 }
8175
8176 cc_prebuilt_library_shared {
8177 name: "myotherlib",
8178 srcs: ["prebuilt.so"],
8179 system_shared_libs: [],
8180 stl: "none",
8181 apex_available: [
8182 "myapex",
8183 "//apex_available:platform",
8184 ],
8185 }
8186 `)
8187
Jooyung Hana0503a52023-08-23 13:12:50 +09008188 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008189 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008190 var builder strings.Builder
8191 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8192 androidMk := builder.String()
8193 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008194 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008195 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8196 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8197 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008198 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008199}
8200
Jooyung Han643adc42020-02-27 13:50:06 +09008201func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008202 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008203 apex {
8204 name: "myapex",
8205 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008206 binaries: ["mybin"],
8207 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008208 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008209 }
8210
8211 apex_key {
8212 name: "myapex.key",
8213 public_key: "testkey.avbpubkey",
8214 private_key: "testkey.pem",
8215 }
8216
8217 cc_library {
8218 name: "mylib",
8219 srcs: ["mylib.cpp"],
8220 shared_libs: ["mylib2"],
8221 system_shared_libs: [],
8222 stl: "none",
8223 apex_available: [ "myapex" ],
8224 }
8225
8226 cc_library {
8227 name: "mylib2",
8228 srcs: ["mylib.cpp"],
8229 system_shared_libs: [],
8230 stl: "none",
8231 apex_available: [ "myapex" ],
8232 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008233
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008234 // Used as both a JNI library and a regular shared library.
8235 cc_library {
8236 name: "mylib3",
8237 srcs: ["mylib.cpp"],
8238 system_shared_libs: [],
8239 stl: "none",
8240 apex_available: [ "myapex" ],
8241 }
8242
8243 cc_binary {
8244 name: "mybin",
8245 srcs: ["mybin.cpp"],
8246 shared_libs: ["mylib3"],
8247 system_shared_libs: [],
8248 stl: "none",
8249 apex_available: [ "myapex" ],
8250 }
8251
Jiyong Park34d5c332022-02-24 18:02:44 +09008252 rust_ffi_shared {
8253 name: "libfoo.rust",
8254 crate_name: "foo",
8255 srcs: ["foo.rs"],
8256 shared_libs: ["libfoo.shared_from_rust"],
8257 prefer_rlib: true,
8258 apex_available: ["myapex"],
8259 }
8260
8261 cc_library_shared {
8262 name: "libfoo.shared_from_rust",
8263 srcs: ["mylib.cpp"],
8264 system_shared_libs: [],
8265 stl: "none",
8266 stubs: {
8267 versions: ["10", "11", "12"],
8268 },
8269 }
8270
Jooyung Han643adc42020-02-27 13:50:06 +09008271 `)
8272
Jooyung Hana0503a52023-08-23 13:12:50 +09008273 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008274 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008275 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008276 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008277 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008278 "lib64/mylib.so",
8279 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008280 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008281 "lib64/libfoo.rust.so",
8282 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8283 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008284 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008285
8286 // b/220397949
8287 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008288}
8289
Jooyung Han49f67012020-04-17 13:43:10 +09008290func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008291 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008292 apex {
8293 name: "myapex",
8294 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008295 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008296 }
8297 apex_key {
8298 name: "myapex.key",
8299 public_key: "testkey.avbpubkey",
8300 private_key: "testkey.pem",
8301 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008302 `,
8303 android.FixtureModifyConfig(func(config android.Config) {
8304 delete(config.Targets, android.Android)
8305 config.AndroidCommonTarget = android.Target{}
8306 }),
8307 )
Jooyung Han49f67012020-04-17 13:43:10 +09008308
8309 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8310 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8311 }
8312}
8313
Jiyong Parkbd159612020-02-28 15:22:21 +09008314func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008315 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008316 apex {
8317 name: "myapex",
8318 key: "myapex.key",
8319 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008320 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008321 }
8322
8323 apex_key {
8324 name: "myapex.key",
8325 public_key: "testkey.avbpubkey",
8326 private_key: "testkey.pem",
8327 }
8328
8329 android_app {
8330 name: "AppFoo",
8331 srcs: ["foo/bar/MyClass.java"],
8332 sdk_version: "none",
8333 system_modules: "none",
8334 apex_available: [ "myapex" ],
8335 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008336 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008337
Jooyung Hana0503a52023-08-23 13:12:50 +09008338 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008339 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008340
8341 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008342 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 +09008343}
8344
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008345func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008346 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008347 apex {
8348 name: "myapex",
8349 key: "myapex.key",
8350 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008351 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008352 }
8353
8354 apex_key {
8355 name: "myapex.key",
8356 public_key: "testkey.avbpubkey",
8357 private_key: "testkey.pem",
8358 }
8359
8360 android_app_set {
8361 name: "AppSet",
8362 set: "AppSet.apks",
8363 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008364 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008365 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008366 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008367 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8368 s := mod.Rule("apexRule").Args["copy_commands"]
8369 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008370 if len(copyCmds) != 4 {
8371 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008372 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008373 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8374 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008375 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8376 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008377
8378 // Ensure that canned_fs_config has an entry for the app set zip file
8379 generateFsRule := mod.Rule("generateFsConfig")
8380 cmd := generateFsRule.RuleParams.Command
8381 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008382}
8383
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008384func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008385 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008386 apex_set {
8387 name: "myapex",
8388 filename: "foo_v2.apex",
8389 sanitized: {
8390 none: { set: "myapex.apks", },
8391 hwaddress: { set: "myapex.hwasan.apks", },
8392 },
Paul Duffin24704672021-04-06 16:09:30 +01008393 }
8394 `
8395 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008396
Paul Duffin24704672021-04-06 16:09:30 +01008397 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008398 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008399
Spandan Das3576e762024-01-03 18:57:03 +00008400 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008401 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008402
Paul Duffin24704672021-04-06 16:09:30 +01008403 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8404
8405 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008406 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8407 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008408
8409 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008410}
8411
Pranav Guptaeba03b02022-09-27 00:27:08 +00008412func TestApexSetApksModuleAssignment(t *testing.T) {
8413 ctx := testApex(t, `
8414 apex_set {
8415 name: "myapex",
8416 set: ":myapex_apks_file",
8417 }
8418
8419 filegroup {
8420 name: "myapex_apks_file",
8421 srcs: ["myapex.apks"],
8422 }
8423 `)
8424
Spandan Das3576e762024-01-03 18:57:03 +00008425 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008426
8427 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008428 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008429 extractedApex := m.Output(extractorOutput)
8430
8431 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8432}
8433
Paul Duffin89f570a2021-06-16 01:42:33 +01008434func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008435 t.Helper()
8436
Paul Duffin55607122021-03-30 23:32:51 +01008437 fs := android.MockFS{
8438 "a.java": nil,
8439 "a.jar": nil,
8440 "apex_manifest.json": nil,
8441 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008442 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008443 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8444 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8445 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008446 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008447 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008448
Paul Duffin55607122021-03-30 23:32:51 +01008449 errorHandler := android.FixtureExpectsNoErrors
8450 if errmsg != "" {
8451 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008452 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008453
Paul Duffin55607122021-03-30 23:32:51 +01008454 result := android.GroupFixturePreparers(
8455 cc.PrepareForTestWithCcDefaultModules,
8456 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008457 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008458 java.PrepareForTestWithJavaSdkLibraryFiles,
8459 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008460 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008461 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008462 android.FixtureModifyMockFS(func(fs android.MockFS) {
8463 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8464 insert := ""
8465 for _, fragment := range fragments {
8466 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8467 }
8468 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8469 platform_bootclasspath {
8470 name: "platform-bootclasspath",
8471 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008472 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008473 %s
8474 ],
8475 }
8476 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008477 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008478 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008479 // Dexpreopt for boot jars requires the ART boot image profile.
8480 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8481 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008482 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008483 ).
8484 ExtendWithErrorHandler(errorHandler).
8485 RunTestWithBp(t, bp)
8486
8487 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008488}
8489
Paul Duffin5556c5f2022-06-09 17:32:21 +00008490func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008491 preparers := android.GroupFixturePreparers(
8492 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008493 prepareForTestWithBootclasspathFragment,
8494 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008495 PrepareForTestWithApexBuildComponents,
8496 ).
8497 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008498 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008499
8500 bpBase := `
8501 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008502 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008503 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008504 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008505 set: "myapex.apks",
8506 }
8507
8508 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008509 name: "com.mycompany.android.art",
8510 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008511 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008512 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008513 set: "company-myapex.apks",
8514 }
8515
8516 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008517 name: "art-bootclasspath-fragment",
8518 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008519 hidden_api: {
8520 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8521 metadata: "my-bootclasspath-fragment/metadata.csv",
8522 index: "my-bootclasspath-fragment/index.csv",
8523 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8524 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8525 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008526 %s
8527 }
8528 `
8529
8530 t.Run("java_import", func(t *testing.T) {
8531 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8532 java_import {
8533 name: "libfoo",
8534 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008535 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008536 }
8537 `)
8538 })
8539
8540 t.Run("java_sdk_library_import", func(t *testing.T) {
8541 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8542 java_sdk_library_import {
8543 name: "libfoo",
8544 public: {
8545 jars: ["libbar.jar"],
8546 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008547 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008548 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008549 }
8550 `)
8551 })
8552
8553 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8554 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8555 image_name: "art",
8556 contents: ["libfoo"],
8557 `)+`
8558 java_sdk_library_import {
8559 name: "libfoo",
8560 public: {
8561 jars: ["libbar.jar"],
8562 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008563 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008564 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008565 }
8566 `)
8567 })
8568}
8569
Paul Duffin5556c5f2022-06-09 17:32:21 +00008570func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8571 preparers := android.GroupFixturePreparers(
8572 java.PrepareForTestWithJavaDefaultModules,
8573 PrepareForTestWithApexBuildComponents,
8574 )
8575
Spandan Das59a4a2b2024-01-09 21:35:56 +00008576 errCtx := moduleErrorfTestCtx{}
8577
Paul Duffin5556c5f2022-06-09 17:32:21 +00008578 bpBase := `
8579 apex_set {
8580 name: "com.android.myapex",
8581 installable: true,
8582 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8583 set: "myapex.apks",
8584 }
8585
8586 apex_set {
8587 name: "com.android.myapex_compressed",
8588 apex_name: "com.android.myapex",
8589 installable: true,
8590 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8591 set: "myapex_compressed.apks",
8592 }
8593
8594 prebuilt_bootclasspath_fragment {
8595 name: "my-bootclasspath-fragment",
8596 apex_available: [
8597 "com.android.myapex",
8598 "com.android.myapex_compressed",
8599 ],
8600 hidden_api: {
8601 annotation_flags: "annotation-flags.csv",
8602 metadata: "metadata.csv",
8603 index: "index.csv",
8604 signature_patterns: "signature_patterns.csv",
8605 },
8606 %s
8607 }
8608 `
8609
8610 t.Run("java_import", func(t *testing.T) {
8611 result := preparers.RunTestWithBp(t,
8612 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8613 java_import {
8614 name: "libfoo",
8615 jars: ["libfoo.jar"],
8616 apex_available: [
8617 "com.android.myapex",
8618 "com.android.myapex_compressed",
8619 ],
8620 }
8621 `)
8622
8623 module := result.Module("libfoo", "android_common_com.android.myapex")
8624 usesLibraryDep := module.(java.UsesLibraryDependency)
8625 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008626 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008627 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008628 })
8629
8630 t.Run("java_sdk_library_import", func(t *testing.T) {
8631 result := preparers.RunTestWithBp(t,
8632 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8633 java_sdk_library_import {
8634 name: "libfoo",
8635 public: {
8636 jars: ["libbar.jar"],
8637 },
8638 apex_available: [
8639 "com.android.myapex",
8640 "com.android.myapex_compressed",
8641 ],
8642 compile_dex: true,
8643 }
8644 `)
8645
8646 module := result.Module("libfoo", "android_common_com.android.myapex")
8647 usesLibraryDep := module.(java.UsesLibraryDependency)
8648 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008649 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008650 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008651 })
8652
8653 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8654 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8655 image_name: "art",
8656 contents: ["libfoo"],
8657 `)+`
8658 java_sdk_library_import {
8659 name: "libfoo",
8660 public: {
8661 jars: ["libbar.jar"],
8662 },
8663 apex_available: [
8664 "com.android.myapex",
8665 "com.android.myapex_compressed",
8666 ],
8667 compile_dex: true,
8668 }
8669 `)
8670 })
8671}
8672
Jooyung Han548640b2020-04-27 12:10:30 +09008673func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8674 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8675 apex {
8676 name: "myapex",
8677 key: "myapex.key",
8678 updatable: true,
8679 }
8680
8681 apex_key {
8682 name: "myapex.key",
8683 public_key: "testkey.avbpubkey",
8684 private_key: "testkey.pem",
8685 }
8686 `)
8687}
8688
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008689func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8690 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8691 apex {
8692 name: "myapex",
8693 key: "myapex.key",
8694 }
8695
8696 apex_key {
8697 name: "myapex.key",
8698 public_key: "testkey.avbpubkey",
8699 private_key: "testkey.pem",
8700 }
8701 `)
8702}
8703
Jooyung Handfc864c2023-03-20 18:19:07 +09008704func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8705 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008706 apex {
8707 name: "myapex",
8708 key: "myapex.key",
8709 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008710 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008711 soc_specific: true,
8712 }
8713
8714 apex_key {
8715 name: "myapex.key",
8716 public_key: "testkey.avbpubkey",
8717 private_key: "testkey.pem",
8718 }
8719 `)
8720}
8721
Jooyung Han02873da2023-03-22 17:41:03 +09008722func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8723 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8724 apex {
8725 name: "myapex",
8726 key: "myapex.key",
8727 updatable: false,
8728 min_sdk_version: "29",
8729 use_vndk_as_stable: true,
8730 vendor: true,
8731 }
8732
8733 apex_key {
8734 name: "myapex.key",
8735 public_key: "testkey.avbpubkey",
8736 private_key: "testkey.pem",
8737 }
8738 `)
8739}
8740
Jooyung Handfc864c2023-03-20 18:19:07 +09008741func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8742 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 updatable: false,
8747 use_vndk_as_stable: true,
8748 }
8749
8750 apex_key {
8751 name: "myapex.key",
8752 public_key: "testkey.avbpubkey",
8753 private_key: "testkey.pem",
8754 }
8755 `)
8756}
8757
satayevb98371c2021-06-15 16:49:50 +01008758func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8759 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8760 apex {
8761 name: "myapex",
8762 key: "myapex.key",
8763 systemserverclasspath_fragments: [
8764 "mysystemserverclasspathfragment",
8765 ],
8766 min_sdk_version: "29",
8767 updatable: true,
8768 }
8769
8770 apex_key {
8771 name: "myapex.key",
8772 public_key: "testkey.avbpubkey",
8773 private_key: "testkey.pem",
8774 }
8775
8776 java_library {
8777 name: "foo",
8778 srcs: ["b.java"],
8779 min_sdk_version: "29",
8780 installable: true,
8781 apex_available: [
8782 "myapex",
8783 ],
8784 }
8785
8786 systemserverclasspath_fragment {
8787 name: "mysystemserverclasspathfragment",
8788 generate_classpaths_proto: false,
8789 contents: [
8790 "foo",
8791 ],
8792 apex_available: [
8793 "myapex",
8794 ],
8795 }
satayevabcd5972021-08-06 17:49:46 +01008796 `,
8797 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8798 )
satayevb98371c2021-06-15 16:49:50 +01008799}
8800
Paul Duffin064b70c2020-11-02 17:32:38 +00008801func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008802 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008803 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008804 fragment := java.ApexVariantReference{
8805 Apex: proptools.StringPtr("myapex"),
8806 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8807 }
8808
Paul Duffin064b70c2020-11-02 17:32:38 +00008809 testDexpreoptWithApexes(t, `
8810 prebuilt_apex {
8811 name: "myapex" ,
8812 arch: {
8813 arm64: {
8814 src: "myapex-arm64.apex",
8815 },
8816 arm: {
8817 src: "myapex-arm.apex",
8818 },
8819 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008820 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8821 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008822
Paul Duffin89f570a2021-06-16 01:42:33 +01008823 prebuilt_bootclasspath_fragment {
8824 name: "my-bootclasspath-fragment",
8825 contents: ["libfoo"],
8826 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008827 hidden_api: {
8828 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8829 metadata: "my-bootclasspath-fragment/metadata.csv",
8830 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008831 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8832 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8833 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008834 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008835 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008836
Paul Duffin89f570a2021-06-16 01:42:33 +01008837 java_import {
8838 name: "libfoo",
8839 jars: ["libfoo.jar"],
8840 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008841 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008842 }
8843 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008844 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008845}
8846
Spandan Dasf14e2542021-11-12 00:01:37 +00008847func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008848 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008849 bp += `
8850 apex_key {
8851 name: "myapex.key",
8852 public_key: "testkey.avbpubkey",
8853 private_key: "testkey.pem",
8854 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008855 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008856 "lib1/src/A.java": nil,
8857 "lib2/src/B.java": nil,
8858 "system/sepolicy/apex/myapex-file_contexts": nil,
8859 }
8860
Paul Duffin45338f02021-03-30 23:07:52 +01008861 errorHandler := android.FixtureExpectsNoErrors
8862 if errmsg != "" {
8863 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008864 }
Colin Crossae8600b2020-10-29 17:09:13 -07008865
Paul Duffin45338f02021-03-30 23:07:52 +01008866 android.GroupFixturePreparers(
8867 android.PrepareForTestWithAndroidBuildComponents,
8868 java.PrepareForTestWithJavaBuildComponents,
8869 PrepareForTestWithApexBuildComponents,
8870 android.PrepareForTestWithNeverallowRules(rules),
8871 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008872 apexBootJars := make([]string, 0, len(bootJars))
8873 for _, apexBootJar := range bootJars {
8874 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008875 }
satayevd604b212021-07-21 14:23:52 +01008876 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008877 }),
8878 fs.AddToFixture(),
8879 ).
8880 ExtendWithErrorHandler(errorHandler).
8881 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008882}
8883
8884func TestApexPermittedPackagesRules(t *testing.T) {
8885 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008886 name string
8887 expectedError string
8888 bp string
8889 bootJars []string
8890 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008891 }{
8892
8893 {
8894 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8895 expectedError: "",
8896 bp: `
8897 java_library {
8898 name: "bcp_lib1",
8899 srcs: ["lib1/src/*.java"],
8900 permitted_packages: ["foo.bar"],
8901 apex_available: ["myapex"],
8902 sdk_version: "none",
8903 system_modules: "none",
8904 }
8905 java_library {
8906 name: "nonbcp_lib2",
8907 srcs: ["lib2/src/*.java"],
8908 apex_available: ["myapex"],
8909 permitted_packages: ["a.b"],
8910 sdk_version: "none",
8911 system_modules: "none",
8912 }
8913 apex {
8914 name: "myapex",
8915 key: "myapex.key",
8916 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008917 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008918 }`,
8919 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008920 bcpPermittedPackages: map[string][]string{
8921 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008922 "foo.bar",
8923 },
8924 },
8925 },
8926 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008927 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008928 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 +01008929 bp: `
8930 java_library {
8931 name: "bcp_lib1",
8932 srcs: ["lib1/src/*.java"],
8933 apex_available: ["myapex"],
8934 permitted_packages: ["foo.bar"],
8935 sdk_version: "none",
8936 system_modules: "none",
8937 }
8938 java_library {
8939 name: "bcp_lib2",
8940 srcs: ["lib2/src/*.java"],
8941 apex_available: ["myapex"],
8942 permitted_packages: ["foo.bar", "bar.baz"],
8943 sdk_version: "none",
8944 system_modules: "none",
8945 }
8946 apex {
8947 name: "myapex",
8948 key: "myapex.key",
8949 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008950 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008951 }
8952 `,
8953 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008954 bcpPermittedPackages: map[string][]string{
8955 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008956 "foo.bar",
8957 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008958 "bcp_lib2": []string{
8959 "foo.bar",
8960 },
8961 },
8962 },
8963 {
8964 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8965 expectedError: "",
8966 bp: `
8967 java_library {
8968 name: "bcp_lib_restricted",
8969 srcs: ["lib1/src/*.java"],
8970 apex_available: ["myapex"],
8971 permitted_packages: ["foo.bar"],
8972 sdk_version: "none",
8973 min_sdk_version: "29",
8974 system_modules: "none",
8975 }
8976 java_library {
8977 name: "bcp_lib_unrestricted",
8978 srcs: ["lib2/src/*.java"],
8979 apex_available: ["myapex"],
8980 permitted_packages: ["foo.bar", "bar.baz"],
8981 sdk_version: "none",
8982 min_sdk_version: "29",
8983 system_modules: "none",
8984 }
8985 apex {
8986 name: "myapex",
8987 key: "myapex.key",
8988 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8989 updatable: true,
8990 min_sdk_version: "29",
8991 }
8992 `,
8993 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8994 bcpPermittedPackages: map[string][]string{
8995 "bcp_lib1_non_updateable": []string{
8996 "foo.bar",
8997 },
8998 // 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 +01008999 },
9000 },
9001 }
9002 for _, tc := range testcases {
9003 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00009004 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9005 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009006 })
9007 }
9008}
9009
Jiyong Park62304bb2020-04-13 16:19:48 +09009010func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009011 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09009012 apex {
9013 name: "myapex",
9014 key: "myapex.key",
9015 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009016 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09009017 }
9018
9019 apex_key {
9020 name: "myapex.key",
9021 public_key: "testkey.avbpubkey",
9022 private_key: "testkey.pem",
9023 }
9024
9025 cc_library {
9026 name: "mylib",
9027 srcs: ["mylib.cpp"],
9028 system_shared_libs: [],
9029 stl: "none",
9030 stubs: {
9031 versions: ["1"],
9032 },
9033 apex_available: ["myapex"],
9034 }
9035
9036 cc_library {
9037 name: "myprivlib",
9038 srcs: ["mylib.cpp"],
9039 system_shared_libs: [],
9040 stl: "none",
9041 apex_available: ["myapex"],
9042 }
9043
9044
9045 cc_test {
9046 name: "mytest",
9047 gtest: false,
9048 srcs: ["mylib.cpp"],
9049 system_shared_libs: [],
9050 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09009051 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09009052 test_for: ["myapex"]
9053 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009054
9055 cc_library {
9056 name: "mytestlib",
9057 srcs: ["mylib.cpp"],
9058 system_shared_libs: [],
9059 shared_libs: ["mylib", "myprivlib"],
9060 stl: "none",
9061 test_for: ["myapex"],
9062 }
9063
9064 cc_benchmark {
9065 name: "mybench",
9066 srcs: ["mylib.cpp"],
9067 system_shared_libs: [],
9068 shared_libs: ["mylib", "myprivlib"],
9069 stl: "none",
9070 test_for: ["myapex"],
9071 }
Jiyong Park62304bb2020-04-13 16:19:48 +09009072 `)
9073
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009074 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009075 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009076 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9077 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9078 }
9079
9080 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09009081 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009082 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9083 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9084 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
9085}
Jiyong Park46a512f2020-12-04 18:02:13 +09009086
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009087func TestIndirectTestFor(t *testing.T) {
9088 ctx := testApex(t, `
9089 apex {
9090 name: "myapex",
9091 key: "myapex.key",
9092 native_shared_libs: ["mylib", "myprivlib"],
9093 updatable: false,
9094 }
Jiyong Park46a512f2020-12-04 18:02:13 +09009095
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009096 apex_key {
9097 name: "myapex.key",
9098 public_key: "testkey.avbpubkey",
9099 private_key: "testkey.pem",
9100 }
9101
9102 cc_library {
9103 name: "mylib",
9104 srcs: ["mylib.cpp"],
9105 system_shared_libs: [],
9106 stl: "none",
9107 stubs: {
9108 versions: ["1"],
9109 },
9110 apex_available: ["myapex"],
9111 }
9112
9113 cc_library {
9114 name: "myprivlib",
9115 srcs: ["mylib.cpp"],
9116 system_shared_libs: [],
9117 stl: "none",
9118 shared_libs: ["mylib"],
9119 apex_available: ["myapex"],
9120 }
9121
9122 cc_library {
9123 name: "mytestlib",
9124 srcs: ["mylib.cpp"],
9125 system_shared_libs: [],
9126 shared_libs: ["myprivlib"],
9127 stl: "none",
9128 test_for: ["myapex"],
9129 }
9130 `)
9131
9132 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009133 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009134 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9135 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9136 }
9137
9138 // The platform variant of mytestlib links to the platform variant of the
9139 // internal myprivlib.
9140 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9141
9142 // The platform variant of myprivlib links to the platform variant of mylib
9143 // and bypasses its stubs.
9144 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 +09009145}
9146
Martin Stjernholmec009002021-03-27 15:18:31 +00009147func TestTestForForLibInOtherApex(t *testing.T) {
9148 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9149 _ = testApex(t, `
9150 apex {
9151 name: "com.android.art",
9152 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009153 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009154 updatable: false,
9155 }
9156
9157 apex {
9158 name: "com.android.art.debug",
9159 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009160 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009161 updatable: false,
9162 }
9163
9164 apex_key {
9165 name: "myapex.key",
9166 public_key: "testkey.avbpubkey",
9167 private_key: "testkey.pem",
9168 }
9169
9170 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009171 name: "libnativebridge",
9172 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009173 system_shared_libs: [],
9174 stl: "none",
9175 stubs: {
9176 versions: ["1"],
9177 },
9178 apex_available: ["com.android.art", "com.android.art.debug"],
9179 }
9180
9181 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009182 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009183 srcs: ["mylib.cpp"],
9184 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009185 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009186 stl: "none",
9187 apex_available: ["com.android.art.debug"],
9188 test_for: ["com.android.art"],
9189 }
9190 `,
9191 android.MockFS{
9192 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9193 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9194 }.AddToFixture())
9195}
9196
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009197// TODO(jungjw): Move this to proptools
9198func intPtr(i int) *int {
9199 return &i
9200}
9201
9202func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009203 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009204 apex_set {
9205 name: "myapex",
9206 set: "myapex.apks",
9207 filename: "foo_v2.apex",
9208 overrides: ["foo"],
9209 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009210 `,
9211 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9212 variables.Platform_sdk_version = intPtr(30)
9213 }),
9214 android.FixtureModifyConfig(func(config android.Config) {
9215 config.Targets[android.Android] = []android.Target{
9216 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9217 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9218 }
9219 }),
9220 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009221
Spandan Das3576e762024-01-03 18:57:03 +00009222 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009223
9224 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009225 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009226 actual := extractedApex.Args["abis"]
9227 expected := "ARMEABI_V7A,ARM64_V8A"
9228 if actual != expected {
9229 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9230 }
9231 actual = extractedApex.Args["sdk-version"]
9232 expected = "30"
9233 if actual != expected {
9234 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9235 }
9236
Paul Duffin6717d882021-06-15 19:09:41 +01009237 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009238 a := m.Module().(*ApexSet)
9239 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009240 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009241 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9242 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9243 }
9244}
9245
Anton Hansson805e0a52022-11-25 14:06:46 +00009246func TestApexSet_NativeBridge(t *testing.T) {
9247 ctx := testApex(t, `
9248 apex_set {
9249 name: "myapex",
9250 set: "myapex.apks",
9251 filename: "foo_v2.apex",
9252 overrides: ["foo"],
9253 }
9254 `,
9255 android.FixtureModifyConfig(func(config android.Config) {
9256 config.Targets[android.Android] = []android.Target{
9257 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9258 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9259 }
9260 }),
9261 )
9262
Spandan Das3576e762024-01-03 18:57:03 +00009263 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009264
9265 // Check extract_apks tool parameters. No native bridge arch expected
9266 extractedApex := m.Output("extracted/myapex.apks")
9267 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9268}
9269
Jiyong Park7d95a512020-05-10 15:16:24 +09009270func TestNoStaticLinkingToStubsLib(t *testing.T) {
9271 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9272 apex {
9273 name: "myapex",
9274 key: "myapex.key",
9275 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009276 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009277 }
9278
9279 apex_key {
9280 name: "myapex.key",
9281 public_key: "testkey.avbpubkey",
9282 private_key: "testkey.pem",
9283 }
9284
9285 cc_library {
9286 name: "mylib",
9287 srcs: ["mylib.cpp"],
9288 static_libs: ["otherlib"],
9289 system_shared_libs: [],
9290 stl: "none",
9291 apex_available: [ "myapex" ],
9292 }
9293
9294 cc_library {
9295 name: "otherlib",
9296 srcs: ["mylib.cpp"],
9297 system_shared_libs: [],
9298 stl: "none",
9299 stubs: {
9300 versions: ["1", "2", "3"],
9301 },
9302 apex_available: [ "myapex" ],
9303 }
9304 `)
9305}
9306
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009307func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009308 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009309 apex {
9310 name: "myapex",
9311 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009312 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009313 custom_sign_tool: "sign_myapex",
9314 }
9315
9316 apex_key {
9317 name: "myapex.key",
9318 public_key: "testkey.avbpubkey",
9319 private_key: "testkey.pem",
9320 }
9321 `)
9322
Jooyung Han286957d2023-10-30 16:17:56 +09009323 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009324 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009325 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 +09009326}
9327
9328func TestApexKeysTxtOverrides(t *testing.T) {
9329 ctx := testApex(t, `
9330 apex {
9331 name: "myapex",
9332 key: "myapex.key",
9333 updatable: false,
9334 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009335 }
9336
9337 apex_key {
9338 name: "myapex.key",
9339 public_key: "testkey.avbpubkey",
9340 private_key: "testkey.pem",
9341 }
9342
9343 prebuilt_apex {
9344 name: "myapex",
9345 prefer: true,
9346 arch: {
9347 arm64: {
9348 src: "myapex-arm64.apex",
9349 },
9350 arm: {
9351 src: "myapex-arm.apex",
9352 },
9353 },
9354 }
9355
9356 apex_set {
9357 name: "myapex_set",
9358 set: "myapex.apks",
9359 filename: "myapex_set.apex",
9360 overrides: ["myapex"],
9361 }
9362 `)
9363
Colin Crossf61d03d2023-11-02 16:56:39 -07009364 content := android.ContentFromFileRuleForTests(t, ctx,
9365 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009366 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 -07009367 content = android.ContentFromFileRuleForTests(t, ctx,
9368 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009369 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 +09009370}
9371
Jooyung Han938b5932020-06-20 12:47:47 +09009372func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009373 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009374 apex {
9375 name: "myapex",
9376 key: "myapex.key",
9377 apps: ["app"],
9378 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009379 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009380 }
9381
9382 apex_key {
9383 name: "myapex.key",
9384 public_key: "testkey.avbpubkey",
9385 private_key: "testkey.pem",
9386 }
9387
9388 android_app {
9389 name: "app",
9390 srcs: ["foo/bar/MyClass.java"],
9391 package_name: "foo",
9392 sdk_version: "none",
9393 system_modules: "none",
9394 apex_available: [ "myapex" ],
9395 }
9396 `, withFiles(map[string][]byte{
9397 "sub/Android.bp": []byte(`
9398 override_apex {
9399 name: "override_myapex",
9400 base: "myapex",
9401 apps: ["override_app"],
9402 allowed_files: ":allowed",
9403 }
9404 // Overridable "path" property should be referenced indirectly
9405 filegroup {
9406 name: "allowed",
9407 srcs: ["allowed.txt"],
9408 }
9409 override_android_app {
9410 name: "override_app",
9411 base: "app",
9412 package_name: "bar",
9413 }
9414 `),
9415 }))
9416
Jooyung Hana0503a52023-08-23 13:12:50 +09009417 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009418 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9419 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9420 }
9421
Jooyung Hana0503a52023-08-23 13:12:50 +09009422 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009423 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9424 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9425 }
9426}
9427
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009428func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009429 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009430 apex {
9431 name: "myapex",
9432 key: "myapex.key",
9433 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009434 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009435 }
9436
9437 apex_key {
9438 name: "myapex.key",
9439 public_key: "testkey.avbpubkey",
9440 private_key: "testkey.pem",
9441 }
9442
9443 cc_library {
9444 name: "mylib",
9445 srcs: ["mylib.cpp"],
9446 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009447 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009448 },
9449 apex_available: ["myapex"],
9450 }
9451
9452 cc_prebuilt_library_shared {
9453 name: "mylib",
9454 prefer: false,
9455 srcs: ["prebuilt.so"],
9456 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009457 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009458 },
9459 apex_available: ["myapex"],
9460 }
9461 `)
9462}
9463
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009464func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009465 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009466 apex {
9467 name: "myapex",
9468 key: "myapex.key",
9469 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009470 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009471 }
9472 apex_key {
9473 name: "myapex.key",
9474 public_key: "testkey.avbpubkey",
9475 private_key: "testkey.pem",
9476 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009477 `,
9478 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9479 variables.CompressedApex = proptools.BoolPtr(true)
9480 }),
9481 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009482
Jooyung Hana0503a52023-08-23 13:12:50 +09009483 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009484 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9485
Jooyung Hana0503a52023-08-23 13:12:50 +09009486 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009487 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9488
9489 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009490 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009491 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9492
9493 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009494 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009495 var builder strings.Builder
9496 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9497 androidMk := builder.String()
9498 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9499}
9500
Martin Stjernholm2856c662020-12-02 15:03:42 +00009501func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009502 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009503 apex {
9504 name: "myapex",
9505 key: "myapex.key",
9506 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009507 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009508 }
9509
9510 apex_key {
9511 name: "myapex.key",
9512 public_key: "testkey.avbpubkey",
9513 private_key: "testkey.pem",
9514 }
9515
9516 cc_library {
9517 name: "mylib",
9518 srcs: ["mylib.cpp"],
9519 apex_available: ["myapex"],
9520 shared_libs: ["otherlib"],
9521 system_shared_libs: [],
9522 }
9523
9524 cc_library {
9525 name: "otherlib",
9526 srcs: ["mylib.cpp"],
9527 stubs: {
9528 versions: ["current"],
9529 },
9530 }
9531
9532 cc_prebuilt_library_shared {
9533 name: "otherlib",
9534 prefer: true,
9535 srcs: ["prebuilt.so"],
9536 stubs: {
9537 versions: ["current"],
9538 },
9539 }
9540 `)
9541
Jooyung Hana0503a52023-08-23 13:12:50 +09009542 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009543 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009544 var builder strings.Builder
9545 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9546 androidMk := builder.String()
9547
9548 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9549 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009550 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009551}
9552
Jiyong Parke3867542020-12-03 17:28:25 +09009553func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009554 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009555 apex {
9556 name: "myapex",
9557 key: "myapex.key",
9558 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009559 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009560 }
9561
9562 apex_key {
9563 name: "myapex.key",
9564 public_key: "testkey.avbpubkey",
9565 private_key: "testkey.pem",
9566 }
9567
9568 cc_library {
9569 name: "mylib",
9570 srcs: ["mylib.cpp"],
9571 system_shared_libs: [],
9572 stl: "none",
9573 apex_available: ["myapex"],
9574 shared_libs: ["mylib2"],
9575 target: {
9576 apex: {
9577 exclude_shared_libs: ["mylib2"],
9578 },
9579 },
9580 }
9581
9582 cc_library {
9583 name: "mylib2",
9584 srcs: ["mylib.cpp"],
9585 system_shared_libs: [],
9586 stl: "none",
9587 }
9588 `)
9589
9590 // Check if mylib is linked to mylib2 for the non-apex target
9591 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9592 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9593
9594 // Make sure that the link doesn't occur for the apex target
9595 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9596 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9597
9598 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009599 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009600 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9601}
9602
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009603func TestPrebuiltStubLibDep(t *testing.T) {
9604 bpBase := `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009609 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009610 }
9611 apex_key {
9612 name: "myapex.key",
9613 public_key: "testkey.avbpubkey",
9614 private_key: "testkey.pem",
9615 }
9616 cc_library {
9617 name: "mylib",
9618 srcs: ["mylib.cpp"],
9619 apex_available: ["myapex"],
9620 shared_libs: ["stublib"],
9621 system_shared_libs: [],
9622 }
9623 apex {
9624 name: "otherapex",
9625 enabled: %s,
9626 key: "myapex.key",
9627 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009628 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009629 }
9630 `
9631
9632 stublibSourceBp := `
9633 cc_library {
9634 name: "stublib",
9635 srcs: ["mylib.cpp"],
9636 apex_available: ["otherapex"],
9637 system_shared_libs: [],
9638 stl: "none",
9639 stubs: {
9640 versions: ["1"],
9641 },
9642 }
9643 `
9644
9645 stublibPrebuiltBp := `
9646 cc_prebuilt_library_shared {
9647 name: "stublib",
9648 srcs: ["prebuilt.so"],
9649 apex_available: ["otherapex"],
9650 stubs: {
9651 versions: ["1"],
9652 },
9653 %s
9654 }
9655 `
9656
9657 tests := []struct {
9658 name string
9659 stublibBp string
9660 usePrebuilt bool
9661 modNames []string // Modules to collect AndroidMkEntries for
9662 otherApexEnabled []string
9663 }{
9664 {
9665 name: "only_source",
9666 stublibBp: stublibSourceBp,
9667 usePrebuilt: false,
9668 modNames: []string{"stublib"},
9669 otherApexEnabled: []string{"true", "false"},
9670 },
9671 {
9672 name: "source_preferred",
9673 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9674 usePrebuilt: false,
9675 modNames: []string{"stublib", "prebuilt_stublib"},
9676 otherApexEnabled: []string{"true", "false"},
9677 },
9678 {
9679 name: "prebuilt_preferred",
9680 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9681 usePrebuilt: true,
9682 modNames: []string{"stublib", "prebuilt_stublib"},
9683 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9684 },
9685 {
9686 name: "only_prebuilt",
9687 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9688 usePrebuilt: true,
9689 modNames: []string{"stublib"},
9690 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9691 },
9692 }
9693
9694 for _, test := range tests {
9695 t.Run(test.name, func(t *testing.T) {
9696 for _, otherApexEnabled := range test.otherApexEnabled {
9697 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009698 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009699
9700 type modAndMkEntries struct {
9701 mod *cc.Module
9702 mkEntries android.AndroidMkEntries
9703 }
9704 entries := []*modAndMkEntries{}
9705
9706 // Gather shared lib modules that are installable
9707 for _, modName := range test.modNames {
9708 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9709 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9710 continue
9711 }
9712 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009713 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009714 continue
9715 }
Colin Crossaa255532020-07-03 13:18:24 -07009716 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009717 if ent.Disabled {
9718 continue
9719 }
9720 entries = append(entries, &modAndMkEntries{
9721 mod: mod,
9722 mkEntries: ent,
9723 })
9724 }
9725 }
9726 }
9727
9728 var entry *modAndMkEntries = nil
9729 for _, ent := range entries {
9730 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9731 if entry != nil {
9732 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9733 } else {
9734 entry = ent
9735 }
9736 }
9737 }
9738
9739 if entry == nil {
9740 t.Errorf("AndroidMk entry for \"stublib\" missing")
9741 } else {
9742 isPrebuilt := entry.mod.Prebuilt() != nil
9743 if isPrebuilt != test.usePrebuilt {
9744 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9745 }
9746 if !entry.mod.IsStubs() {
9747 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9748 }
9749 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9750 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9751 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009752 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009753 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009754 if !android.InList(expected, cflags) {
9755 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9756 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009757 }
9758 })
9759 }
9760 })
9761 }
9762}
9763
Colin Crossc33e5212021-05-25 18:16:02 -07009764func TestApexJavaCoverage(t *testing.T) {
9765 bp := `
9766 apex {
9767 name: "myapex",
9768 key: "myapex.key",
9769 java_libs: ["mylib"],
9770 bootclasspath_fragments: ["mybootclasspathfragment"],
9771 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9772 updatable: false,
9773 }
9774
9775 apex_key {
9776 name: "myapex.key",
9777 public_key: "testkey.avbpubkey",
9778 private_key: "testkey.pem",
9779 }
9780
9781 java_library {
9782 name: "mylib",
9783 srcs: ["mylib.java"],
9784 apex_available: ["myapex"],
9785 compile_dex: true,
9786 }
9787
9788 bootclasspath_fragment {
9789 name: "mybootclasspathfragment",
9790 contents: ["mybootclasspathlib"],
9791 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009792 hidden_api: {
9793 split_packages: ["*"],
9794 },
Colin Crossc33e5212021-05-25 18:16:02 -07009795 }
9796
9797 java_library {
9798 name: "mybootclasspathlib",
9799 srcs: ["mybootclasspathlib.java"],
9800 apex_available: ["myapex"],
9801 compile_dex: true,
9802 }
9803
9804 systemserverclasspath_fragment {
9805 name: "mysystemserverclasspathfragment",
9806 contents: ["mysystemserverclasspathlib"],
9807 apex_available: ["myapex"],
9808 }
9809
9810 java_library {
9811 name: "mysystemserverclasspathlib",
9812 srcs: ["mysystemserverclasspathlib.java"],
9813 apex_available: ["myapex"],
9814 compile_dex: true,
9815 }
9816 `
9817
9818 result := android.GroupFixturePreparers(
9819 PrepareForTestWithApexBuildComponents,
9820 prepareForTestWithMyapex,
9821 java.PrepareForTestWithJavaDefaultModules,
9822 android.PrepareForTestWithAndroidBuildComponents,
9823 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009824 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9825 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009826 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009827 ).RunTest(t)
9828
9829 // Make sure jacoco ran on both mylib and mybootclasspathlib
9830 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9831 t.Errorf("Failed to find jacoco rule for mylib")
9832 }
9833 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9834 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9835 }
9836 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9837 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9838 }
9839}
9840
Jiyong Park192600a2021-08-03 07:52:17 +00009841func TestProhibitStaticExecutable(t *testing.T) {
9842 testApexError(t, `executable mybin is static`, `
9843 apex {
9844 name: "myapex",
9845 key: "myapex.key",
9846 binaries: ["mybin"],
9847 min_sdk_version: "29",
9848 }
9849
9850 apex_key {
9851 name: "myapex.key",
9852 public_key: "testkey.avbpubkey",
9853 private_key: "testkey.pem",
9854 }
9855
9856 cc_binary {
9857 name: "mybin",
9858 srcs: ["mylib.cpp"],
9859 relative_install_path: "foo/bar",
9860 static_executable: true,
9861 system_shared_libs: [],
9862 stl: "none",
9863 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009864 min_sdk_version: "29",
9865 }
9866 `)
9867
9868 testApexError(t, `executable mybin.rust is static`, `
9869 apex {
9870 name: "myapex",
9871 key: "myapex.key",
9872 binaries: ["mybin.rust"],
9873 min_sdk_version: "29",
9874 }
9875
9876 apex_key {
9877 name: "myapex.key",
9878 public_key: "testkey.avbpubkey",
9879 private_key: "testkey.pem",
9880 }
9881
9882 rust_binary {
9883 name: "mybin.rust",
9884 srcs: ["foo.rs"],
9885 static_executable: true,
9886 apex_available: ["myapex"],
9887 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009888 }
9889 `)
9890}
9891
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009892func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9893 ctx := testApex(t, `
9894 apex {
9895 name: "myapex",
9896 key: "myapex.key",
9897 updatable: false,
9898 java_libs: ["foo"],
9899 }
9900
9901 apex_key {
9902 name: "myapex.key",
9903 public_key: "testkey.avbpubkey",
9904 private_key: "testkey.pem",
9905 }
9906
9907 java_library {
9908 name: "foo",
9909 srcs: ["foo.java"],
9910 apex_available: ["myapex"],
9911 installable: true,
9912 }
9913 `,
9914 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9915 )
9916
Jooyung Hana0503a52023-08-23 13:12:50 +09009917 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009918 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9919 var builder strings.Builder
9920 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9921 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009922 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 +00009923}
9924
9925func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9926 ctx := testApex(t, `
9927 prebuilt_apex {
9928 name: "myapex",
9929 arch: {
9930 arm64: {
9931 src: "myapex-arm64.apex",
9932 },
9933 arm: {
9934 src: "myapex-arm.apex",
9935 },
9936 },
9937 exported_java_libs: ["foo"],
9938 }
9939
9940 java_import {
9941 name: "foo",
9942 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009943 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009944 }
9945 `,
9946 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9947 )
9948
9949 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9950 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9951 mainModuleEntries := entriesList[0]
9952 android.AssertArrayString(t,
9953 "LOCAL_REQUIRED_MODULES",
9954 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9955 []string{
9956 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9957 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9958 })
9959}
9960
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009961func TestAndroidMk_RequiredModules(t *testing.T) {
9962 ctx := testApex(t, `
9963 apex {
9964 name: "myapex",
9965 key: "myapex.key",
9966 updatable: false,
9967 java_libs: ["foo"],
9968 required: ["otherapex"],
9969 }
9970
9971 apex {
9972 name: "otherapex",
9973 key: "myapex.key",
9974 updatable: false,
9975 java_libs: ["foo"],
9976 required: ["otherapex"],
9977 }
9978
9979 apex_key {
9980 name: "myapex.key",
9981 public_key: "testkey.avbpubkey",
9982 private_key: "testkey.pem",
9983 }
9984
9985 java_library {
9986 name: "foo",
9987 srcs: ["foo.java"],
9988 apex_available: ["myapex", "otherapex"],
9989 installable: true,
9990 }
9991 `)
9992
Jooyung Hana0503a52023-08-23 13:12:50 +09009993 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009994 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9995 var builder strings.Builder
9996 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9997 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009998 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009999}
10000
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010001func TestAndroidMk_RequiredDeps(t *testing.T) {
10002 ctx := testApex(t, `
10003 apex {
10004 name: "myapex",
10005 key: "myapex.key",
10006 updatable: false,
10007 }
10008
10009 apex_key {
10010 name: "myapex.key",
10011 public_key: "testkey.avbpubkey",
10012 private_key: "testkey.pem",
10013 }
10014 `)
10015
Jooyung Hana0503a52023-08-23 13:12:50 +090010016 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +000010017 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010018 data := android.AndroidMkDataForTest(t, ctx, bundle)
10019 var builder strings.Builder
10020 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
10021 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +090010022 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +000010023}
10024
Jooyung Hana6d36672022-02-24 13:58:07 +090010025func TestApexOutputFileProducer(t *testing.T) {
10026 for _, tc := range []struct {
10027 name string
10028 ref string
10029 expected_data []string
10030 }{
10031 {
10032 name: "test_using_output",
10033 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +090010034 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010035 },
10036 {
10037 name: "test_using_apex",
10038 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +090010039 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +090010040 },
10041 } {
10042 t.Run(tc.name, func(t *testing.T) {
10043 ctx := testApex(t, `
10044 apex {
10045 name: "myapex",
10046 key: "myapex.key",
10047 compressible: true,
10048 updatable: false,
10049 }
10050
10051 apex_key {
10052 name: "myapex.key",
10053 public_key: "testkey.avbpubkey",
10054 private_key: "testkey.pem",
10055 }
10056
10057 java_test {
10058 name: "`+tc.name+`",
10059 srcs: ["a.java"],
10060 data: ["`+tc.ref+`"],
10061 }
10062 `,
10063 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
10064 variables.CompressedApex = proptools.BoolPtr(true)
10065 }))
10066 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
10067 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
10068 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
10069 })
10070 }
10071}
10072
satayev758968a2021-12-06 11:42:40 +000010073func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
10074 preparer := android.GroupFixturePreparers(
10075 PrepareForTestWithApexBuildComponents,
10076 prepareForTestWithMyapex,
10077 java.PrepareForTestWithJavaSdkLibraryFiles,
10078 java.PrepareForTestWithJavaDefaultModules,
10079 android.PrepareForTestWithAndroidBuildComponents,
10080 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10081 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10082 )
10083
10084 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10085 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10086 preparer.RunTestWithBp(t, `
10087 apex {
10088 name: "myapex",
10089 key: "myapex.key",
10090 bootclasspath_fragments: ["mybootclasspathfragment"],
10091 min_sdk_version: "30",
10092 updatable: false,
10093 }
10094
10095 apex_key {
10096 name: "myapex.key",
10097 public_key: "testkey.avbpubkey",
10098 private_key: "testkey.pem",
10099 }
10100
10101 bootclasspath_fragment {
10102 name: "mybootclasspathfragment",
10103 contents: ["mybootclasspathlib"],
10104 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010105 hidden_api: {
10106 split_packages: ["*"],
10107 },
satayev758968a2021-12-06 11:42:40 +000010108 }
10109
10110 java_sdk_library {
10111 name: "mybootclasspathlib",
10112 srcs: ["mybootclasspathlib.java"],
10113 apex_available: ["myapex"],
10114 compile_dex: true,
10115 unsafe_ignore_missing_latest_api: true,
10116 min_sdk_version: "31",
10117 static_libs: ["util"],
10118 }
10119
10120 java_library {
10121 name: "util",
10122 srcs: ["a.java"],
10123 apex_available: ["myapex"],
10124 min_sdk_version: "31",
10125 static_libs: ["another_util"],
10126 }
10127
10128 java_library {
10129 name: "another_util",
10130 srcs: ["a.java"],
10131 min_sdk_version: "31",
10132 apex_available: ["myapex"],
10133 }
10134 `)
10135 })
10136
10137 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10138 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10139 preparer.RunTestWithBp(t, `
10140 apex {
10141 name: "myapex",
10142 key: "myapex.key",
10143 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10144 min_sdk_version: "30",
10145 updatable: false,
10146 }
10147
10148 apex_key {
10149 name: "myapex.key",
10150 public_key: "testkey.avbpubkey",
10151 private_key: "testkey.pem",
10152 }
10153
10154 systemserverclasspath_fragment {
10155 name: "mysystemserverclasspathfragment",
10156 contents: ["mysystemserverclasspathlib"],
10157 apex_available: ["myapex"],
10158 }
10159
10160 java_sdk_library {
10161 name: "mysystemserverclasspathlib",
10162 srcs: ["mysystemserverclasspathlib.java"],
10163 apex_available: ["myapex"],
10164 compile_dex: true,
10165 min_sdk_version: "32",
10166 unsafe_ignore_missing_latest_api: true,
10167 static_libs: ["util"],
10168 }
10169
10170 java_library {
10171 name: "util",
10172 srcs: ["a.java"],
10173 apex_available: ["myapex"],
10174 min_sdk_version: "31",
10175 static_libs: ["another_util"],
10176 }
10177
10178 java_library {
10179 name: "another_util",
10180 srcs: ["a.java"],
10181 min_sdk_version: "31",
10182 apex_available: ["myapex"],
10183 }
10184 `)
10185 })
10186
10187 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10188 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10189 RunTestWithBp(t, `
10190 apex {
10191 name: "myapex",
10192 key: "myapex.key",
10193 bootclasspath_fragments: ["mybootclasspathfragment"],
10194 min_sdk_version: "30",
10195 updatable: false,
10196 }
10197
10198 apex_key {
10199 name: "myapex.key",
10200 public_key: "testkey.avbpubkey",
10201 private_key: "testkey.pem",
10202 }
10203
10204 bootclasspath_fragment {
10205 name: "mybootclasspathfragment",
10206 contents: ["mybootclasspathlib"],
10207 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010208 hidden_api: {
10209 split_packages: ["*"],
10210 },
satayev758968a2021-12-06 11:42:40 +000010211 }
10212
10213 java_sdk_library {
10214 name: "mybootclasspathlib",
10215 srcs: ["mybootclasspathlib.java"],
10216 apex_available: ["myapex"],
10217 compile_dex: true,
10218 unsafe_ignore_missing_latest_api: true,
10219 }
10220 `)
10221 })
10222
10223 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10224 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10225 RunTestWithBp(t, `
10226 apex {
10227 name: "myapex",
10228 key: "myapex.key",
10229 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10230 min_sdk_version: "30",
10231 updatable: false,
10232 }
10233
10234 apex_key {
10235 name: "myapex.key",
10236 public_key: "testkey.avbpubkey",
10237 private_key: "testkey.pem",
10238 }
10239
10240 systemserverclasspath_fragment {
10241 name: "mysystemserverclasspathfragment",
10242 contents: ["mysystemserverclasspathlib"],
10243 apex_available: ["myapex"],
10244 }
10245
10246 java_sdk_library {
10247 name: "mysystemserverclasspathlib",
10248 srcs: ["mysystemserverclasspathlib.java"],
10249 apex_available: ["myapex"],
10250 compile_dex: true,
10251 unsafe_ignore_missing_latest_api: true,
10252 }
10253 `)
10254 })
10255}
10256
Jiakai Zhang6decef92022-01-12 17:56:19 +000010257// Verifies that the APEX depends on all the Make modules in the list.
10258func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10259 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10260 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010261 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010262 }
10263}
10264
10265// Verifies that the APEX does not depend on any of the Make modules in the list.
10266func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10267 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10268 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010269 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010270 }
10271}
10272
Cole Faust1021ccd2023-02-26 21:15:25 -080010273// TODO(b/193460475): Re-enable this test
10274//func TestApexStrictUpdtabilityLint(t *testing.T) {
10275// bpTemplate := `
10276// apex {
10277// name: "myapex",
10278// key: "myapex.key",
10279// java_libs: ["myjavalib"],
10280// updatable: %v,
10281// min_sdk_version: "29",
10282// }
10283// apex_key {
10284// name: "myapex.key",
10285// }
10286// java_library {
10287// name: "myjavalib",
10288// srcs: ["MyClass.java"],
10289// apex_available: [ "myapex" ],
10290// lint: {
10291// strict_updatability_linting: %v,
10292// },
10293// sdk_version: "current",
10294// min_sdk_version: "29",
10295// }
10296// `
10297// fs := android.MockFS{
10298// "lint-baseline.xml": nil,
10299// }
10300//
10301// testCases := []struct {
10302// testCaseName string
10303// apexUpdatable bool
10304// javaStrictUpdtabilityLint bool
10305// lintFileExists bool
10306// disallowedFlagExpected bool
10307// }{
10308// {
10309// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10310// apexUpdatable: true,
10311// javaStrictUpdtabilityLint: true,
10312// lintFileExists: false,
10313// disallowedFlagExpected: false,
10314// },
10315// {
10316// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10317// apexUpdatable: false,
10318// javaStrictUpdtabilityLint: false,
10319// lintFileExists: true,
10320// disallowedFlagExpected: false,
10321// },
10322// {
10323// testCaseName: "non-updatable apex respects strict updatability of javalib",
10324// apexUpdatable: false,
10325// javaStrictUpdtabilityLint: true,
10326// lintFileExists: true,
10327// disallowedFlagExpected: true,
10328// },
10329// {
10330// testCaseName: "updatable apex sets strict updatability of javalib to true",
10331// apexUpdatable: true,
10332// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10333// lintFileExists: true,
10334// disallowedFlagExpected: true,
10335// },
10336// }
10337//
10338// for _, testCase := range testCases {
10339// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10340// fixtures := []android.FixturePreparer{}
10341// if testCase.lintFileExists {
10342// fixtures = append(fixtures, fs.AddToFixture())
10343// }
10344//
10345// result := testApex(t, bp, fixtures...)
10346// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10347// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10348// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10349//
10350// if disallowedFlagActual != testCase.disallowedFlagExpected {
10351// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10352// }
10353// }
10354//}
10355//
10356//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10357// bp := `
10358// apex {
10359// name: "myapex",
10360// key: "myapex.key",
10361// java_libs: ["myjavalib"],
10362// updatable: true,
10363// min_sdk_version: "29",
10364// }
10365// apex_key {
10366// name: "myapex.key",
10367// }
10368// java_library {
10369// name: "myjavalib",
10370// srcs: ["MyClass.java"],
10371// apex_available: [ "myapex" ],
10372// sdk_version: "current",
10373// min_sdk_version: "29",
10374// }
10375// `
10376//
10377// testCases := []struct {
10378// testCaseName string
10379// moduleDirectory string
10380// disallowedFlagExpected bool
10381// }{
10382// {
10383// testCaseName: "lintable module defined outside libcore",
10384// moduleDirectory: "",
10385// disallowedFlagExpected: true,
10386// },
10387// {
10388// testCaseName: "lintable module defined in libcore root directory",
10389// moduleDirectory: "libcore/",
10390// disallowedFlagExpected: false,
10391// },
10392// {
10393// testCaseName: "lintable module defined in libcore child directory",
10394// moduleDirectory: "libcore/childdir/",
10395// disallowedFlagExpected: true,
10396// },
10397// }
10398//
10399// for _, testCase := range testCases {
10400// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10401// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10402// result := testApex(t, "", lintFileCreator, bpFileCreator)
10403// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10404// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10405// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10406// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10407//
10408// if disallowedFlagActual != testCase.disallowedFlagExpected {
10409// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10410// }
10411// }
10412//}
10413//
10414//// checks transtive deps of an apex coming from bootclasspath_fragment
10415//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10416// bp := `
10417// apex {
10418// name: "myapex",
10419// key: "myapex.key",
10420// bootclasspath_fragments: ["mybootclasspathfragment"],
10421// updatable: true,
10422// min_sdk_version: "29",
10423// }
10424// apex_key {
10425// name: "myapex.key",
10426// }
10427// bootclasspath_fragment {
10428// name: "mybootclasspathfragment",
10429// contents: ["myjavalib"],
10430// apex_available: ["myapex"],
10431// hidden_api: {
10432// split_packages: ["*"],
10433// },
10434// }
10435// java_library {
10436// name: "myjavalib",
10437// srcs: ["MyClass.java"],
10438// apex_available: [ "myapex" ],
10439// sdk_version: "current",
10440// min_sdk_version: "29",
10441// compile_dex: true,
10442// }
10443// `
10444// fs := android.MockFS{
10445// "lint-baseline.xml": nil,
10446// }
10447//
10448// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10449// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10450// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10451// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10452// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10453// }
10454//}
Spandan Das66773252022-01-15 00:23:18 +000010455
Spandan Das42e89502022-05-06 22:12:55 +000010456// updatable apexes should propagate updatable=true to its apps
10457func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10458 bp := `
10459 apex {
10460 name: "myapex",
10461 key: "myapex.key",
10462 updatable: %v,
10463 apps: [
10464 "myapp",
10465 ],
10466 min_sdk_version: "30",
10467 }
10468 apex_key {
10469 name: "myapex.key",
10470 }
10471 android_app {
10472 name: "myapp",
10473 updatable: %v,
10474 apex_available: [
10475 "myapex",
10476 ],
10477 sdk_version: "current",
10478 min_sdk_version: "30",
10479 }
10480 `
10481 testCases := []struct {
10482 name string
10483 apex_is_updatable_bp bool
10484 app_is_updatable_bp bool
10485 app_is_updatable_expected bool
10486 }{
10487 {
10488 name: "Non-updatable apex respects updatable property of non-updatable app",
10489 apex_is_updatable_bp: false,
10490 app_is_updatable_bp: false,
10491 app_is_updatable_expected: false,
10492 },
10493 {
10494 name: "Non-updatable apex respects updatable property of updatable app",
10495 apex_is_updatable_bp: false,
10496 app_is_updatable_bp: true,
10497 app_is_updatable_expected: true,
10498 },
10499 {
10500 name: "Updatable apex respects updatable property of updatable app",
10501 apex_is_updatable_bp: true,
10502 app_is_updatable_bp: true,
10503 app_is_updatable_expected: true,
10504 },
10505 {
10506 name: "Updatable apex sets updatable=true on non-updatable app",
10507 apex_is_updatable_bp: true,
10508 app_is_updatable_bp: false,
10509 app_is_updatable_expected: true,
10510 },
10511 }
10512 for _, testCase := range testCases {
10513 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10514 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10515 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10516 }
10517}
10518
Kiyoung Kim487689e2022-07-26 09:48:22 +090010519func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10520 bp := `
10521 apex {
10522 name: "myapex",
10523 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010524 native_shared_libs: ["libbaz"],
10525 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010526 min_sdk_version: "29",
10527 }
10528 apex_key {
10529 name: "myapex.key",
10530 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010531 cc_binary {
10532 name: "binfoo",
10533 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010534 apex_available: ["myapex"],
10535 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010536 recovery_available: false,
10537 }
10538 cc_library {
10539 name: "libbar",
10540 srcs: ["libbar.cc"],
10541 stubs: {
10542 symbol_file: "libbar.map.txt",
10543 versions: [
10544 "29",
10545 ],
10546 },
10547 }
10548 cc_library {
10549 name: "libbaz",
10550 srcs: ["libbaz.cc"],
10551 apex_available: ["myapex"],
10552 min_sdk_version: "29",
10553 stubs: {
10554 symbol_file: "libbaz.map.txt",
10555 versions: [
10556 "29",
10557 ],
10558 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010559 }
10560 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010561 name: "libbar",
10562 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010563 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010564 variants: ["apex.29"],
10565 }
10566 cc_api_variant {
10567 name: "libbar",
10568 variant: "apex",
10569 version: "29",
10570 src: "libbar_apex_29.so",
10571 }
10572 cc_api_library {
10573 name: "libbaz",
10574 src: "libbaz_stub.so",
10575 min_sdk_version: "29",
10576 variants: ["apex.29"],
10577 }
10578 cc_api_variant {
10579 name: "libbaz",
10580 variant: "apex",
10581 version: "29",
10582 src: "libbaz_apex_29.so",
10583 }
10584 cc_api_library {
10585 name: "libqux",
10586 src: "libqux_stub.so",
10587 min_sdk_version: "29",
10588 variants: ["apex.29"],
10589 }
10590 cc_api_variant {
10591 name: "libqux",
10592 variant: "apex",
10593 version: "29",
10594 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010595 }
10596 api_imports {
10597 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010598 apex_shared_libs: [
10599 "libbar",
10600 "libbaz",
10601 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010602 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010603 }
10604 `
10605 result := testApex(t, bp)
10606
10607 hasDep := func(m android.Module, wantDep android.Module) bool {
10608 t.Helper()
10609 var found bool
10610 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10611 if dep == wantDep {
10612 found = true
10613 }
10614 })
10615 return found
10616 }
10617
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010618 // Library defines stubs and cc_api_library should be used with cc_api_library
10619 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10620 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10621 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010622
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010623 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10624 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010625
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010626 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10627 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10628 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10629 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10630
10631 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10632 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10633 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10634 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10635 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10636
10637 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10638 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10639 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10640
10641 // cc_api_library defined without original library should be linked with cc_api_library
10642 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10643 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10644 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10645}
10646
10647func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10648 bp := `
10649 apex {
10650 name: "myapex",
10651 key: "myapex.key",
10652 native_shared_libs: ["libbar"],
10653 min_sdk_version: "29",
10654 }
10655 apex_key {
10656 name: "myapex.key",
10657 }
10658 cc_binary {
10659 name: "binfoo",
10660 shared_libs: ["libbar"],
10661 recovery_available: false,
10662 }
10663 cc_library {
10664 name: "libbar",
10665 srcs: ["libbar.cc"],
10666 apex_available: ["myapex"],
10667 min_sdk_version: "29",
10668 stubs: {
10669 symbol_file: "libbar.map.txt",
10670 versions: [
10671 "29",
10672 ],
10673 },
10674 }
10675 cc_api_library {
10676 name: "libbar",
10677 src: "libbar_stub.so",
10678 variants: ["apex.29"],
10679 }
10680 cc_api_variant {
10681 name: "libbar",
10682 variant: "apex",
10683 version: "29",
10684 src: "libbar_apex_29.so",
10685 }
10686 api_imports {
10687 name: "api_imports",
10688 apex_shared_libs: [
10689 "libbar",
10690 ],
10691 }
10692 `
10693
10694 result := testApex(t, bp)
10695
10696 hasDep := func(m android.Module, wantDep android.Module) bool {
10697 t.Helper()
10698 var found bool
10699 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10700 if dep == wantDep {
10701 found = true
10702 }
10703 })
10704 return found
10705 }
10706
10707 // Library defines stubs and cc_api_library should be used with cc_api_library
10708 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10709 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10710 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10711
10712 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10713 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10714
10715 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10716 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10717 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10718 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010719}
Dennis Shend4f5d932023-01-31 20:27:21 +000010720
10721func TestTrimmedApex(t *testing.T) {
10722 bp := `
10723 apex {
10724 name: "myapex",
10725 key: "myapex.key",
10726 native_shared_libs: ["libfoo","libbaz"],
10727 min_sdk_version: "29",
10728 trim_against: "mydcla",
10729 }
10730 apex {
10731 name: "mydcla",
10732 key: "myapex.key",
10733 native_shared_libs: ["libfoo","libbar"],
10734 min_sdk_version: "29",
10735 file_contexts: ":myapex-file_contexts",
10736 dynamic_common_lib_apex: true,
10737 }
10738 apex_key {
10739 name: "myapex.key",
10740 }
10741 cc_library {
10742 name: "libfoo",
10743 shared_libs: ["libc"],
10744 apex_available: ["myapex","mydcla"],
10745 min_sdk_version: "29",
10746 }
10747 cc_library {
10748 name: "libbar",
10749 shared_libs: ["libc"],
10750 apex_available: ["myapex","mydcla"],
10751 min_sdk_version: "29",
10752 }
10753 cc_library {
10754 name: "libbaz",
10755 shared_libs: ["libc"],
10756 apex_available: ["myapex","mydcla"],
10757 min_sdk_version: "29",
10758 }
10759 cc_api_library {
10760 name: "libc",
10761 src: "libc.so",
10762 min_sdk_version: "29",
10763 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010764 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010765 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010766 }
10767 api_imports {
10768 name: "api_imports",
10769 shared_libs: [
10770 "libc",
10771 ],
10772 header_libs: [],
10773 }
10774 `
10775 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010776 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010777 apexRule := module.MaybeRule("apexRule")
10778 if apexRule.Rule == nil {
10779 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10780 }
10781
10782 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010783 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010784 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10785 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10786 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10787 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10788}
Jingwen Chendea7a642023-03-28 11:30:50 +000010789
10790func TestCannedFsConfig(t *testing.T) {
10791 ctx := testApex(t, `
10792 apex {
10793 name: "myapex",
10794 key: "myapex.key",
10795 updatable: false,
10796 }
10797
10798 apex_key {
10799 name: "myapex.key",
10800 public_key: "testkey.avbpubkey",
10801 private_key: "testkey.pem",
10802 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010803 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010804 generateFsRule := mod.Rule("generateFsConfig")
10805 cmd := generateFsRule.RuleParams.Command
10806
10807 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10808}
10809
10810func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10811 ctx := testApex(t, `
10812 apex {
10813 name: "myapex",
10814 key: "myapex.key",
10815 canned_fs_config: "my_config",
10816 updatable: false,
10817 }
10818
10819 apex_key {
10820 name: "myapex.key",
10821 public_key: "testkey.avbpubkey",
10822 private_key: "testkey.pem",
10823 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010824 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010825 generateFsRule := mod.Rule("generateFsConfig")
10826 cmd := generateFsRule.RuleParams.Command
10827
10828 // Ensure that canned_fs_config has "cat my_config" at the end
10829 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10830}
Spandan Das20fce2d2023-04-12 17:21:39 +000010831
10832func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10833 testCases := []struct {
10834 desc string
10835 hasStubs bool
10836 apexAvailable string
10837 expectedError string
10838 }{
10839 {
10840 desc: "non-stub library can have multiple apex_available",
10841 hasStubs: false,
10842 apexAvailable: `["myapex", "otherapex"]`,
10843 },
10844 {
10845 desc: "stub library should not be available to anyapex",
10846 hasStubs: true,
10847 apexAvailable: `["//apex_available:anyapex"]`,
10848 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10849 },
10850 {
10851 desc: "stub library should not be available to multiple apexes",
10852 hasStubs: true,
10853 apexAvailable: `["myapex", "otherapex"]`,
10854 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10855 },
10856 {
10857 desc: "stub library can be available to a core apex and a test apex",
10858 hasStubs: true,
10859 apexAvailable: `["myapex", "test_myapex"]`,
10860 },
10861 }
10862 bpTemplate := `
10863 cc_library {
10864 name: "libfoo",
10865 %v
10866 apex_available: %v,
10867 }
10868 apex {
10869 name: "myapex",
10870 key: "apex.key",
10871 updatable: false,
10872 native_shared_libs: ["libfoo"],
10873 }
10874 apex {
10875 name: "otherapex",
10876 key: "apex.key",
10877 updatable: false,
10878 }
10879 apex_test {
10880 name: "test_myapex",
10881 key: "apex.key",
10882 updatable: false,
10883 native_shared_libs: ["libfoo"],
10884 }
10885 apex_key {
10886 name: "apex.key",
10887 }
10888 `
10889 for _, tc := range testCases {
10890 stubs := ""
10891 if tc.hasStubs {
10892 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10893 }
10894 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10895 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10896 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10897 })
10898 if tc.expectedError == "" {
10899 testApex(t, bp, mockFsFixturePreparer)
10900 } else {
10901 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10902 }
10903 }
10904}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010905
10906func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10907 context := android.GroupFixturePreparers(
10908 android.PrepareForIntegrationTestWithAndroid,
10909 cc.PrepareForIntegrationTestWithCc,
10910 PrepareForTestWithApexBuildComponents,
10911 prepareForTestWithMyapex,
10912 filesystem.PrepareForTestWithFilesystemBuildComponents,
10913 )
10914 result := context.RunTestWithBp(t, `
10915 android_system_image {
10916 name: "myfilesystem",
10917 deps: [
10918 "libfoo",
10919 ],
10920 linker_config_src: "linker.config.json",
10921 }
10922
10923 cc_library {
10924 name: "libfoo",
10925 shared_libs: [
10926 "libbar",
10927 ],
10928 stl: "none",
10929 }
10930
10931 cc_library {
10932 name: "libbar",
10933 stl: "none",
10934 apex_available: ["myapex"],
10935 }
10936
10937 apex {
10938 name: "myapex",
10939 native_shared_libs: ["libbar"],
10940 key: "myapex.key",
10941 updatable: false,
10942 }
10943
10944 apex_key {
10945 name: "myapex.key",
10946 public_key: "testkey.avbpubkey",
10947 private_key: "testkey.pem",
10948 }
10949 `)
10950
10951 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10952 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10953 inputs.Strings(),
10954 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10955}
Yu Liueae7b362023-11-16 17:05:47 -080010956
10957var apex_default_bp = `
10958 apex_key {
10959 name: "myapex.key",
10960 public_key: "testkey.avbpubkey",
10961 private_key: "testkey.pem",
10962 }
10963
10964 filegroup {
10965 name: "myapex.manifest",
10966 srcs: ["apex_manifest.json"],
10967 }
10968
10969 filegroup {
10970 name: "myapex.androidmanifest",
10971 srcs: ["AndroidManifest.xml"],
10972 }
10973`
10974
10975func TestAconfigFilesJavaDeps(t *testing.T) {
10976 ctx := testApex(t, apex_default_bp+`
10977 apex {
10978 name: "myapex",
10979 manifest: ":myapex.manifest",
10980 androidManifest: ":myapex.androidmanifest",
10981 key: "myapex.key",
10982 java_libs: [
10983 "my_java_library_foo",
10984 "my_java_library_bar",
10985 ],
10986 updatable: false,
10987 }
10988
10989 java_library {
10990 name: "my_java_library_foo",
10991 srcs: ["foo/bar/MyClass.java"],
10992 sdk_version: "none",
10993 system_modules: "none",
10994 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010995 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010996 "myapex",
10997 ],
10998 }
10999
11000 java_library {
11001 name: "my_java_library_bar",
11002 srcs: ["foo/bar/MyClass.java"],
11003 sdk_version: "none",
11004 system_modules: "none",
11005 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011006 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011007 "myapex",
11008 ],
11009 }
11010
11011 aconfig_declarations {
11012 name: "my_aconfig_declarations_foo",
11013 package: "com.example.package",
11014 container: "myapex",
11015 srcs: ["foo.aconfig"],
11016 }
11017
11018 java_aconfig_library {
11019 name: "my_java_aconfig_library_foo",
11020 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011021 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011022 "myapex",
11023 ],
11024 }
11025
11026 aconfig_declarations {
11027 name: "my_aconfig_declarations_bar",
11028 package: "com.example.package",
11029 container: "myapex",
11030 srcs: ["bar.aconfig"],
11031 }
11032
11033 java_aconfig_library {
11034 name: "my_java_aconfig_library_bar",
11035 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011036 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011037 "myapex",
11038 ],
11039 }
11040 `)
11041
11042 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11043 s := mod.Rule("apexRule").Args["copy_commands"]
11044 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11045 if len(copyCmds) != 5 {
11046 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
11047 }
11048
11049 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11050
11051 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11052 s = " " + combineAconfigRule.Args["cache_files"]
11053 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11054 if len(aconfigArgs) != 2 {
11055 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11056 }
11057 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11058 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11059
11060 buildParams := combineAconfigRule.BuildParams
11061 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11062 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11063 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11064}
11065
11066func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
11067 ctx := testApex(t, apex_default_bp+`
11068 apex {
11069 name: "myapex",
11070 manifest: ":myapex.manifest",
11071 androidManifest: ":myapex.androidmanifest",
11072 key: "myapex.key",
11073 java_libs: [
11074 "my_java_library_foo",
11075 ],
11076 native_shared_libs: [
11077 "my_cc_library_bar",
11078 ],
11079 binaries: [
11080 "my_cc_binary_baz",
11081 ],
11082 updatable: false,
11083 }
11084
11085 java_library {
11086 name: "my_java_library_foo",
11087 srcs: ["foo/bar/MyClass.java"],
11088 sdk_version: "none",
11089 system_modules: "none",
11090 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011091 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011092 "myapex",
11093 ],
11094 }
11095
11096 cc_library {
11097 name: "my_cc_library_bar",
11098 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080011099 static_libs: [
11100 "my_cc_aconfig_library_bar",
11101 "my_cc_aconfig_library_baz",
11102 ],
Yu Liueae7b362023-11-16 17:05:47 -080011103 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011104 "myapex",
11105 ],
11106 }
11107
11108 cc_binary {
11109 name: "my_cc_binary_baz",
11110 srcs: ["foo/bar/MyClass.cc"],
11111 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080011112 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011113 "myapex",
11114 ],
11115 }
11116
11117 aconfig_declarations {
11118 name: "my_aconfig_declarations_foo",
11119 package: "com.example.package",
11120 container: "myapex",
11121 srcs: ["foo.aconfig"],
11122 }
11123
11124 java_aconfig_library {
11125 name: "my_java_aconfig_library_foo",
11126 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011127 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011128 "myapex",
11129 ],
11130 }
11131
11132 aconfig_declarations {
11133 name: "my_aconfig_declarations_bar",
11134 package: "com.example.package",
11135 container: "myapex",
11136 srcs: ["bar.aconfig"],
11137 }
11138
11139 cc_aconfig_library {
11140 name: "my_cc_aconfig_library_bar",
11141 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011142 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011143 "myapex",
11144 ],
11145 }
11146
11147 aconfig_declarations {
11148 name: "my_aconfig_declarations_baz",
11149 package: "com.example.package",
11150 container: "myapex",
11151 srcs: ["baz.aconfig"],
11152 }
11153
11154 cc_aconfig_library {
11155 name: "my_cc_aconfig_library_baz",
11156 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011157 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011158 "myapex",
11159 ],
11160 }
11161
11162 cc_library {
11163 name: "server_configurable_flags",
11164 srcs: ["server_configurable_flags.cc"],
11165 }
11166 `)
11167
11168 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11169 s := mod.Rule("apexRule").Args["copy_commands"]
11170 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11171 if len(copyCmds) != 9 {
11172 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11173 }
11174
11175 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11176
11177 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11178 s = " " + combineAconfigRule.Args["cache_files"]
11179 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11180 if len(aconfigArgs) != 3 {
11181 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11182 }
11183 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011184 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 -080011185 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11186
11187 buildParams := combineAconfigRule.BuildParams
11188 if len(buildParams.Inputs) != 3 {
11189 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11190 }
11191 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011192 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 -080011193 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11194 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11195}
11196
Yu Liucec0e412023-11-30 16:45:50 -080011197func TestAconfigFilesRustDeps(t *testing.T) {
11198 ctx := testApex(t, apex_default_bp+`
11199 apex {
11200 name: "myapex",
11201 manifest: ":myapex.manifest",
11202 androidManifest: ":myapex.androidmanifest",
11203 key: "myapex.key",
11204 native_shared_libs: [
11205 "libmy_rust_library",
11206 ],
11207 binaries: [
11208 "my_rust_binary",
11209 ],
11210 rust_dyn_libs: [
11211 "libmy_rust_dylib",
11212 ],
11213 updatable: false,
11214 }
11215
11216 rust_library {
11217 name: "libflags_rust", // test mock
11218 crate_name: "flags_rust",
11219 srcs: ["lib.rs"],
11220 apex_available: [
11221 "myapex",
11222 ],
11223 }
11224
11225 rust_library {
11226 name: "liblazy_static", // test mock
11227 crate_name: "lazy_static",
11228 srcs: ["src/lib.rs"],
11229 apex_available: [
11230 "myapex",
11231 ],
11232 }
11233
11234 rust_ffi_shared {
11235 name: "libmy_rust_library",
11236 srcs: ["src/lib.rs"],
11237 rustlibs: ["libmy_rust_aconfig_library_foo"],
11238 crate_name: "my_rust_library",
11239 apex_available: [
11240 "myapex",
11241 ],
11242 }
11243
11244 rust_library_dylib {
11245 name: "libmy_rust_dylib",
11246 srcs: ["foo/bar/MyClass.rs"],
11247 rustlibs: ["libmy_rust_aconfig_library_bar"],
11248 crate_name: "my_rust_dylib",
11249 apex_available: [
11250 "myapex",
11251 ],
11252 }
11253
11254 rust_binary {
11255 name: "my_rust_binary",
11256 srcs: ["foo/bar/MyClass.rs"],
11257 rustlibs: [
11258 "libmy_rust_aconfig_library_baz",
11259 "libmy_rust_dylib",
11260 ],
11261 apex_available: [
11262 "myapex",
11263 ],
11264 }
11265
11266 aconfig_declarations {
11267 name: "my_aconfig_declarations_foo",
11268 package: "com.example.package",
11269 container: "myapex",
11270 srcs: ["foo.aconfig"],
11271 }
11272
11273 aconfig_declarations {
11274 name: "my_aconfig_declarations_bar",
11275 package: "com.example.package",
11276 container: "myapex",
11277 srcs: ["bar.aconfig"],
11278 }
11279
11280 aconfig_declarations {
11281 name: "my_aconfig_declarations_baz",
11282 package: "com.example.package",
11283 container: "myapex",
11284 srcs: ["baz.aconfig"],
11285 }
11286
11287 rust_aconfig_library {
11288 name: "libmy_rust_aconfig_library_foo",
11289 aconfig_declarations: "my_aconfig_declarations_foo",
11290 crate_name: "my_rust_aconfig_library_foo",
11291 apex_available: [
11292 "myapex",
11293 ],
11294 }
11295
11296 rust_aconfig_library {
11297 name: "libmy_rust_aconfig_library_bar",
11298 aconfig_declarations: "my_aconfig_declarations_bar",
11299 crate_name: "my_rust_aconfig_library_bar",
11300 apex_available: [
11301 "myapex",
11302 ],
11303 }
11304
11305 rust_aconfig_library {
11306 name: "libmy_rust_aconfig_library_baz",
11307 aconfig_declarations: "my_aconfig_declarations_baz",
11308 crate_name: "my_rust_aconfig_library_baz",
11309 apex_available: [
11310 "myapex",
11311 ],
11312 }
11313 `)
11314
11315 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11316 s := mod.Rule("apexRule").Args["copy_commands"]
11317 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11318 if len(copyCmds) != 23 {
11319 t.Fatalf("Expected 23 commands, got %d in:\n%s", len(copyCmds), s)
11320 }
11321
11322 ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11323
11324 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11325 s = " " + combineAconfigRule.Args["cache_files"]
11326 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11327 if len(aconfigArgs) != 2 {
11328 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
11329 }
11330 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011331 android.EnsureListContainsSuffix(t, aconfigArgs, "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb")
Yu Liucec0e412023-11-30 16:45:50 -080011332
11333 buildParams := combineAconfigRule.BuildParams
11334 if len(buildParams.Inputs) != 2 {
11335 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11336 }
11337 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
Yu Liuedeadbf2024-01-10 23:07:35 +000011338 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 -080011339 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11340}
11341
Yu Liueae7b362023-11-16 17:05:47 -080011342func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11343 ctx := testApex(t, apex_default_bp+`
11344 apex {
11345 name: "myapex",
11346 manifest: ":myapex.manifest",
11347 androidManifest: ":myapex.androidmanifest",
11348 key: "myapex.key",
11349 java_libs: [
11350 "my_java_library_foo",
11351 "other_java_library_bar",
11352 ],
11353 updatable: false,
11354 }
11355
11356 java_library {
11357 name: "my_java_library_foo",
11358 srcs: ["foo/bar/MyClass.java"],
11359 sdk_version: "none",
11360 system_modules: "none",
11361 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011362 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011363 "myapex",
11364 ],
11365 }
11366
11367 java_library {
11368 name: "other_java_library_bar",
11369 srcs: ["foo/bar/MyClass.java"],
11370 sdk_version: "none",
11371 system_modules: "none",
11372 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011373 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011374 "myapex",
11375 ],
11376 }
11377
11378 aconfig_declarations {
11379 name: "my_aconfig_declarations_foo",
11380 package: "com.example.package",
11381 container: "myapex",
11382 srcs: ["foo.aconfig"],
11383 }
11384
11385 java_aconfig_library {
11386 name: "my_java_aconfig_library_foo",
11387 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011388 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011389 "myapex",
11390 ],
11391 }
11392
11393 aconfig_declarations {
11394 name: "other_aconfig_declarations_bar",
11395 package: "com.example.package",
11396 container: "otherapex",
11397 srcs: ["bar.aconfig"],
11398 }
11399
11400 java_aconfig_library {
11401 name: "other_java_aconfig_library_bar",
11402 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011403 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011404 "myapex",
11405 ],
11406 }
11407 `)
11408
11409 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11410 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11411 s := " " + combineAconfigRule.Args["cache_files"]
11412 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11413 if len(aconfigArgs) != 1 {
11414 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11415 }
11416 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11417
11418 buildParams := combineAconfigRule.BuildParams
11419 if len(buildParams.Inputs) != 1 {
11420 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11421 }
11422 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11423 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11424}
11425
11426func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11427 ctx := testApex(t, apex_default_bp+`
11428 apex {
11429 name: "myapex",
11430 manifest: ":myapex.manifest",
11431 androidManifest: ":myapex.androidmanifest",
11432 key: "myapex.key",
11433 java_libs: [
11434 "my_java_library_foo",
11435 "my_java_library_bar",
11436 ],
11437 updatable: false,
11438 }
11439
11440 java_library {
11441 name: "my_java_library_foo",
11442 srcs: ["foo/bar/MyClass.java"],
11443 sdk_version: "none",
11444 system_modules: "none",
11445 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011446 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011447 "myapex",
11448 ],
11449 }
11450
11451 java_library {
11452 name: "my_java_library_bar",
11453 srcs: ["foo/bar/MyClass.java"],
11454 sdk_version: "none",
11455 system_modules: "none",
11456 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011457 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011458 "myapex",
11459 ],
11460 }
11461
11462 aconfig_declarations {
11463 name: "my_aconfig_declarations_foo",
11464 package: "com.example.package",
11465 container: "myapex",
11466 srcs: ["foo.aconfig"],
11467 }
11468
11469 java_aconfig_library {
11470 name: "my_java_aconfig_library_foo",
11471 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011472 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011473 "myapex",
11474 ],
11475 }
11476
11477 java_aconfig_library {
11478 name: "my_java_aconfig_library_bar",
11479 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011480 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011481 "myapex",
11482 ],
11483 }
11484 `)
11485
11486 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11487 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11488 s := " " + combineAconfigRule.Args["cache_files"]
11489 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11490 if len(aconfigArgs) != 1 {
11491 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11492 }
11493 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11494
11495 buildParams := combineAconfigRule.BuildParams
11496 if len(buildParams.Inputs) != 1 {
11497 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11498 }
11499 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11500 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11501}
Spandan Das5be63332023-12-13 00:06:32 +000011502
11503// Test that the boot jars come from the _selected_ apex prebuilt
11504// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11505func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11506 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11507 t.Helper()
11508 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11509 foundLibfooJar := false
11510 base := stem + ".jar"
11511 for _, output := range s.AllOutputs() {
11512 if filepath.Base(output) == base {
11513 foundLibfooJar = true
11514 buildRule := s.Output(output)
11515 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11516 }
11517 }
11518 if !foundLibfooJar {
11519 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11520 }
11521 }
11522
Spandan Das64c9e0c2023-12-20 20:13:34 +000011523 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11524 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11525 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11526 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11527 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11528 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)
11529 }
11530
11531 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11532 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11533 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11534 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11535 }
11536
Spandan Das5be63332023-12-13 00:06:32 +000011537 bp := `
11538 // Source APEX.
11539
11540 java_library {
11541 name: "framework-foo",
11542 srcs: ["foo.java"],
11543 installable: true,
11544 apex_available: [
11545 "com.android.foo",
11546 ],
11547 }
11548
11549 bootclasspath_fragment {
11550 name: "foo-bootclasspath-fragment",
11551 contents: ["framework-foo"],
11552 apex_available: [
11553 "com.android.foo",
11554 ],
11555 hidden_api: {
11556 split_packages: ["*"],
11557 },
11558 }
11559
11560 apex_key {
11561 name: "com.android.foo.key",
11562 public_key: "com.android.foo.avbpubkey",
11563 private_key: "com.android.foo.pem",
11564 }
11565
11566 apex {
11567 name: "com.android.foo",
11568 key: "com.android.foo.key",
11569 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11570 updatable: false,
11571 }
11572
11573 // Prebuilt APEX.
11574
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011575 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011576 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011577 public: {
11578 jars: ["foo.jar"],
11579 },
Spandan Das5be63332023-12-13 00:06:32 +000011580 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011581 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011582 }
11583
11584 prebuilt_bootclasspath_fragment {
11585 name: "foo-bootclasspath-fragment",
11586 contents: ["framework-foo"],
11587 hidden_api: {
11588 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11589 metadata: "my-bootclasspath-fragment/metadata.csv",
11590 index: "my-bootclasspath-fragment/index.csv",
11591 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11592 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11593 },
11594 apex_available: [
11595 "com.android.foo",
11596 ],
11597 }
11598
11599 prebuilt_apex {
11600 name: "com.android.foo",
11601 apex_name: "com.android.foo",
11602 src: "com.android.foo-arm.apex",
11603 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11604 }
11605
11606 // Another Prebuilt ART APEX
11607 prebuilt_apex {
11608 name: "com.android.foo.v2",
11609 apex_name: "com.android.foo", // Used to determine the API domain
11610 src: "com.android.foo-arm.apex",
11611 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11612 }
11613
11614 // APEX contribution modules
11615
11616 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011617 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011618 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011619 contents: ["com.android.foo"],
11620 }
11621
11622 apex_contributions {
11623 name: "foo.prebuilt.contributions",
11624 api_domain: "com.android.foo",
11625 contents: ["prebuilt_com.android.foo"],
11626 }
11627
11628 apex_contributions {
11629 name: "foo.prebuilt.v2.contributions",
11630 api_domain: "com.android.foo",
11631 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011632 }
11633 `
11634
11635 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011636 desc string
11637 selectedApexContributions string
11638 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011639 }{
11640 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011641 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11642 selectedApexContributions: "foo.source.contributions",
11643 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011644 },
11645 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011646 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11647 selectedApexContributions: "foo.prebuilt.contributions",
11648 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011649 },
11650 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011651 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11652 selectedApexContributions: "foo.prebuilt.v2.contributions",
11653 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011654 },
11655 }
11656
11657 fragment := java.ApexVariantReference{
11658 Apex: proptools.StringPtr("com.android.foo"),
11659 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11660 }
11661
11662 for _, tc := range testCases {
11663 preparer := android.GroupFixturePreparers(
11664 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11665 android.FixtureMergeMockFs(map[string][]byte{
11666 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11667 }),
11668 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11669 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011670 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011671 }
11672 }),
11673 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011674 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011675 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011676 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11677 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011678 }
11679}
Spandan Das3576e762024-01-03 18:57:03 +000011680
11681// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11682// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11683func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11684 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11685 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11686 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11687 // Variations are created based on apex_name
11688 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11689 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11690 }
11691 // for a mainline module family, check that only the flagged soong module is visible to make
11692 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11693 variation := func(moduleName string) string {
11694 ret := "android_common_com.android.foo"
11695 if moduleName == "com.google.android.foo" {
11696 ret = "android_common_com.google.android.foo_com.android.foo"
11697 }
11698 return ret
11699 }
11700
11701 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11702 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11703
11704 for _, hiddenModuleName := range hiddenModuleNames {
11705 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11706 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11707
11708 }
11709 }
11710
11711 bp := `
11712 apex_key {
11713 name: "com.android.foo.key",
11714 public_key: "com.android.foo.avbpubkey",
11715 private_key: "com.android.foo.pem",
11716 }
11717
11718 // AOSP source apex
11719 apex {
11720 name: "com.android.foo",
11721 key: "com.android.foo.key",
11722 updatable: false,
11723 }
11724
11725 // Google source apex
11726 override_apex {
11727 name: "com.google.android.foo",
11728 base: "com.android.foo",
11729 key: "com.android.foo.key",
11730 }
11731
11732 // Prebuilt Google APEX.
11733
11734 prebuilt_apex {
11735 name: "com.google.android.foo",
11736 apex_name: "com.android.foo",
11737 src: "com.android.foo-arm.apex",
11738 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11739 }
11740
11741 // Another Prebuilt Google APEX
11742 prebuilt_apex {
11743 name: "com.google.android.foo.v2",
11744 apex_name: "com.android.foo",
11745 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11746 src: "com.android.foo-arm.apex",
11747 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11748 }
11749
11750 // APEX contribution modules
11751
11752 apex_contributions {
11753 name: "foo.source.contributions",
11754 api_domain: "com.android.foo",
11755 contents: ["com.google.android.foo"],
11756 }
11757
11758 apex_contributions {
11759 name: "foo.prebuilt.contributions",
11760 api_domain: "com.android.foo",
11761 contents: ["prebuilt_com.google.android.foo"],
11762 }
11763
11764 apex_contributions {
11765 name: "foo.prebuilt.v2.contributions",
11766 api_domain: "com.android.foo",
11767 contents: ["prebuilt_com.google.android.foo.v2"],
11768 }
11769
11770 // This is an incompatible module because it selects multiple versions of the same mainline module
11771 apex_contributions {
11772 name: "foo.prebuilt.duplicate.contributions",
11773 api_domain: "com.android.foo",
11774 contents: [
11775 "prebuilt_com.google.android.foo",
11776 "prebuilt_com.google.android.foo.v2",
11777 ],
11778 }
11779 `
11780
11781 testCases := []struct {
11782 desc string
11783 selectedApexContributions string
11784 expectedVisibleModuleName string
11785 expectedHiddenModuleNames []string
11786 expectedError string
11787 }{
11788 {
11789 desc: "Source apex is selected, prebuilts should be hidden from make",
11790 selectedApexContributions: "foo.source.contributions",
11791 expectedVisibleModuleName: "com.google.android.foo",
11792 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11793 },
11794 {
11795 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11796 selectedApexContributions: "foo.prebuilt.contributions",
11797 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11798 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11799 },
11800 {
11801 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11802 selectedApexContributions: "foo.prebuilt.v2.contributions",
11803 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11804 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11805 },
11806 {
11807 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11808 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11809 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11810 },
11811 }
11812
11813 for _, tc := range testCases {
11814 preparer := android.GroupFixturePreparers(
11815 android.FixtureMergeMockFs(map[string][]byte{
11816 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11817 }),
11818 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11819 variables.BuildFlags = map[string]string{
11820 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11821 }
11822 }),
11823 )
11824 if tc.expectedError != "" {
11825 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11826 testApex(t, bp, preparer)
11827 return
11828 }
11829 ctx := testApex(t, bp, preparer)
11830
11831 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11832 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11833 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11834 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11835
11836 // Check that
11837 // 1. The contents of the selected apex_contributions are visible to make
11838 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11839 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11840 }
11841}