blob: 3e9f2468b3a4b178daebbbc49290e18d3e2df2c5 [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) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
270 ok, err := regexp.MatchString(expectedRex, result)
271 if err != nil {
272 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
273 return
274 }
275 if !ok {
276 t.Errorf("%s does not match regular expession %s", result, expectedRex)
277 }
278}
279
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if !android.InList(expected, result) {
283 t.Errorf("%q is not found in %v", expected, result)
284 }
285}
286
287func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if android.InList(notExpected, result) {
290 t.Errorf("%q is found in %v", notExpected, result)
291 }
292}
293
Jooyung Hane1633032019-08-01 17:41:43 +0900294func ensureListEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) > 0 {
297 t.Errorf("%q is expected to be empty", result)
298 }
299}
300
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000301func ensureListNotEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) == 0 {
304 t.Errorf("%q is expected to be not empty", result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// Minimal test
309func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800310 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900311 apex_defaults {
312 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900313 manifest: ":myapex.manifest",
314 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900316 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900317 native_shared_libs: [
318 "mylib",
319 "libfoo.ffi",
320 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900321 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800322 multilib: {
323 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800325 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900326 },
Jiyong Park77acec62020-06-01 21:39:15 +0900327 java_libs: [
328 "myjar",
329 "myjar_dex",
330 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000331 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 }
333
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex {
335 name: "myapex",
336 defaults: ["myapex-defaults"],
337 }
338
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 apex_key {
340 name: "myapex.key",
341 public_key: "testkey.avbpubkey",
342 private_key: "testkey.pem",
343 }
344
Jiyong Park809bb722019-02-13 21:33:49 +0900345 filegroup {
346 name: "myapex.manifest",
347 srcs: ["apex_manifest.json"],
348 }
349
350 filegroup {
351 name: "myapex.androidmanifest",
352 srcs: ["AndroidManifest.xml"],
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 cc_library {
356 name: "mylib",
357 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900358 shared_libs: [
359 "mylib2",
360 "libbar.ffi",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 system_shared_libs: [],
363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000364 // TODO: remove //apex_available:platform
365 apex_available: [
366 "//apex_available:platform",
367 "myapex",
368 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 }
370
Alex Light3d673592019-01-18 14:37:31 -0800371 cc_binary {
372 name: "foo",
373 srcs: ["mylib.cpp"],
374 compile_multilib: "both",
375 multilib: {
376 lib32: {
377 suffix: "32",
378 },
379 lib64: {
380 suffix: "64",
381 },
382 },
383 symlinks: ["foo_link_"],
384 symlink_preferred_arch: true,
385 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800386 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700387 apex_available: [ "myapex", "com.android.gki.*" ],
388 }
389
Jiyong Park99644e92020-11-17 22:21:02 +0900390 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000391 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900392 srcs: ["foo.rs"],
393 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400394 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900395 apex_available: ["myapex"],
396 }
397
398 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 crate_name: "foo",
402 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900403 shared_libs: ["libfoo.shared_from_rust"],
404 }
405
406 cc_library_shared {
407 name: "libfoo.shared_from_rust",
408 srcs: ["mylib.cpp"],
409 system_shared_libs: [],
410 stl: "none",
411 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900412 }
413
414 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000415 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900421 rust_ffi_shared {
422 name: "libfoo.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "foo",
425 apex_available: ["myapex"],
426 }
427
428 rust_ffi_shared {
429 name: "libbar.ffi",
430 srcs: ["foo.rs"],
431 crate_name: "bar",
432 apex_available: ["myapex"],
433 }
434
Yifan Hongd22a84a2020-07-28 17:37:46 -0700435 apex {
436 name: "com.android.gki.fake",
437 binaries: ["foo"],
438 key: "myapex.key",
439 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000440 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900444 name: "mylib2",
445 srcs: ["mylib.cpp"],
446 system_shared_libs: [],
447 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900448 static_libs: ["libstatic"],
449 // TODO: remove //apex_available:platform
450 apex_available: [
451 "//apex_available:platform",
452 "myapex",
453 ],
454 }
455
Paul Duffindddd5462020-04-07 15:25:44 +0100456 cc_prebuilt_library_shared {
457 name: "mylib2",
458 srcs: ["prebuilt.so"],
459 // TODO: remove //apex_available:platform
460 apex_available: [
461 "//apex_available:platform",
462 "myapex",
463 ],
464 }
465
Jiyong Park9918e1a2020-03-17 19:16:40 +0900466 cc_library_static {
467 name: "libstatic",
468 srcs: ["mylib.cpp"],
469 system_shared_libs: [],
470 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900476 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477
478 java_library {
479 name: "myjar",
480 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900481 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 sdk_version: "none",
483 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900485 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000486 // TODO: remove //apex_available:platform
487 apex_available: [
488 "//apex_available:platform",
489 "myapex",
490 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900491 }
492
Jiyong Park77acec62020-06-01 21:39:15 +0900493 dex_import {
494 name: "myjar_dex",
495 jars: ["prebuilt.jar"],
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
500 }
501
Jiyong Park7f7766d2019-07-25 22:02:35 +0900502 java_library {
503 name: "myotherjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900507 // TODO: remove //apex_available:platform
508 apex_available: [
509 "//apex_available:platform",
510 "myapex",
511 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900512 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900513
514 java_library {
515 name: "mysharedjar",
516 srcs: ["foo/bar/MyClass.java"],
517 sdk_version: "none",
518 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900519 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900520 `)
521
Jooyung Hana0503a52023-08-23 13:12:50 +0900522 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900523
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700526 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900527 var builder strings.Builder
528 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
529
530 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000531 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900532 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
533
Jiyong Park42cca6c2019-04-01 11:15:50 +0900534 optFlags := apexRule.Args["opt_flags"]
535 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700536 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900537 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900538
Jiyong Park25fc6a92018-11-18 18:02:45 +0900539 copyCmds := apexRule.Args["copy_commands"]
540
541 // Ensure that main rule creates an output
542 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
543
544 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700552 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900556 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900558
559 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800560 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
561 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900562 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900564 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
566 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900568 // .. but not for java libs
569 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900570 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800571
Colin Cross7113d202019-11-20 16:39:12 -0800572 // Ensure that the platform variant ends with _shared or _common
573 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
576 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900577 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
578
579 // Ensure that dynamic dependency to java libs are not included
580 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800581
582 // Ensure that all symlinks are present.
583 found_foo_link_64 := false
584 found_foo := false
585 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900586 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800587 if strings.HasSuffix(cmd, "bin/foo") {
588 found_foo = true
589 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
590 found_foo_link_64 = true
591 }
592 }
593 }
594 good := found_foo && found_foo_link_64
595 if !good {
596 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
597 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900598
Colin Crossf61d03d2023-11-02 16:56:39 -0700599 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
600 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
603 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
604 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100605
Colin Crossf61d03d2023-11-02 16:56:39 -0700606 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
607 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800612}
613
Jooyung Hanf21c7972019-12-16 22:32:06 +0900614func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800615 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616 apex_defaults {
617 name: "myapex-defaults",
618 key: "myapex.key",
619 prebuilts: ["myetc"],
620 native_shared_libs: ["mylib"],
621 java_libs: ["myjar"],
622 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900623 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800624 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000625 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 }
627
628 prebuilt_etc {
629 name: "myetc",
630 src: "myprebuilt",
631 }
632
633 apex {
634 name: "myapex",
635 defaults: ["myapex-defaults"],
636 }
637
638 apex_key {
639 name: "myapex.key",
640 public_key: "testkey.avbpubkey",
641 private_key: "testkey.pem",
642 }
643
644 cc_library {
645 name: "mylib",
646 system_shared_libs: [],
647 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 java_library {
652 name: "myjar",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
658
659 android_app {
660 name: "AppFoo",
661 srcs: ["foo/bar/MyClass.java"],
662 sdk_version: "none",
663 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000664 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900666
667 runtime_resource_overlay {
668 name: "rro",
669 theme: "blue",
670 }
671
markchien2f59ec92020-09-02 16:23:38 +0800672 bpf {
673 name: "bpf",
674 srcs: ["bpf.c", "bpf2.c"],
675 }
676
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800678 name: "netdTest",
679 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800680 sub_dir: "netd",
681 }
682
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900684 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 "etc/myetc",
686 "javalib/myjar.jar",
687 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000688 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900689 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800690 "etc/bpf/bpf.o",
691 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800692 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 })
694}
695
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800697 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 apex {
699 name: "myapex",
700 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000701 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900702 }
703
704 apex_key {
705 name: "myapex.key",
706 public_key: "testkey.avbpubkey",
707 private_key: "testkey.pem",
708 }
709 `)
710
Jooyung Hana0503a52023-08-23 13:12:50 +0900711 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900712 args := module.Rule("apexRule").Args
713 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
714 t.Error("manifest should be apex_manifest.pb, but " + manifest)
715 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900716}
717
Liz Kammer4854a7d2021-05-27 14:28:27 -0400718func TestApexManifestMinSdkVersion(t *testing.T) {
719 ctx := testApex(t, `
720 apex_defaults {
721 name: "my_defaults",
722 key: "myapex.key",
723 product_specific: true,
724 file_contexts: ":my-file-contexts",
725 updatable: false,
726 }
727 apex {
728 name: "myapex_30",
729 min_sdk_version: "30",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_current",
735 min_sdk_version: "current",
736 defaults: ["my_defaults"],
737 }
738
739 apex {
740 name: "myapex_none",
741 defaults: ["my_defaults"],
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 filegroup {
751 name: "my-file-contexts",
752 srcs: ["product_specific_file_contexts"],
753 }
754 `, withFiles(map[string][]byte{
755 "product_specific_file_contexts": nil,
756 }), android.FixtureModifyProductVariables(
757 func(variables android.FixtureProductVariables) {
758 variables.Unbundled_build = proptools.BoolPtr(true)
759 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
760 }), android.FixtureMergeEnv(map[string]string{
761 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
762 }))
763
764 testCases := []struct {
765 module string
766 minSdkVersion string
767 }{
768 {
769 module: "myapex_30",
770 minSdkVersion: "30",
771 },
772 {
773 module: "myapex_current",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 {
777 module: "myapex_none",
778 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
779 },
780 }
781 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900782 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400783 args := module.Rule("apexRule").Args
784 optFlags := args["opt_flags"]
785 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
786 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
787 }
788 }
789}
790
Jihoon Kang842b9992024-02-08 01:41:51 +0000791func TestApexWithDessertSha(t *testing.T) {
792 ctx := testApex(t, `
793 apex_defaults {
794 name: "my_defaults",
795 key: "myapex.key",
796 product_specific: true,
797 file_contexts: ":my-file-contexts",
798 updatable: false,
799 }
800 apex {
801 name: "myapex_30",
802 min_sdk_version: "30",
803 defaults: ["my_defaults"],
804 }
805
806 apex {
807 name: "myapex_current",
808 min_sdk_version: "current",
809 defaults: ["my_defaults"],
810 }
811
812 apex {
813 name: "myapex_none",
814 defaults: ["my_defaults"],
815 }
816
817 apex_key {
818 name: "myapex.key",
819 public_key: "testkey.avbpubkey",
820 private_key: "testkey.pem",
821 }
822
823 filegroup {
824 name: "my-file-contexts",
825 srcs: ["product_specific_file_contexts"],
826 }
827 `, withFiles(map[string][]byte{
828 "product_specific_file_contexts": nil,
829 }), android.FixtureModifyProductVariables(
830 func(variables android.FixtureProductVariables) {
831 variables.Unbundled_build = proptools.BoolPtr(true)
832 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
833 }), android.FixtureMergeEnv(map[string]string{
834 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
835 }))
836
837 testCases := []struct {
838 module string
839 minSdkVersion string
840 }{
841 {
842 module: "myapex_30",
843 minSdkVersion: "30",
844 },
845 {
846 module: "myapex_current",
847 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
848 },
849 {
850 module: "myapex_none",
851 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
852 },
853 }
854 for _, tc := range testCases {
855 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
856 args := module.Rule("apexRule").Args
857 optFlags := args["opt_flags"]
858 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
859 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
860 }
861 }
862}
863
Jooyung Hanaf730952023-02-28 14:13:38 +0900864func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900865 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900866 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900867 if vendor {
868 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900869 }
870 ctx := testApex(t, `
871 apex {
872 name: "myapex",
873 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900874 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900875 `+prop+`
876 }
877
878 apex_key {
879 name: "myapex.key",
880 public_key: "testkey.avbpubkey",
881 private_key: "testkey.pem",
882 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900884
Jooyung Hana0503a52023-08-23 13:12:50 +0900885 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900886 if vendor {
887 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900891 android.AssertStringDoesContain(t, "should force-label as system_file",
892 rule.RuleParams.Command,
893 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900894 }
895 }
896}
897
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800899 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900 apex {
901 name: "myapex",
902 key: "myapex.key",
903 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900904 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000905 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906 }
907
908 apex_key {
909 name: "myapex.key",
910 public_key: "testkey.avbpubkey",
911 private_key: "testkey.pem",
912 }
913
914 cc_library {
915 name: "mylib",
916 srcs: ["mylib.cpp"],
917 shared_libs: ["mylib2", "mylib3"],
918 system_shared_libs: [],
919 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
922
923 cc_library {
924 name: "mylib2",
925 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900926 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 system_shared_libs: [],
928 stl: "none",
929 stubs: {
930 versions: ["1", "2", "3"],
931 },
932 }
933
934 cc_library {
935 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900936 srcs: ["mylib.cpp"],
937 shared_libs: ["mylib4"],
938 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 stl: "none",
940 stubs: {
941 versions: ["10", "11", "12"],
942 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000943 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900944 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900945
946 cc_library {
947 name: "mylib4",
948 srcs: ["mylib.cpp"],
949 system_shared_libs: [],
950 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000951 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900952 }
Jiyong Park105dc322021-06-11 17:22:09 +0900953
954 rust_binary {
955 name: "foo.rust",
956 srcs: ["foo.rs"],
957 shared_libs: ["libfoo.shared_from_rust"],
958 prefer_rlib: true,
959 apex_available: ["myapex"],
960 }
961
962 cc_library_shared {
963 name: "libfoo.shared_from_rust",
964 srcs: ["mylib.cpp"],
965 system_shared_libs: [],
966 stl: "none",
967 stubs: {
968 versions: ["10", "11", "12"],
969 },
970 }
971
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972 `)
973
Jooyung Hana0503a52023-08-23 13:12:50 +0900974 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900975 copyCmds := apexRule.Args["copy_commands"]
976
977 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800978 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900979
980 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800981 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900982
983 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800984 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900985
Colin Crossaede88c2020-08-11 12:17:01 -0700986 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987
988 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900989 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900990 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900991 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992
993 // 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 -0700994 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900995 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700996 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900997
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700998 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
999 // is replaced by sharing of "cFlags" in cc/builder.go.
1000 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1001 // module variable representing "cflags". So it was not detected by ensureNotContains.
1002 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1003 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1004 // including the original cflags's "-include mylib.h".
1005 //
Jiyong Park64379952018-12-13 18:37:29 +09001006 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001007 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1008 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001009
Jiyong Park85cc35a2022-07-17 11:30:47 +09001010 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1011 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1012 // Ensure that genstub for apex-provided lib is invoked with --apex
1013 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001014
Jooyung Hana0503a52023-08-23 13:12:50 +09001015 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001016 "lib64/mylib.so",
1017 "lib64/mylib3.so",
1018 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001019 "bin/foo.rust",
1020 "lib64/libc++.so", // by the implicit dependency from foo.rust
1021 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001022 })
Jiyong Park105dc322021-06-11 17:22:09 +09001023
1024 // Ensure that stub dependency from a rust module is not included
1025 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1026 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001027 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001028 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1029 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001030
Jooyung Hana0503a52023-08-23 13:12:50 +09001031 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001032 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001033}
1034
Jooyung Han20348752023-12-05 15:23:56 +09001035func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1036 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1037 apex {
1038 name: "myapex",
1039 key: "myapex.key",
1040 vendor: true,
1041 updatable: false,
1042 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1043 }
1044
1045 apex_key {
1046 name: "myapex.key",
1047 public_key: "testkey.avbpubkey",
1048 private_key: "testkey.pem",
1049 }
1050
1051 cc_library {
1052 name: "libbar",
1053 srcs: ["mylib.cpp"],
1054 llndk: {
1055 symbol_file: "libbar.map.txt",
1056 }
1057 }
1058 `)
1059}
1060
Jiyong Park1bc84122021-06-22 20:23:05 +09001061func TestApexCanUsePrivateApis(t *testing.T) {
1062 ctx := testApex(t, `
1063 apex {
1064 name: "myapex",
1065 key: "myapex.key",
1066 native_shared_libs: ["mylib"],
1067 binaries: ["foo.rust"],
1068 updatable: false,
1069 platform_apis: true,
1070 }
1071
1072 apex_key {
1073 name: "myapex.key",
1074 public_key: "testkey.avbpubkey",
1075 private_key: "testkey.pem",
1076 }
1077
1078 cc_library {
1079 name: "mylib",
1080 srcs: ["mylib.cpp"],
1081 shared_libs: ["mylib2"],
1082 system_shared_libs: [],
1083 stl: "none",
1084 apex_available: [ "myapex" ],
1085 }
1086
1087 cc_library {
1088 name: "mylib2",
1089 srcs: ["mylib.cpp"],
1090 cflags: ["-include mylib.h"],
1091 system_shared_libs: [],
1092 stl: "none",
1093 stubs: {
1094 versions: ["1", "2", "3"],
1095 },
1096 }
1097
1098 rust_binary {
1099 name: "foo.rust",
1100 srcs: ["foo.rs"],
1101 shared_libs: ["libfoo.shared_from_rust"],
1102 prefer_rlib: true,
1103 apex_available: ["myapex"],
1104 }
1105
1106 cc_library_shared {
1107 name: "libfoo.shared_from_rust",
1108 srcs: ["mylib.cpp"],
1109 system_shared_libs: [],
1110 stl: "none",
1111 stubs: {
1112 versions: ["10", "11", "12"],
1113 },
1114 }
1115 `)
1116
Jooyung Hana0503a52023-08-23 13:12:50 +09001117 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001118 copyCmds := apexRule.Args["copy_commands"]
1119
1120 // Ensure that indirect stubs dep is not included
1121 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1122 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1123
1124 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1125 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001126 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001127 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1128 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001129 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001130 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1131 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1132}
1133
Colin Cross7812fd32020-09-25 12:35:10 -07001134func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1135 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001136 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001137 apex {
1138 name: "myapex",
1139 key: "myapex.key",
1140 native_shared_libs: ["mylib", "mylib3"],
1141 min_sdk_version: "29",
1142 }
1143
1144 apex_key {
1145 name: "myapex.key",
1146 public_key: "testkey.avbpubkey",
1147 private_key: "testkey.pem",
1148 }
1149
1150 cc_library {
1151 name: "mylib",
1152 srcs: ["mylib.cpp"],
1153 shared_libs: ["mylib2", "mylib3"],
1154 system_shared_libs: [],
1155 stl: "none",
1156 apex_available: [ "myapex" ],
1157 min_sdk_version: "28",
1158 }
1159
1160 cc_library {
1161 name: "mylib2",
1162 srcs: ["mylib.cpp"],
1163 cflags: ["-include mylib.h"],
1164 system_shared_libs: [],
1165 stl: "none",
1166 stubs: {
1167 versions: ["28", "29", "30", "current"],
1168 },
1169 min_sdk_version: "28",
1170 }
1171
1172 cc_library {
1173 name: "mylib3",
1174 srcs: ["mylib.cpp"],
1175 shared_libs: ["mylib4"],
1176 system_shared_libs: [],
1177 stl: "none",
1178 stubs: {
1179 versions: ["28", "29", "30", "current"],
1180 },
1181 apex_available: [ "myapex" ],
1182 min_sdk_version: "28",
1183 }
1184
1185 cc_library {
1186 name: "mylib4",
1187 srcs: ["mylib.cpp"],
1188 system_shared_libs: [],
1189 stl: "none",
1190 apex_available: [ "myapex" ],
1191 min_sdk_version: "28",
1192 }
1193 `)
1194
Jooyung Hana0503a52023-08-23 13:12:50 +09001195 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001196 copyCmds := apexRule.Args["copy_commands"]
1197
1198 // Ensure that direct non-stubs dep is always included
1199 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1200
1201 // Ensure that indirect stubs dep is not included
1202 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1203
1204 // Ensure that direct stubs dep is included
1205 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1206
1207 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1208
Jiyong Park55549df2021-02-26 23:57:23 +09001209 // Ensure that mylib is linking with the latest version of stub for mylib2
1210 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001211 // ... and not linking to the non-stub (impl) variant of mylib2
1212 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1213
1214 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1215 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1216 // .. and not linking to the stubs variant of mylib3
1217 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1218
1219 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001220 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001221 ensureNotContains(t, mylib2Cflags, "-include ")
1222
Jiyong Park85cc35a2022-07-17 11:30:47 +09001223 // Ensure that genstub is invoked with --systemapi
1224 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001225
Jooyung Hana0503a52023-08-23 13:12:50 +09001226 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001227 "lib64/mylib.so",
1228 "lib64/mylib3.so",
1229 "lib64/mylib4.so",
1230 })
1231}
1232
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001233func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1234 t.Parallel()
1235 // myapex (Z)
1236 // mylib -----------------.
1237 // |
1238 // otherapex (29) |
1239 // libstub's versions: 29 Z current
1240 // |
1241 // <platform> |
1242 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001243 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001244 apex {
1245 name: "myapex",
1246 key: "myapex.key",
1247 native_shared_libs: ["mylib"],
1248 min_sdk_version: "Z", // non-final
1249 }
1250
1251 cc_library {
1252 name: "mylib",
1253 srcs: ["mylib.cpp"],
1254 shared_libs: ["libstub"],
1255 apex_available: ["myapex"],
1256 min_sdk_version: "Z",
1257 }
1258
1259 apex_key {
1260 name: "myapex.key",
1261 public_key: "testkey.avbpubkey",
1262 private_key: "testkey.pem",
1263 }
1264
1265 apex {
1266 name: "otherapex",
1267 key: "myapex.key",
1268 native_shared_libs: ["libstub"],
1269 min_sdk_version: "29",
1270 }
1271
1272 cc_library {
1273 name: "libstub",
1274 srcs: ["mylib.cpp"],
1275 stubs: {
1276 versions: ["29", "Z", "current"],
1277 },
1278 apex_available: ["otherapex"],
1279 min_sdk_version: "29",
1280 }
1281
1282 // platform module depending on libstub from otherapex should use the latest stub("current")
1283 cc_library {
1284 name: "libplatform",
1285 srcs: ["mylib.cpp"],
1286 shared_libs: ["libstub"],
1287 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001288 `,
1289 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1290 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1291 variables.Platform_sdk_final = proptools.BoolPtr(false)
1292 variables.Platform_version_active_codenames = []string{"Z"}
1293 }),
1294 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001295
Jiyong Park55549df2021-02-26 23:57:23 +09001296 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001297 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001298 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001299 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001300 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001301
1302 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1303 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1304 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1305 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1306 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1307}
1308
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001309func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001310 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001312 name: "myapex2",
1313 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001314 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001315 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001316 }
1317
1318 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001319 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001320 public_key: "testkey.avbpubkey",
1321 private_key: "testkey.pem",
1322 }
1323
1324 cc_library {
1325 name: "mylib",
1326 srcs: ["mylib.cpp"],
1327 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001328 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329 system_shared_libs: [],
1330 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001331 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001332 }
1333
1334 cc_library {
1335 name: "libfoo",
1336 srcs: ["mylib.cpp"],
1337 shared_libs: ["libbar"],
1338 system_shared_libs: [],
1339 stl: "none",
1340 stubs: {
1341 versions: ["10", "20", "30"],
1342 },
1343 }
1344
1345 cc_library {
1346 name: "libbar",
1347 srcs: ["mylib.cpp"],
1348 system_shared_libs: [],
1349 stl: "none",
1350 }
1351
Jiyong Park678c8812020-02-07 17:25:49 +09001352 cc_library_static {
1353 name: "libbaz",
1354 srcs: ["mylib.cpp"],
1355 system_shared_libs: [],
1356 stl: "none",
1357 apex_available: [ "myapex2" ],
1358 }
1359
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001360 `)
1361
Jooyung Hana0503a52023-08-23 13:12:50 +09001362 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001363 copyCmds := apexRule.Args["copy_commands"]
1364
1365 // Ensure that direct non-stubs dep is always included
1366 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1367
1368 // Ensure that indirect stubs dep is not included
1369 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1370
1371 // Ensure that dependency of stubs is not included
1372 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1373
Colin Crossaede88c2020-08-11 12:17:01 -07001374 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001375
1376 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001377 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001378 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001379 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001380
Jiyong Park3ff16992019-12-27 14:11:47 +09001381 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001382
1383 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1384 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001385
Colin Crossf61d03d2023-11-02 16:56:39 -07001386 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1387 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001388 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001389
Colin Crossf61d03d2023-11-02 16:56:39 -07001390 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1391 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001392 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001393}
1394
Jooyung Hand3639552019-08-09 12:57:43 +09001395func TestApexWithRuntimeLibsDependency(t *testing.T) {
1396 /*
1397 myapex
1398 |
1399 v (runtime_libs)
1400 mylib ------+------> libfoo [provides stub]
1401 |
1402 `------> libbar
1403 */
Colin Cross1c460562021-02-16 17:55:47 -08001404 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001405 apex {
1406 name: "myapex",
1407 key: "myapex.key",
1408 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001409 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001410 }
1411
1412 apex_key {
1413 name: "myapex.key",
1414 public_key: "testkey.avbpubkey",
1415 private_key: "testkey.pem",
1416 }
1417
1418 cc_library {
1419 name: "mylib",
1420 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001421 static_libs: ["libstatic"],
1422 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001423 runtime_libs: ["libfoo", "libbar"],
1424 system_shared_libs: [],
1425 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001426 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001427 }
1428
1429 cc_library {
1430 name: "libfoo",
1431 srcs: ["mylib.cpp"],
1432 system_shared_libs: [],
1433 stl: "none",
1434 stubs: {
1435 versions: ["10", "20", "30"],
1436 },
1437 }
1438
1439 cc_library {
1440 name: "libbar",
1441 srcs: ["mylib.cpp"],
1442 system_shared_libs: [],
1443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001444 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001445 }
1446
Liz Kammer5f108fa2023-05-11 14:33:17 -04001447 cc_library {
1448 name: "libstatic",
1449 srcs: ["mylib.cpp"],
1450 system_shared_libs: [],
1451 stl: "none",
1452 apex_available: [ "myapex" ],
1453 runtime_libs: ["libstatic_to_runtime"],
1454 }
1455
1456 cc_library {
1457 name: "libshared",
1458 srcs: ["mylib.cpp"],
1459 system_shared_libs: [],
1460 stl: "none",
1461 apex_available: [ "myapex" ],
1462 runtime_libs: ["libshared_to_runtime"],
1463 }
1464
1465 cc_library {
1466 name: "libstatic_to_runtime",
1467 srcs: ["mylib.cpp"],
1468 system_shared_libs: [],
1469 stl: "none",
1470 apex_available: [ "myapex" ],
1471 }
1472
1473 cc_library {
1474 name: "libshared_to_runtime",
1475 srcs: ["mylib.cpp"],
1476 system_shared_libs: [],
1477 stl: "none",
1478 apex_available: [ "myapex" ],
1479 }
Jooyung Hand3639552019-08-09 12:57:43 +09001480 `)
1481
Jooyung Hana0503a52023-08-23 13:12:50 +09001482 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001483 copyCmds := apexRule.Args["copy_commands"]
1484
1485 // Ensure that direct non-stubs dep is always included
1486 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1487
1488 // Ensure that indirect stubs dep is not included
1489 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1490
1491 // Ensure that runtime_libs dep in included
1492 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001493 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1494 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1495
1496 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001497
Jooyung Hana0503a52023-08-23 13:12:50 +09001498 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001499 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1500 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001501}
1502
Paul Duffina02cae32021-03-09 01:44:06 +00001503var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1504 cc.PrepareForTestWithCcBuildComponents,
1505 PrepareForTestWithApexBuildComponents,
1506 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507 apex {
1508 name: "com.android.runtime",
1509 key: "com.android.runtime.key",
1510 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001511 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001512 }
1513
1514 apex_key {
1515 name: "com.android.runtime.key",
1516 public_key: "testkey.avbpubkey",
1517 private_key: "testkey.pem",
1518 }
Paul Duffina02cae32021-03-09 01:44:06 +00001519 `),
1520 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1521)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522
Paul Duffina02cae32021-03-09 01:44:06 +00001523func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001524 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001525 cc_library {
1526 name: "libc",
1527 no_libcrt: true,
1528 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001529 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001530 stl: "none",
1531 system_shared_libs: [],
1532 stubs: { versions: ["1"] },
1533 apex_available: ["com.android.runtime"],
1534
1535 sanitize: {
1536 hwaddress: true,
1537 }
1538 }
1539
1540 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001541 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001542 no_libcrt: true,
1543 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001544 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001545 stl: "none",
1546 system_shared_libs: [],
1547 srcs: [""],
1548 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001549 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
1551 sanitize: {
1552 never: true,
1553 },
Spandan Das4de7b492023-05-05 21:13:01 +00001554 apex_available: [
1555 "//apex_available:anyapex",
1556 "//apex_available:platform",
1557 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001558 } `)
1559 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001560
Jooyung Hana0503a52023-08-23 13:12:50 +09001561 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562 "lib64/bionic/libc.so",
1563 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1564 })
1565
Colin Cross4c4c1be2022-02-10 11:41:18 -08001566 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001567
1568 installed := hwasan.Description("install libclang_rt.hwasan")
1569 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1570
1571 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1572 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1573 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1574}
1575
1576func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001577 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001578 prepareForTestOfRuntimeApexWithHwasan,
1579 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1580 variables.SanitizeDevice = []string{"hwaddress"}
1581 }),
1582 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 cc_library {
1584 name: "libc",
1585 no_libcrt: true,
1586 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001587 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588 stl: "none",
1589 system_shared_libs: [],
1590 stubs: { versions: ["1"] },
1591 apex_available: ["com.android.runtime"],
1592 }
1593
1594 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001595 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001596 no_libcrt: true,
1597 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001598 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001599 stl: "none",
1600 system_shared_libs: [],
1601 srcs: [""],
1602 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001603 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001604
1605 sanitize: {
1606 never: true,
1607 },
Spandan Das4de7b492023-05-05 21:13:01 +00001608 apex_available: [
1609 "//apex_available:anyapex",
1610 "//apex_available:platform",
1611 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001612 }
Paul Duffina02cae32021-03-09 01:44:06 +00001613 `)
1614 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001615
Jooyung Hana0503a52023-08-23 13:12:50 +09001616 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001617 "lib64/bionic/libc.so",
1618 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1619 })
1620
Colin Cross4c4c1be2022-02-10 11:41:18 -08001621 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622
1623 installed := hwasan.Description("install libclang_rt.hwasan")
1624 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1625
1626 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1627 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1628 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1629}
1630
Jooyung Han61b66e92020-03-21 14:21:46 +00001631func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1632 testcases := []struct {
1633 name string
1634 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001635 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001636 shouldLink string
1637 shouldNotLink []string
1638 }{
1639 {
Jiyong Park55549df2021-02-26 23:57:23 +09001640 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001641 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001642 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001643 shouldLink: "current",
1644 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001645 },
1646 {
Jiyong Park55549df2021-02-26 23:57:23 +09001647 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001648 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001649 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001650 shouldLink: "current",
1651 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001652 },
1653 }
1654 for _, tc := range testcases {
1655 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001656 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001657 apex {
1658 name: "myapex",
1659 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001660 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001661 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001662 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001663 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001664
Jooyung Han61b66e92020-03-21 14:21:46 +00001665 apex_key {
1666 name: "myapex.key",
1667 public_key: "testkey.avbpubkey",
1668 private_key: "testkey.pem",
1669 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001670
Jooyung Han61b66e92020-03-21 14:21:46 +00001671 cc_library {
1672 name: "mylib",
1673 srcs: ["mylib.cpp"],
1674 vendor_available: true,
1675 shared_libs: ["libbar"],
1676 system_shared_libs: [],
1677 stl: "none",
1678 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001679 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001680 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001681
Jooyung Han61b66e92020-03-21 14:21:46 +00001682 cc_library {
1683 name: "libbar",
1684 srcs: ["mylib.cpp"],
1685 system_shared_libs: [],
1686 stl: "none",
1687 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001688 llndk: {
1689 symbol_file: "libbar.map.txt",
1690 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001691 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001692 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001693 withUnbundledBuild,
1694 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001695
Jooyung Han61b66e92020-03-21 14:21:46 +00001696 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001697 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 "lib64/mylib.so",
1699 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001700
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001702 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001703 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1704 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Steven Moreland2c4000c2021-04-27 02:08:49 +00001706 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1707 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001709 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Steven Moreland2c4000c2021-04-27 02:08:49 +00001712 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001713 ver := tc.shouldLink
1714 if tc.shouldLink == "current" {
1715 ver = strconv.Itoa(android.FutureApiLevelInt)
1716 }
1717 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 })
1719 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001720}
1721
Jiyong Park25fc6a92018-11-18 18:02:45 +09001722func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001723 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001724 apex {
1725 name: "myapex",
1726 key: "myapex.key",
1727 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001728 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001729 }
1730
1731 apex_key {
1732 name: "myapex.key",
1733 public_key: "testkey.avbpubkey",
1734 private_key: "testkey.pem",
1735 }
1736
1737 cc_library {
1738 name: "mylib",
1739 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001740 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001741 shared_libs: ["libdl#27"],
1742 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001743 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001744 }
1745
1746 cc_library_shared {
1747 name: "mylib_shared",
1748 srcs: ["mylib.cpp"],
1749 shared_libs: ["libdl#27"],
1750 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001751 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 }
1753
1754 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001755 name: "libBootstrap",
1756 srcs: ["mylib.cpp"],
1757 stl: "none",
1758 bootstrap: true,
1759 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001760 `)
1761
Jooyung Hana0503a52023-08-23 13:12:50 +09001762 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763 copyCmds := apexRule.Args["copy_commands"]
1764
1765 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001766 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001767 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1768 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001769
1770 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001771 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772
Colin Crossaede88c2020-08-11 12:17:01 -07001773 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1774 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1775 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001776
1777 // For dependency to libc
1778 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001779 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001780 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001781 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001782 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001783 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1784 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001785
1786 // For dependency to libm
1787 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001788 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001790 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 // ... and is not compiling with the stub
1792 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1793 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1794
1795 // For dependency to libdl
1796 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001797 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001798 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001799 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1800 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001801 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001802 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001803 // ... Cflags from stub is correctly exported to mylib
1804 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1805 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001806
1807 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001808 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1809 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1810 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1811 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001812}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001813
Jooyung Han749dc692020-04-15 11:03:39 +09001814func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001815 // there are three links between liba --> libz.
1816 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001817 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001818 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001819 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001820 apex {
1821 name: "myapex",
1822 key: "myapex.key",
1823 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001824 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001825 }
1826
1827 apex {
1828 name: "otherapex",
1829 key: "myapex.key",
1830 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001831 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001832 }
1833
1834 apex_key {
1835 name: "myapex.key",
1836 public_key: "testkey.avbpubkey",
1837 private_key: "testkey.pem",
1838 }
1839
1840 cc_library {
1841 name: "libx",
1842 shared_libs: ["liba"],
1843 system_shared_libs: [],
1844 stl: "none",
1845 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001846 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001847 }
1848
1849 cc_library {
1850 name: "liby",
1851 shared_libs: ["liba"],
1852 system_shared_libs: [],
1853 stl: "none",
1854 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001855 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001856 }
1857
1858 cc_library {
1859 name: "liba",
1860 shared_libs: ["libz"],
1861 system_shared_libs: [],
1862 stl: "none",
1863 apex_available: [
1864 "//apex_available:anyapex",
1865 "//apex_available:platform",
1866 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 cc_library {
1871 name: "libz",
1872 system_shared_libs: [],
1873 stl: "none",
1874 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001875 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001876 },
1877 }
Jooyung Han749dc692020-04-15 11:03:39 +09001878 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001879
1880 expectLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
1884 expectNoLink := func(from, from_variant, to, to_variant string) {
1885 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1886 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1887 }
1888 // platform liba is linked to non-stub version
1889 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001890 // liba in myapex is linked to current
1891 expectLink("liba", "shared_apex29", "libz", "shared_current")
1892 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001893 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001894 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001895 // liba in otherapex is linked to current
1896 expectLink("liba", "shared_apex30", "libz", "shared_current")
1897 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001898 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1899 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001900}
1901
Jooyung Hanaed150d2020-04-02 01:41:41 +09001902func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001903 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001904 apex {
1905 name: "myapex",
1906 key: "myapex.key",
1907 native_shared_libs: ["libx"],
1908 min_sdk_version: "R",
1909 }
1910
1911 apex_key {
1912 name: "myapex.key",
1913 public_key: "testkey.avbpubkey",
1914 private_key: "testkey.pem",
1915 }
1916
1917 cc_library {
1918 name: "libx",
1919 shared_libs: ["libz"],
1920 system_shared_libs: [],
1921 stl: "none",
1922 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001923 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001924 }
1925
1926 cc_library {
1927 name: "libz",
1928 system_shared_libs: [],
1929 stl: "none",
1930 stubs: {
1931 versions: ["29", "R"],
1932 },
1933 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001934 `,
1935 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1936 variables.Platform_version_active_codenames = []string{"R"}
1937 }),
1938 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001939
1940 expectLink := func(from, from_variant, to, to_variant string) {
1941 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1942 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1943 }
1944 expectNoLink := func(from, from_variant, to, to_variant string) {
1945 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1946 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1947 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001948 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1949 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001950 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1951 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001952}
1953
Jooyung Han4c4da062021-06-23 10:23:16 +09001954func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1955 testApex(t, `
1956 apex {
1957 name: "myapex",
1958 key: "myapex.key",
1959 java_libs: ["libx"],
1960 min_sdk_version: "S",
1961 }
1962
1963 apex_key {
1964 name: "myapex.key",
1965 public_key: "testkey.avbpubkey",
1966 private_key: "testkey.pem",
1967 }
1968
1969 java_library {
1970 name: "libx",
1971 srcs: ["a.java"],
1972 apex_available: [ "myapex" ],
1973 sdk_version: "current",
1974 min_sdk_version: "S", // should be okay
1975 }
1976 `,
1977 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1978 variables.Platform_version_active_codenames = []string{"S"}
1979 variables.Platform_sdk_codename = proptools.StringPtr("S")
1980 }),
1981 )
1982}
1983
Jooyung Han749dc692020-04-15 11:03:39 +09001984func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001985 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001986 apex {
1987 name: "myapex",
1988 key: "myapex.key",
1989 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001990 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001991 }
1992
1993 apex_key {
1994 name: "myapex.key",
1995 public_key: "testkey.avbpubkey",
1996 private_key: "testkey.pem",
1997 }
1998
1999 cc_library {
2000 name: "libx",
2001 shared_libs: ["libz"],
2002 system_shared_libs: [],
2003 stl: "none",
2004 apex_available: [ "myapex" ],
2005 }
2006
2007 cc_library {
2008 name: "libz",
2009 system_shared_libs: [],
2010 stl: "none",
2011 stubs: {
2012 versions: ["1", "2"],
2013 },
2014 }
2015 `)
2016
2017 expectLink := func(from, from_variant, to, to_variant string) {
2018 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2019 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2020 }
2021 expectNoLink := func(from, from_variant, to, to_variant string) {
2022 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2023 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2024 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002025 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002026 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002027 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002028 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002029}
2030
Jooyung Handfc864c2023-03-20 18:19:07 +09002031func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002032 ctx := testApex(t, `
2033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002037 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002038 vendor: true,
2039 min_sdk_version: "29",
2040 }
2041
2042 apex_key {
2043 name: "myapex.key",
2044 public_key: "testkey.avbpubkey",
2045 private_key: "testkey.pem",
2046 }
2047
2048 cc_library {
2049 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002050 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002051 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002052 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002053 shared_libs: ["libbar"],
2054 }
2055
2056 cc_library {
2057 name: "libbar",
2058 stubs: { versions: ["29", "30"] },
2059 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002060 }
2061 `)
2062
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002063 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002064
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002065 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002066
2067 // Ensure that mylib links with "current" LLNDK
2068 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002069 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002070
2071 // Ensure that mylib is targeting 29
2072 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2073 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2074
2075 // Ensure that the correct variant of crtbegin_so is used.
2076 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2077 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002078
2079 // Ensure that the crtbegin_so used by the APEX is targeting 29
2080 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2081 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2082}
2083
Jooyung Han4495f842023-04-25 16:39:59 +09002084func TestTrackAllowedDeps(t *testing.T) {
2085 ctx := testApex(t, `
2086 apex {
2087 name: "myapex",
2088 key: "myapex.key",
2089 updatable: true,
2090 native_shared_libs: [
2091 "mylib",
2092 "yourlib",
2093 ],
2094 min_sdk_version: "29",
2095 }
2096
2097 apex {
2098 name: "myapex2",
2099 key: "myapex.key",
2100 updatable: false,
2101 native_shared_libs: ["yourlib"],
2102 }
2103
2104 apex_key {
2105 name: "myapex.key",
2106 public_key: "testkey.avbpubkey",
2107 private_key: "testkey.pem",
2108 }
2109
2110 cc_library {
2111 name: "mylib",
2112 srcs: ["mylib.cpp"],
2113 shared_libs: ["libbar"],
2114 min_sdk_version: "29",
2115 apex_available: ["myapex"],
2116 }
2117
2118 cc_library {
2119 name: "libbar",
2120 stubs: { versions: ["29", "30"] },
2121 }
2122
2123 cc_library {
2124 name: "yourlib",
2125 srcs: ["mylib.cpp"],
2126 min_sdk_version: "29",
2127 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2128 }
2129 `, withFiles(android.MockFS{
2130 "packages/modules/common/build/allowed_deps.txt": nil,
2131 }))
2132
2133 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2134 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2135 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002136 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002137 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002138 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002139
Jooyung Hana0503a52023-08-23 13:12:50 +09002140 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002141 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2142 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002143 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2144 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2145 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2146 flatlist, "mylib:(minSdkVersion:29)")
2147 android.AssertStringListContains(t, "track platform-available lib",
2148 flatlist, "yourlib(minSdkVersion:29)")
2149}
2150
2151func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2152 ctx := testApex(t, `
2153 apex {
2154 name: "myapex",
2155 key: "myapex.key",
2156 updatable: true,
2157 min_sdk_version: "29",
2158 }
2159
2160 apex_key {
2161 name: "myapex.key",
2162 public_key: "testkey.avbpubkey",
2163 private_key: "testkey.pem",
2164 }
2165 `)
2166 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2167 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2168 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2169 }
2170}
2171
Jooyung Han03b51852020-02-26 22:45:42 +09002172func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002173 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002174 apex {
2175 name: "myapex",
2176 key: "myapex.key",
2177 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002178 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002179 }
2180
2181 apex_key {
2182 name: "myapex.key",
2183 public_key: "testkey.avbpubkey",
2184 private_key: "testkey.pem",
2185 }
2186
2187 cc_library {
2188 name: "libx",
2189 system_shared_libs: [],
2190 stl: "none",
2191 apex_available: [ "myapex" ],
2192 stubs: {
2193 versions: ["1", "2"],
2194 },
2195 }
2196
2197 cc_library {
2198 name: "libz",
2199 shared_libs: ["libx"],
2200 system_shared_libs: [],
2201 stl: "none",
2202 }
2203 `)
2204
2205 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002206 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002207 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2208 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2209 }
2210 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002211 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002212 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2213 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2214 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002215 expectLink("libz", "shared", "libx", "shared_current")
2216 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002217 expectNoLink("libz", "shared", "libz", "shared_1")
2218 expectNoLink("libz", "shared", "libz", "shared")
2219}
2220
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002221var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2222 func(variables android.FixtureProductVariables) {
2223 variables.SanitizeDevice = []string{"hwaddress"}
2224 },
2225)
2226
Jooyung Han75568392020-03-20 04:29:24 +09002227func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002228 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002229 apex {
2230 name: "myapex",
2231 key: "myapex.key",
2232 native_shared_libs: ["libx"],
2233 min_sdk_version: "29",
2234 }
2235
2236 apex_key {
2237 name: "myapex.key",
2238 public_key: "testkey.avbpubkey",
2239 private_key: "testkey.pem",
2240 }
2241
2242 cc_library {
2243 name: "libx",
2244 shared_libs: ["libbar"],
2245 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002246 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002247 }
2248
2249 cc_library {
2250 name: "libbar",
2251 stubs: {
2252 versions: ["29", "30"],
2253 },
2254 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002255 `,
2256 prepareForTestWithSantitizeHwaddress,
2257 )
Jooyung Han03b51852020-02-26 22:45:42 +09002258 expectLink := func(from, from_variant, to, to_variant string) {
2259 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2260 libFlags := ld.Args["libFlags"]
2261 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2262 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002263 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002264}
2265
Jooyung Han75568392020-03-20 04:29:24 +09002266func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002267 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002268 apex {
2269 name: "myapex",
2270 key: "myapex.key",
2271 native_shared_libs: ["libx"],
2272 min_sdk_version: "29",
2273 }
2274
2275 apex_key {
2276 name: "myapex.key",
2277 public_key: "testkey.avbpubkey",
2278 private_key: "testkey.pem",
2279 }
2280
2281 cc_library {
2282 name: "libx",
2283 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002284 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002285 }
Jooyung Han75568392020-03-20 04:29:24 +09002286 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002287
2288 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002289 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002290 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002291 // note that platform variant is not.
2292 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002293 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002294}
2295
Jooyung Han749dc692020-04-15 11:03:39 +09002296func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2297 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002298 apex {
2299 name: "myapex",
2300 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002301 native_shared_libs: ["mylib"],
2302 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002303 }
2304
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
Jooyung Han749dc692020-04-15 11:03:39 +09002310
2311 cc_library {
2312 name: "mylib",
2313 srcs: ["mylib.cpp"],
2314 system_shared_libs: [],
2315 stl: "none",
2316 apex_available: [
2317 "myapex",
2318 ],
2319 min_sdk_version: "30",
2320 }
2321 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002322
2323 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2324 apex {
2325 name: "myapex",
2326 key: "myapex.key",
2327 native_shared_libs: ["libfoo.ffi"],
2328 min_sdk_version: "29",
2329 }
2330
2331 apex_key {
2332 name: "myapex.key",
2333 public_key: "testkey.avbpubkey",
2334 private_key: "testkey.pem",
2335 }
2336
2337 rust_ffi_shared {
2338 name: "libfoo.ffi",
2339 srcs: ["foo.rs"],
2340 crate_name: "foo",
2341 apex_available: [
2342 "myapex",
2343 ],
2344 min_sdk_version: "30",
2345 }
2346 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002347
2348 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2349 apex {
2350 name: "myapex",
2351 key: "myapex.key",
2352 java_libs: ["libfoo"],
2353 min_sdk_version: "29",
2354 }
2355
2356 apex_key {
2357 name: "myapex.key",
2358 public_key: "testkey.avbpubkey",
2359 private_key: "testkey.pem",
2360 }
2361
2362 java_import {
2363 name: "libfoo",
2364 jars: ["libfoo.jar"],
2365 apex_available: [
2366 "myapex",
2367 ],
2368 min_sdk_version: "30",
2369 }
2370 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002371
2372 // Skip check for modules compiling against core API surface
2373 testApex(t, `
2374 apex {
2375 name: "myapex",
2376 key: "myapex.key",
2377 java_libs: ["libfoo"],
2378 min_sdk_version: "29",
2379 }
2380
2381 apex_key {
2382 name: "myapex.key",
2383 public_key: "testkey.avbpubkey",
2384 private_key: "testkey.pem",
2385 }
2386
2387 java_library {
2388 name: "libfoo",
2389 srcs: ["Foo.java"],
2390 apex_available: [
2391 "myapex",
2392 ],
2393 // Compile against core API surface
2394 sdk_version: "core_current",
2395 min_sdk_version: "30",
2396 }
2397 `)
2398
Jooyung Han749dc692020-04-15 11:03:39 +09002399}
2400
2401func TestApexMinSdkVersion_Okay(t *testing.T) {
2402 testApex(t, `
2403 apex {
2404 name: "myapex",
2405 key: "myapex.key",
2406 native_shared_libs: ["libfoo"],
2407 java_libs: ["libbar"],
2408 min_sdk_version: "29",
2409 }
2410
2411 apex_key {
2412 name: "myapex.key",
2413 public_key: "testkey.avbpubkey",
2414 private_key: "testkey.pem",
2415 }
2416
2417 cc_library {
2418 name: "libfoo",
2419 srcs: ["mylib.cpp"],
2420 shared_libs: ["libfoo_dep"],
2421 apex_available: ["myapex"],
2422 min_sdk_version: "29",
2423 }
2424
2425 cc_library {
2426 name: "libfoo_dep",
2427 srcs: ["mylib.cpp"],
2428 apex_available: ["myapex"],
2429 min_sdk_version: "29",
2430 }
2431
2432 java_library {
2433 name: "libbar",
2434 sdk_version: "current",
2435 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002436 static_libs: [
2437 "libbar_dep",
2438 "libbar_import_dep",
2439 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002440 apex_available: ["myapex"],
2441 min_sdk_version: "29",
2442 }
2443
2444 java_library {
2445 name: "libbar_dep",
2446 sdk_version: "current",
2447 srcs: ["a.java"],
2448 apex_available: ["myapex"],
2449 min_sdk_version: "29",
2450 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002451
2452 java_import {
2453 name: "libbar_import_dep",
2454 jars: ["libbar.jar"],
2455 apex_available: ["myapex"],
2456 min_sdk_version: "29",
2457 }
Jooyung Han03b51852020-02-26 22:45:42 +09002458 `)
2459}
2460
Colin Cross8ca61c12022-10-06 21:00:14 -07002461func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2462 // Tests that an apex dependency with min_sdk_version higher than the
2463 // min_sdk_version of the apex is allowed as long as the dependency's
2464 // min_sdk_version is less than or equal to the api level that the
2465 // architecture was introduced in. In this case, arm64 didn't exist
2466 // until api level 21, so the arm64 code will never need to run on
2467 // an api level 20 device, even if other architectures of the apex
2468 // will.
2469 testApex(t, `
2470 apex {
2471 name: "myapex",
2472 key: "myapex.key",
2473 native_shared_libs: ["libfoo"],
2474 min_sdk_version: "20",
2475 }
2476
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482
2483 cc_library {
2484 name: "libfoo",
2485 srcs: ["mylib.cpp"],
2486 apex_available: ["myapex"],
2487 min_sdk_version: "21",
2488 stl: "none",
2489 }
2490 `)
2491}
2492
Artur Satayev8cf899a2020-04-15 17:29:42 +01002493func TestJavaStableSdkVersion(t *testing.T) {
2494 testCases := []struct {
2495 name string
2496 expectedError string
2497 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002498 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002499 }{
2500 {
2501 name: "Non-updatable apex with non-stable dep",
2502 bp: `
2503 apex {
2504 name: "myapex",
2505 java_libs: ["myjar"],
2506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002507 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002508 }
2509 apex_key {
2510 name: "myapex.key",
2511 public_key: "testkey.avbpubkey",
2512 private_key: "testkey.pem",
2513 }
2514 java_library {
2515 name: "myjar",
2516 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002517 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002518 apex_available: ["myapex"],
2519 }
2520 `,
2521 },
2522 {
2523 name: "Updatable apex with stable dep",
2524 bp: `
2525 apex {
2526 name: "myapex",
2527 java_libs: ["myjar"],
2528 key: "myapex.key",
2529 updatable: true,
2530 min_sdk_version: "29",
2531 }
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537 java_library {
2538 name: "myjar",
2539 srcs: ["foo/bar/MyClass.java"],
2540 sdk_version: "current",
2541 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002542 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002543 }
2544 `,
2545 },
2546 {
2547 name: "Updatable apex with non-stable dep",
2548 expectedError: "cannot depend on \"myjar\"",
2549 bp: `
2550 apex {
2551 name: "myapex",
2552 java_libs: ["myjar"],
2553 key: "myapex.key",
2554 updatable: true,
2555 }
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561 java_library {
2562 name: "myjar",
2563 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002564 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002565 apex_available: ["myapex"],
2566 }
2567 `,
2568 },
2569 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002570 name: "Updatable apex with non-stable legacy core platform dep",
2571 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2572 bp: `
2573 apex {
2574 name: "myapex",
2575 java_libs: ["myjar-uses-legacy"],
2576 key: "myapex.key",
2577 updatable: true,
2578 }
2579 apex_key {
2580 name: "myapex.key",
2581 public_key: "testkey.avbpubkey",
2582 private_key: "testkey.pem",
2583 }
2584 java_library {
2585 name: "myjar-uses-legacy",
2586 srcs: ["foo/bar/MyClass.java"],
2587 sdk_version: "core_platform",
2588 apex_available: ["myapex"],
2589 }
2590 `,
2591 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2592 },
2593 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002594 name: "Updatable apex with non-stable transitive dep",
2595 // This is not actually detecting that the transitive dependency is unstable, rather it is
2596 // detecting that the transitive dependency is building against a wider API surface than the
2597 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002598 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002599 bp: `
2600 apex {
2601 name: "myapex",
2602 java_libs: ["myjar"],
2603 key: "myapex.key",
2604 updatable: true,
2605 }
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611 java_library {
2612 name: "myjar",
2613 srcs: ["foo/bar/MyClass.java"],
2614 sdk_version: "current",
2615 apex_available: ["myapex"],
2616 static_libs: ["transitive-jar"],
2617 }
2618 java_library {
2619 name: "transitive-jar",
2620 srcs: ["foo/bar/MyClass.java"],
2621 sdk_version: "core_platform",
2622 apex_available: ["myapex"],
2623 }
2624 `,
2625 },
2626 }
2627
2628 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002629 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2630 continue
2631 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002632 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002633 errorHandler := android.FixtureExpectsNoErrors
2634 if test.expectedError != "" {
2635 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002636 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002637 android.GroupFixturePreparers(
2638 java.PrepareForTestWithJavaDefaultModules,
2639 PrepareForTestWithApexBuildComponents,
2640 prepareForTestWithMyapex,
2641 android.OptionalFixturePreparer(test.preparer),
2642 ).
2643 ExtendWithErrorHandler(errorHandler).
2644 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002645 })
2646 }
2647}
2648
Jooyung Han749dc692020-04-15 11:03:39 +09002649func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2650 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2651 apex {
2652 name: "myapex",
2653 key: "myapex.key",
2654 native_shared_libs: ["mylib"],
2655 min_sdk_version: "29",
2656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 cc_library {
2665 name: "mylib",
2666 srcs: ["mylib.cpp"],
2667 shared_libs: ["mylib2"],
2668 system_shared_libs: [],
2669 stl: "none",
2670 apex_available: [
2671 "myapex",
2672 ],
2673 min_sdk_version: "29",
2674 }
2675
2676 // indirect part of the apex
2677 cc_library {
2678 name: "mylib2",
2679 srcs: ["mylib.cpp"],
2680 system_shared_libs: [],
2681 stl: "none",
2682 apex_available: [
2683 "myapex",
2684 ],
2685 min_sdk_version: "30",
2686 }
2687 `)
2688}
2689
2690func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2691 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2692 apex {
2693 name: "myapex",
2694 key: "myapex.key",
2695 apps: ["AppFoo"],
2696 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002697 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002698 }
2699
2700 apex_key {
2701 name: "myapex.key",
2702 public_key: "testkey.avbpubkey",
2703 private_key: "testkey.pem",
2704 }
2705
2706 android_app {
2707 name: "AppFoo",
2708 srcs: ["foo/bar/MyClass.java"],
2709 sdk_version: "current",
2710 min_sdk_version: "29",
2711 system_modules: "none",
2712 stl: "none",
2713 static_libs: ["bar"],
2714 apex_available: [ "myapex" ],
2715 }
2716
2717 java_library {
2718 name: "bar",
2719 sdk_version: "current",
2720 srcs: ["a.java"],
2721 apex_available: [ "myapex" ],
2722 }
2723 `)
2724}
2725
2726func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002727 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002728 apex {
2729 name: "myapex",
2730 key: "myapex.key",
2731 native_shared_libs: ["mylib"],
2732 min_sdk_version: "29",
2733 }
2734
2735 apex_key {
2736 name: "myapex.key",
2737 public_key: "testkey.avbpubkey",
2738 private_key: "testkey.pem",
2739 }
2740
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002741 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002742 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2743 cc_library {
2744 name: "mylib",
2745 srcs: ["mylib.cpp"],
2746 shared_libs: ["mylib2"],
2747 system_shared_libs: [],
2748 stl: "none",
2749 apex_available: ["myapex", "otherapex"],
2750 min_sdk_version: "29",
2751 }
2752
2753 cc_library {
2754 name: "mylib2",
2755 srcs: ["mylib.cpp"],
2756 system_shared_libs: [],
2757 stl: "none",
2758 apex_available: ["otherapex"],
2759 stubs: { versions: ["29", "30"] },
2760 min_sdk_version: "30",
2761 }
2762
2763 apex {
2764 name: "otherapex",
2765 key: "myapex.key",
2766 native_shared_libs: ["mylib", "mylib2"],
2767 min_sdk_version: "30",
2768 }
2769 `)
2770 expectLink := func(from, from_variant, to, to_variant string) {
2771 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2772 libFlags := ld.Args["libFlags"]
2773 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2774 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002775 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002776 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002777}
2778
Jooyung Haned124c32021-01-26 11:43:46 +09002779func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002780 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2781 func(variables android.FixtureProductVariables) {
2782 variables.Platform_sdk_codename = proptools.StringPtr("S")
2783 variables.Platform_version_active_codenames = []string{"S"}
2784 },
2785 )
Jooyung Haned124c32021-01-26 11:43:46 +09002786 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2787 apex {
2788 name: "myapex",
2789 key: "myapex.key",
2790 native_shared_libs: ["libfoo"],
2791 min_sdk_version: "S",
2792 }
2793 apex_key {
2794 name: "myapex.key",
2795 public_key: "testkey.avbpubkey",
2796 private_key: "testkey.pem",
2797 }
2798 cc_library {
2799 name: "libfoo",
2800 shared_libs: ["libbar"],
2801 apex_available: ["myapex"],
2802 min_sdk_version: "29",
2803 }
2804 cc_library {
2805 name: "libbar",
2806 apex_available: ["myapex"],
2807 }
2808 `, withSAsActiveCodeNames)
2809}
2810
2811func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002812 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2813 variables.Platform_sdk_codename = proptools.StringPtr("S")
2814 variables.Platform_version_active_codenames = []string{"S", "T"}
2815 })
Colin Cross1c460562021-02-16 17:55:47 -08002816 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002817 apex {
2818 name: "myapex",
2819 key: "myapex.key",
2820 native_shared_libs: ["libfoo"],
2821 min_sdk_version: "S",
2822 }
2823 apex_key {
2824 name: "myapex.key",
2825 public_key: "testkey.avbpubkey",
2826 private_key: "testkey.pem",
2827 }
2828 cc_library {
2829 name: "libfoo",
2830 shared_libs: ["libbar"],
2831 apex_available: ["myapex"],
2832 min_sdk_version: "S",
2833 }
2834 cc_library {
2835 name: "libbar",
2836 stubs: {
2837 symbol_file: "libbar.map.txt",
2838 versions: ["30", "S", "T"],
2839 },
2840 }
2841 `, withSAsActiveCodeNames)
2842
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002843 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002844 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2845 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002846 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002847}
2848
Jiyong Park7c2ee712018-12-07 00:42:25 +09002849func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002850 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002851 apex {
2852 name: "myapex",
2853 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002854 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002855 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002856 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002857 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002858 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002859 }
2860
2861 apex_key {
2862 name: "myapex.key",
2863 public_key: "testkey.avbpubkey",
2864 private_key: "testkey.pem",
2865 }
2866
2867 prebuilt_etc {
2868 name: "myetc",
2869 src: "myprebuilt",
2870 sub_dir: "foo/bar",
2871 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002872
2873 cc_library {
2874 name: "mylib",
2875 srcs: ["mylib.cpp"],
2876 relative_install_path: "foo/bar",
2877 system_shared_libs: [],
2878 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002879 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002880 }
2881
2882 cc_binary {
2883 name: "mybin",
2884 srcs: ["mylib.cpp"],
2885 relative_install_path: "foo/bar",
2886 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002887 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002888 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002889 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002890
2891 rust_binary {
2892 name: "mybin.rust",
2893 srcs: ["foo.rs"],
2894 relative_install_path: "rust_subdir",
2895 apex_available: [ "myapex" ],
2896 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002897 `)
2898
Jooyung Hana0503a52023-08-23 13:12:50 +09002899 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002900 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002901
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002902 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002903 ensureContains(t, cmd, "/etc ")
2904 ensureContains(t, cmd, "/etc/foo ")
2905 ensureContains(t, cmd, "/etc/foo/bar ")
2906 ensureContains(t, cmd, "/lib64 ")
2907 ensureContains(t, cmd, "/lib64/foo ")
2908 ensureContains(t, cmd, "/lib64/foo/bar ")
2909 ensureContains(t, cmd, "/lib ")
2910 ensureContains(t, cmd, "/lib/foo ")
2911 ensureContains(t, cmd, "/lib/foo/bar ")
2912 ensureContains(t, cmd, "/bin ")
2913 ensureContains(t, cmd, "/bin/foo ")
2914 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002915 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002916}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002917
Jooyung Han35155c42020-02-06 17:33:20 +09002918func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002919 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002920 apex {
2921 name: "myapex",
2922 key: "myapex.key",
2923 multilib: {
2924 both: {
2925 native_shared_libs: ["mylib"],
2926 binaries: ["mybin"],
2927 },
2928 },
2929 compile_multilib: "both",
2930 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002931 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002932 }
2933
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }
2939
2940 cc_library {
2941 name: "mylib",
2942 relative_install_path: "foo/bar",
2943 system_shared_libs: [],
2944 stl: "none",
2945 apex_available: [ "myapex" ],
2946 native_bridge_supported: true,
2947 }
2948
2949 cc_binary {
2950 name: "mybin",
2951 relative_install_path: "foo/bar",
2952 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002953 stl: "none",
2954 apex_available: [ "myapex" ],
2955 native_bridge_supported: true,
2956 compile_multilib: "both", // default is "first" for binary
2957 multilib: {
2958 lib64: {
2959 suffix: "64",
2960 },
2961 },
2962 }
2963 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002964 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002965 "bin/foo/bar/mybin",
2966 "bin/foo/bar/mybin64",
2967 "bin/arm/foo/bar/mybin",
2968 "bin/arm64/foo/bar/mybin64",
2969 "lib/foo/bar/mylib.so",
2970 "lib/arm/foo/bar/mylib.so",
2971 "lib64/foo/bar/mylib.so",
2972 "lib64/arm64/foo/bar/mylib.so",
2973 })
2974}
2975
Jooyung Han85d61762020-06-24 23:50:26 +09002976func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002977 result := android.GroupFixturePreparers(
2978 prepareForApexTest,
2979 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2980 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002981 apex {
2982 name: "myapex",
2983 key: "myapex.key",
2984 binaries: ["mybin"],
2985 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002986 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002987 }
2988 apex_key {
2989 name: "myapex.key",
2990 public_key: "testkey.avbpubkey",
2991 private_key: "testkey.pem",
2992 }
2993 cc_binary {
2994 name: "mybin",
2995 vendor: true,
2996 shared_libs: ["libfoo"],
2997 }
2998 cc_library {
2999 name: "libfoo",
3000 proprietary: true,
3001 }
3002 `)
3003
Jooyung Hana0503a52023-08-23 13:12:50 +09003004 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003005 "bin/mybin",
3006 "lib64/libfoo.so",
3007 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3008 "lib64/libc++.so",
3009 })
3010
Jooyung Hana0503a52023-08-23 13:12:50 +09003011 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003012 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003013 name := apexBundle.BaseModuleName()
3014 prefix := "TARGET_"
3015 var builder strings.Builder
3016 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003017 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003018 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003019 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003020
Jooyung Hana0503a52023-08-23 13:12:50 +09003021 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003022 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3023 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003024}
3025
Justin Yun13decfb2021-03-08 19:25:55 +09003026func TestProductVariant(t *testing.T) {
3027 ctx := testApex(t, `
3028 apex {
3029 name: "myapex",
3030 key: "myapex.key",
3031 updatable: false,
3032 product_specific: true,
3033 binaries: ["foo"],
3034 }
3035
3036 apex_key {
3037 name: "myapex.key",
3038 public_key: "testkey.avbpubkey",
3039 private_key: "testkey.pem",
3040 }
3041
3042 cc_binary {
3043 name: "foo",
3044 product_available: true,
3045 apex_available: ["myapex"],
3046 srcs: ["foo.cpp"],
3047 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003048 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003049
3050 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003051 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003052 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3053 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3054 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3055 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3056}
3057
Jooyung Han8e5685d2020-09-21 11:02:57 +09003058func TestApex_withPrebuiltFirmware(t *testing.T) {
3059 testCases := []struct {
3060 name string
3061 additionalProp string
3062 }{
3063 {"system apex with prebuilt_firmware", ""},
3064 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3065 }
3066 for _, tc := range testCases {
3067 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003068 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003069 apex {
3070 name: "myapex",
3071 key: "myapex.key",
3072 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003073 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003074 `+tc.additionalProp+`
3075 }
3076 apex_key {
3077 name: "myapex.key",
3078 public_key: "testkey.avbpubkey",
3079 private_key: "testkey.pem",
3080 }
3081 prebuilt_firmware {
3082 name: "myfirmware",
3083 src: "myfirmware.bin",
3084 filename_from_src: true,
3085 `+tc.additionalProp+`
3086 }
3087 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003088 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003089 "etc/firmware/myfirmware.bin",
3090 })
3091 })
3092 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003093}
3094
Jooyung Hanefb184e2020-06-25 17:14:25 +09003095func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003096 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003097 apex {
3098 name: "myapex",
3099 key: "myapex.key",
3100 vendor: true,
3101 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003102 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003103 }
3104
3105 apex_key {
3106 name: "myapex.key",
3107 public_key: "testkey.avbpubkey",
3108 private_key: "testkey.pem",
3109 }
3110
3111 cc_library {
3112 name: "mylib",
3113 vendor_available: true,
3114 }
3115 `)
3116
Jooyung Hana0503a52023-08-23 13:12:50 +09003117 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003118 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003119 name := apexBundle.BaseModuleName()
3120 prefix := "TARGET_"
3121 var builder strings.Builder
3122 data.Custom(&builder, name, prefix, "", data)
3123 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003124 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 +09003125}
3126
Jooyung Han2ed99d02020-06-24 23:26:26 +09003127func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003128 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003129 apex {
3130 name: "myapex",
3131 key: "myapex.key",
3132 vintf_fragments: ["fragment.xml"],
3133 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003134 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003135 }
3136 apex_key {
3137 name: "myapex.key",
3138 public_key: "testkey.avbpubkey",
3139 private_key: "testkey.pem",
3140 }
3141 cc_binary {
3142 name: "mybin",
3143 }
3144 `)
3145
Jooyung Hana0503a52023-08-23 13:12:50 +09003146 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003147 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003148 name := apexBundle.BaseModuleName()
3149 prefix := "TARGET_"
3150 var builder strings.Builder
3151 data.Custom(&builder, name, prefix, "", data)
3152 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003153 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003154 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003155}
3156
Jiyong Park16e91a02018-12-20 18:18:08 +09003157func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003158 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003159 apex {
3160 name: "myapex",
3161 key: "myapex.key",
3162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003163 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003164 }
3165
3166 apex_key {
3167 name: "myapex.key",
3168 public_key: "testkey.avbpubkey",
3169 private_key: "testkey.pem",
3170 }
3171
3172 cc_library {
3173 name: "mylib",
3174 srcs: ["mylib.cpp"],
3175 system_shared_libs: [],
3176 stl: "none",
3177 stubs: {
3178 versions: ["1", "2", "3"],
3179 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003180 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003181 }
3182
3183 cc_binary {
3184 name: "not_in_apex",
3185 srcs: ["mylib.cpp"],
3186 static_libs: ["mylib"],
3187 static_executable: true,
3188 system_shared_libs: [],
3189 stl: "none",
3190 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003191 `)
3192
Colin Cross7113d202019-11-20 16:39:12 -08003193 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003194
3195 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003196 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003197}
Jiyong Park9335a262018-12-24 11:31:58 +09003198
3199func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003200 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003201 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003202 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003203 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003204 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003205 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003206 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003207 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003208 }
3209
3210 cc_library {
3211 name: "mylib",
3212 srcs: ["mylib.cpp"],
3213 system_shared_libs: [],
3214 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003215 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003216 }
3217
3218 apex_key {
3219 name: "myapex.key",
3220 public_key: "testkey.avbpubkey",
3221 private_key: "testkey.pem",
3222 }
3223
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003224 android_app_certificate {
3225 name: "myapex.certificate",
3226 certificate: "testkey",
3227 }
3228
3229 android_app_certificate {
3230 name: "myapex.certificate.override",
3231 certificate: "testkey.override",
3232 }
3233
Jiyong Park9335a262018-12-24 11:31:58 +09003234 `)
3235
3236 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003237 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003238
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003239 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3240 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003241 "vendor/foo/devkeys/testkey.avbpubkey")
3242 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003243 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3244 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003245 "vendor/foo/devkeys/testkey.pem")
3246 }
3247
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003248 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003249 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003250 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003251 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254}
Jiyong Park58e364a2019-01-19 19:24:06 +09003255
Jooyung Hanf121a652019-12-17 14:30:11 +09003256func TestCertificate(t *testing.T) {
3257 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003258 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003259 apex {
3260 name: "myapex",
3261 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003262 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003263 }
3264 apex_key {
3265 name: "myapex.key",
3266 public_key: "testkey.avbpubkey",
3267 private_key: "testkey.pem",
3268 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003269 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003270 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3271 if actual := rule.Args["certificates"]; actual != expected {
3272 t.Errorf("certificates should be %q, not %q", expected, actual)
3273 }
3274 })
3275 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003276 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003277 apex {
3278 name: "myapex_keytest",
3279 key: "myapex.key",
3280 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003281 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003282 }
3283 apex_key {
3284 name: "myapex.key",
3285 public_key: "testkey.avbpubkey",
3286 private_key: "testkey.pem",
3287 }
3288 android_app_certificate {
3289 name: "myapex.certificate.override",
3290 certificate: "testkey.override",
3291 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003292 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003293 expected := "testkey.override.x509.pem testkey.override.pk8"
3294 if actual := rule.Args["certificates"]; actual != expected {
3295 t.Errorf("certificates should be %q, not %q", expected, actual)
3296 }
3297 })
3298 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003299 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003300 apex {
3301 name: "myapex",
3302 key: "myapex.key",
3303 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003304 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 }
3306 apex_key {
3307 name: "myapex.key",
3308 public_key: "testkey.avbpubkey",
3309 private_key: "testkey.pem",
3310 }
3311 android_app_certificate {
3312 name: "myapex.certificate",
3313 certificate: "testkey",
3314 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003315 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003316 expected := "testkey.x509.pem testkey.pk8"
3317 if actual := rule.Args["certificates"]; actual != expected {
3318 t.Errorf("certificates should be %q, not %q", expected, actual)
3319 }
3320 })
3321 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003322 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003323 apex {
3324 name: "myapex_keytest",
3325 key: "myapex.key",
3326 file_contexts: ":myapex-file_contexts",
3327 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003328 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003329 }
3330 apex_key {
3331 name: "myapex.key",
3332 public_key: "testkey.avbpubkey",
3333 private_key: "testkey.pem",
3334 }
3335 android_app_certificate {
3336 name: "myapex.certificate.override",
3337 certificate: "testkey.override",
3338 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003339 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003340 expected := "testkey.override.x509.pem testkey.override.pk8"
3341 if actual := rule.Args["certificates"]; actual != expected {
3342 t.Errorf("certificates should be %q, not %q", expected, actual)
3343 }
3344 })
3345 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
3350 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003351 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003352 }
3353 apex_key {
3354 name: "myapex.key",
3355 public_key: "testkey.avbpubkey",
3356 private_key: "testkey.pem",
3357 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003358 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003359 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3360 if actual := rule.Args["certificates"]; actual != expected {
3361 t.Errorf("certificates should be %q, not %q", expected, actual)
3362 }
3363 })
3364 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003365 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 apex {
3367 name: "myapex_keytest",
3368 key: "myapex.key",
3369 file_contexts: ":myapex-file_contexts",
3370 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003371 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003372 }
3373 apex_key {
3374 name: "myapex.key",
3375 public_key: "testkey.avbpubkey",
3376 private_key: "testkey.pem",
3377 }
3378 android_app_certificate {
3379 name: "myapex.certificate.override",
3380 certificate: "testkey.override",
3381 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003382 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003383 expected := "testkey.override.x509.pem testkey.override.pk8"
3384 if actual := rule.Args["certificates"]; actual != expected {
3385 t.Errorf("certificates should be %q, not %q", expected, actual)
3386 }
3387 })
3388}
3389
Jiyong Park58e364a2019-01-19 19:24:06 +09003390func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003391 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003392 apex {
3393 name: "myapex",
3394 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003395 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003396 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003397 }
3398
3399 apex {
3400 name: "otherapex",
3401 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003402 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003403 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003404 }
3405
3406 apex_key {
3407 name: "myapex.key",
3408 public_key: "testkey.avbpubkey",
3409 private_key: "testkey.pem",
3410 }
3411
3412 cc_library {
3413 name: "mylib",
3414 srcs: ["mylib.cpp"],
3415 system_shared_libs: [],
3416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003417 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003418 "myapex",
3419 "otherapex",
3420 ],
Jooyung Han24282772020-03-21 23:20:55 +09003421 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003422 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003423 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003424 cc_library {
3425 name: "mylib2",
3426 srcs: ["mylib.cpp"],
3427 system_shared_libs: [],
3428 stl: "none",
3429 apex_available: [
3430 "myapex",
3431 "otherapex",
3432 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003433 static_libs: ["mylib3"],
3434 recovery_available: true,
3435 min_sdk_version: "29",
3436 }
3437 cc_library {
3438 name: "mylib3",
3439 srcs: ["mylib.cpp"],
3440 system_shared_libs: [],
3441 stl: "none",
3442 apex_available: [
3443 "myapex",
3444 "otherapex",
3445 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003446 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003447 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003448 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003449 `)
3450
Jooyung Hanc87a0592020-03-02 17:44:33 +09003451 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003452 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003453 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003454
Vinh Tranf9754732023-01-19 22:41:46 -05003455 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003456 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003457 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003458
Vinh Tranf9754732023-01-19 22:41:46 -05003459 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003460 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003461 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003462
Colin Crossaede88c2020-08-11 12:17:01 -07003463 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3464 // each variant defines additional macros to distinguish which apex variant it is built for
3465
3466 // non-APEX variant does not have __ANDROID_APEX__ defined
3467 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3468 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3469
Vinh Tranf9754732023-01-19 22:41:46 -05003470 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003471 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3472 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003473
Jooyung Hanc87a0592020-03-02 17:44:33 +09003474 // non-APEX variant does not have __ANDROID_APEX__ defined
3475 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3476 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3477
Vinh Tranf9754732023-01-19 22:41:46 -05003478 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003479 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003480 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003481}
Jiyong Park7e636d02019-01-28 16:16:54 +09003482
3483func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003484 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003485 apex {
3486 name: "myapex",
3487 key: "myapex.key",
3488 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003490 }
3491
3492 apex_key {
3493 name: "myapex.key",
3494 public_key: "testkey.avbpubkey",
3495 private_key: "testkey.pem",
3496 }
3497
3498 cc_library_headers {
3499 name: "mylib_headers",
3500 export_include_dirs: ["my_include"],
3501 system_shared_libs: [],
3502 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003503 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003504 }
3505
3506 cc_library {
3507 name: "mylib",
3508 srcs: ["mylib.cpp"],
3509 system_shared_libs: [],
3510 stl: "none",
3511 header_libs: ["mylib_headers"],
3512 export_header_lib_headers: ["mylib_headers"],
3513 stubs: {
3514 versions: ["1", "2", "3"],
3515 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003516 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003517 }
3518
3519 cc_library {
3520 name: "otherlib",
3521 srcs: ["mylib.cpp"],
3522 system_shared_libs: [],
3523 stl: "none",
3524 shared_libs: ["mylib"],
3525 }
3526 `)
3527
Colin Cross7113d202019-11-20 16:39:12 -08003528 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003529
3530 // Ensure that the include path of the header lib is exported to 'otherlib'
3531 ensureContains(t, cFlags, "-Imy_include")
3532}
Alex Light9670d332019-01-29 18:07:33 -08003533
Jiyong Park7cd10e32020-01-14 09:22:18 +09003534type fileInApex struct {
3535 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003536 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003537 isLink bool
3538}
3539
Jooyung Han1724d582022-12-21 10:17:44 +09003540func (f fileInApex) String() string {
3541 return f.src + ":" + f.path
3542}
3543
3544func (f fileInApex) match(expectation string) bool {
3545 parts := strings.Split(expectation, ":")
3546 if len(parts) == 1 {
3547 match, _ := path.Match(parts[0], f.path)
3548 return match
3549 }
3550 if len(parts) == 2 {
3551 matchSrc, _ := path.Match(parts[0], f.src)
3552 matchDst, _ := path.Match(parts[1], f.path)
3553 return matchSrc && matchDst
3554 }
3555 panic("invalid expected file specification: " + expectation)
3556}
3557
Jooyung Hana57af4a2020-01-23 05:36:59 +00003558func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003559 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003560 module := ctx.ModuleForTests(moduleName, variant)
3561 apexRule := module.MaybeRule("apexRule")
3562 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003563 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003565 for _, cmd := range strings.Split(copyCmds, "&&") {
3566 cmd = strings.TrimSpace(cmd)
3567 if cmd == "" {
3568 continue
3569 }
3570 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003571 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003572 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003573 switch terms[0] {
3574 case "mkdir":
3575 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003576 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003577 t.Fatal("copyCmds contains invalid cp command", cmd)
3578 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003580 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003581 isLink = false
3582 case "ln":
3583 if len(terms) != 3 && len(terms) != 4 {
3584 // ln LINK TARGET or ln -s LINK TARGET
3585 t.Fatal("copyCmds contains invalid ln command", cmd)
3586 }
3587 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003588 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003589 isLink = true
3590 default:
3591 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3592 }
3593 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003594 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003595 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003596 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003597 }
Jooyung Han1724d582022-12-21 10:17:44 +09003598 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003599 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 }
3601 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003602 return ret
3603}
3604
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003605func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003606 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 var failed bool
3608 var surplus []string
3609 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003610 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003611 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003612 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003613 if file.match(expected) {
3614 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003615 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003616 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 }
3618 }
Jooyung Han1724d582022-12-21 10:17:44 +09003619 if !matchFound {
3620 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003621 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003623
Jooyung Han31c470b2019-10-18 16:26:59 +09003624 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003625 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 t.Log("surplus files", surplus)
3627 failed = true
3628 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003629
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003630 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003631 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003632 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003633 if !filesMatched[expected] {
3634 missing = append(missing, expected)
3635 }
3636 }
3637 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003638 t.Log("missing files", missing)
3639 failed = true
3640 }
3641 if failed {
3642 t.Fail()
3643 }
3644}
3645
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003646func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3647 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3648}
3649
3650func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003651 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003652 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3653 if deapexer.Output != nil {
3654 outputs = append(outputs, deapexer.Output.String())
3655 }
3656 for _, output := range deapexer.ImplicitOutputs {
3657 outputs = append(outputs, output.String())
3658 }
3659 actualFiles := make([]fileInApex, 0, len(outputs))
3660 for _, output := range outputs {
3661 dir := "/deapexer/"
3662 pos := strings.LastIndex(output, dir)
3663 if pos == -1 {
3664 t.Fatal("Unknown deapexer output ", output)
3665 }
3666 path := output[pos+len(dir):]
3667 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3668 }
3669 assertFileListEquals(t, files, actualFiles)
3670}
3671
Jooyung Han39edb6c2019-11-06 16:53:07 +09003672func vndkLibrariesTxtFiles(vers ...string) (result string) {
3673 for _, v := range vers {
3674 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003675 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003677 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003679 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003680 }
3681 `
3682 }
Justin Yund5784122023-10-25 13:25:32 +09003683 result += `
3684 llndk_libraries_txt {
3685 name: "llndk.libraries.txt",
3686 }
3687 llndk_libraries_txt_for_apex {
3688 name: "llndk.libraries.txt.apex",
3689 stem: "llndk.libraries.txt",
3690 insert_vndk_version: true,
3691 }
3692 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003693 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003694 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003695 result += `
3696 prebuilt_etc {
3697 name: "` + txt + `.libraries.` + v + `.txt",
3698 src: "dummy.txt",
3699 }
3700 `
3701 }
3702 }
3703 }
3704 return
3705}
3706
Jooyung Han344d5432019-08-23 11:17:39 +09003707func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003708 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003709 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003710 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003711 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003712 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003713 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003714 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003715 }
3716
3717 apex_key {
3718 name: "myapex.key",
3719 public_key: "testkey.avbpubkey",
3720 private_key: "testkey.pem",
3721 }
3722
Jooyung Han31c470b2019-10-18 16:26:59 +09003723 vndk_prebuilt_shared {
3724 name: "libvndk27",
3725 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003726 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003727 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003728 vndk: {
3729 enabled: true,
3730 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003731 target_arch: "arm64",
3732 arch: {
3733 arm: {
3734 srcs: ["libvndk27_arm.so"],
3735 },
3736 arm64: {
3737 srcs: ["libvndk27_arm64.so"],
3738 },
3739 },
Colin Cross2807f002021-03-02 10:15:29 -08003740 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003741 }
3742
3743 vndk_prebuilt_shared {
3744 name: "libvndk27",
3745 version: "27",
3746 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003747 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003748 vndk: {
3749 enabled: true,
3750 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 target_arch: "x86_64",
3752 arch: {
3753 x86: {
3754 srcs: ["libvndk27_x86.so"],
3755 },
3756 x86_64: {
3757 srcs: ["libvndk27_x86_64.so"],
3758 },
3759 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003760 }
3761 `+vndkLibrariesTxtFiles("27"),
3762 withFiles(map[string][]byte{
3763 "libvndk27_arm.so": nil,
3764 "libvndk27_arm64.so": nil,
3765 "libvndk27_x86.so": nil,
3766 "libvndk27_x86_64.so": nil,
3767 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003768
Jooyung Hana0503a52023-08-23 13:12:50 +09003769 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003770 "lib/libvndk27_arm.so",
3771 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003772 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003773 })
Jooyung Han344d5432019-08-23 11:17:39 +09003774}
3775
Jooyung Han90eee022019-10-01 20:02:42 +09003776func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003777 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003778 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003779 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003780 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003782 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003783 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003784 }
3785 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003786 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003787 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003788 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003789 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003790 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003791 }
3792 apex_key {
3793 name: "myapex.key",
3794 public_key: "testkey.avbpubkey",
3795 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003796 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003797
3798 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003799 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003800 apexManifestRule := module.Rule("apexManifestRule")
3801 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003802 }
3803
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003804 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003805 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003806}
3807
Jooyung Han344d5432019-08-23 11:17:39 +09003808func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003809 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003810 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003811 name: "com.android.vndk.current",
3812 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003813 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003814 native_bridge_supported: true,
3815 }
3816
3817 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003818 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003819 public_key: "testkey.avbpubkey",
3820 private_key: "testkey.pem",
3821 }
3822
3823 cc_library {
3824 name: "libvndk",
3825 srcs: ["mylib.cpp"],
3826 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003827 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003828 native_bridge_supported: true,
3829 host_supported: true,
3830 vndk: {
3831 enabled: true,
3832 },
3833 system_shared_libs: [],
3834 stl: "none",
3835 }
3836 `)
3837}
3838
Jooyung Han31c470b2019-10-18 16:26:59 +09003839func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003840 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003842 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003843 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003844 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003845 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003846 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 }
3848
3849 apex_key {
3850 name: "myapex.key",
3851 public_key: "testkey.avbpubkey",
3852 private_key: "testkey.pem",
3853 }
3854
3855 vndk_prebuilt_shared {
3856 name: "libvndk27",
3857 version: "27",
3858 target_arch: "arm",
3859 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003860 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003861 vndk: {
3862 enabled: true,
3863 },
3864 arch: {
3865 arm: {
3866 srcs: ["libvndk27.so"],
3867 }
3868 },
3869 }
3870
3871 vndk_prebuilt_shared {
3872 name: "libvndk27",
3873 version: "27",
3874 target_arch: "arm",
3875 binder32bit: true,
3876 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003877 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003878 vndk: {
3879 enabled: true,
3880 },
3881 arch: {
3882 arm: {
3883 srcs: ["libvndk27binder32.so"],
3884 }
3885 },
Colin Cross2807f002021-03-02 10:15:29 -08003886 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003887 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003889 withFiles(map[string][]byte{
3890 "libvndk27.so": nil,
3891 "libvndk27binder32.so": nil,
3892 }),
3893 withBinder32bit,
3894 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003895 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003896 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3897 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003898 },
3899 }),
3900 )
3901
Jooyung Hana0503a52023-08-23 13:12:50 +09003902 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003903 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003904 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003905 })
3906}
3907
Jooyung Hane3f02812023-05-08 13:54:50 +09003908func TestVendorApexWithVndkPrebuilts(t *testing.T) {
3909 ctx := testApex(t, "",
3910 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3911 variables.DeviceVndkVersion = proptools.StringPtr("27")
3912 }),
3913 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
3914 cc.RegisterVendorSnapshotModules(ctx)
3915 }),
3916 withFiles(map[string][]byte{
3917 "vendor/foo/Android.bp": []byte(`
3918 apex {
3919 name: "myapex",
3920 binaries: ["foo"],
3921 key: "myapex.key",
3922 min_sdk_version: "27",
3923 vendor: true,
3924 }
3925
3926 cc_binary {
3927 name: "foo",
3928 vendor: true,
3929 srcs: ["abc.cpp"],
3930 shared_libs: [
3931 "libllndk",
3932 "libvndk",
3933 ],
3934 nocrt: true,
3935 system_shared_libs: [],
3936 min_sdk_version: "27",
3937 }
3938
3939 apex_key {
3940 name: "myapex.key",
3941 public_key: "testkey.avbpubkey",
3942 private_key: "testkey.pem",
3943 }
3944 `),
3945 // Simulate VNDK prebuilts with vendor_snapshot
3946 "prebuilts/vndk/Android.bp": []byte(`
3947 vndk_prebuilt_shared {
3948 name: "libllndk",
3949 version: "27",
3950 vendor_available: true,
3951 product_available: true,
3952 target_arch: "arm64",
3953 arch: {
3954 arm64: {
3955 srcs: ["libllndk.so"],
3956 },
3957 },
3958 }
3959
3960 vndk_prebuilt_shared {
3961 name: "libvndk",
3962 version: "27",
3963 vendor_available: true,
3964 product_available: true,
3965 target_arch: "arm64",
3966 arch: {
3967 arm64: {
3968 srcs: ["libvndk.so"],
3969 },
3970 },
3971 vndk: {
3972 enabled: true,
3973 },
3974 min_sdk_version: "27",
3975 }
3976
3977 vndk_prebuilt_shared {
3978 name: "libc++",
3979 version: "27",
3980 target_arch: "arm64",
3981 vendor_available: true,
3982 product_available: true,
3983 vndk: {
3984 enabled: true,
3985 support_system_process: true,
3986 },
3987 arch: {
3988 arm64: {
3989 srcs: ["libc++.so"],
3990 },
3991 },
3992 min_sdk_version: "apex_inherit",
3993 }
3994
3995 vendor_snapshot {
3996 name: "vendor_snapshot",
3997 version: "27",
3998 arch: {
3999 arm64: {
4000 vndk_libs: [
4001 "libc++",
4002 "libllndk",
4003 "libvndk",
4004 ],
4005 static_libs: [
4006 "libc++demangle",
4007 "libclang_rt.builtins",
4008 "libunwind",
4009 ],
4010 },
4011 }
4012 }
4013
4014 vendor_snapshot_static {
4015 name: "libclang_rt.builtins",
4016 version: "27",
4017 target_arch: "arm64",
4018 vendor: true,
4019 arch: {
4020 arm64: {
4021 src: "libclang_rt.builtins-aarch64-android.a",
4022 },
4023 },
4024 }
4025
4026 vendor_snapshot_static {
4027 name: "libc++demangle",
4028 version: "27",
4029 target_arch: "arm64",
4030 compile_multilib: "64",
4031 vendor: true,
4032 arch: {
4033 arm64: {
4034 src: "libc++demangle.a",
4035 },
4036 },
4037 min_sdk_version: "apex_inherit",
4038 }
4039
4040 vendor_snapshot_static {
4041 name: "libunwind",
4042 version: "27",
4043 target_arch: "arm64",
4044 compile_multilib: "64",
4045 vendor: true,
4046 arch: {
4047 arm64: {
4048 src: "libunwind.a",
4049 },
4050 },
4051 min_sdk_version: "apex_inherit",
4052 }
4053 `),
4054 }))
4055
4056 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004057 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004058 "bin/foo",
4059 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4060 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4061 })
4062
4063 // Should link foo with prebuilt libraries (shared/static)
4064 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4065 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4066 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4067 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4068 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4069
4070 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004071 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004072 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4073 ensureListContains(t, requireNativeLibs, "libllndk.so")
4074}
4075
Jooyung Hane1633032019-08-01 17:41:43 +09004076func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004077 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004078 apex {
4079 name: "myapex_nodep",
4080 key: "myapex.key",
4081 native_shared_libs: ["lib_nodep"],
4082 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004083 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004084 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004085 }
4086
4087 apex {
4088 name: "myapex_dep",
4089 key: "myapex.key",
4090 native_shared_libs: ["lib_dep"],
4091 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004092 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004093 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004094 }
4095
4096 apex {
4097 name: "myapex_provider",
4098 key: "myapex.key",
4099 native_shared_libs: ["libfoo"],
4100 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004102 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004103 }
4104
4105 apex {
4106 name: "myapex_selfcontained",
4107 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004108 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004109 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004110 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004111 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004112 }
4113
4114 apex_key {
4115 name: "myapex.key",
4116 public_key: "testkey.avbpubkey",
4117 private_key: "testkey.pem",
4118 }
4119
4120 cc_library {
4121 name: "lib_nodep",
4122 srcs: ["mylib.cpp"],
4123 system_shared_libs: [],
4124 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004125 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004126 }
4127
4128 cc_library {
4129 name: "lib_dep",
4130 srcs: ["mylib.cpp"],
4131 shared_libs: ["libfoo"],
4132 system_shared_libs: [],
4133 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004134 apex_available: [
4135 "myapex_dep",
4136 "myapex_provider",
4137 "myapex_selfcontained",
4138 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004139 }
4140
4141 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004142 name: "lib_dep_on_bar",
4143 srcs: ["mylib.cpp"],
4144 shared_libs: ["libbar"],
4145 system_shared_libs: [],
4146 stl: "none",
4147 apex_available: [
4148 "myapex_selfcontained",
4149 ],
4150 }
4151
4152
4153 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004154 name: "libfoo",
4155 srcs: ["mytest.cpp"],
4156 stubs: {
4157 versions: ["1"],
4158 },
4159 system_shared_libs: [],
4160 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004161 apex_available: [
4162 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004163 ],
4164 }
4165
4166 cc_library {
4167 name: "libbar",
4168 srcs: ["mytest.cpp"],
4169 stubs: {
4170 versions: ["1"],
4171 },
4172 system_shared_libs: [],
4173 stl: "none",
4174 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004175 "myapex_selfcontained",
4176 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004177 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004178
Jooyung Hane1633032019-08-01 17:41:43 +09004179 `)
4180
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004181 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004182 var provideNativeLibs, requireNativeLibs []string
4183
Jooyung Hana0503a52023-08-23 13:12:50 +09004184 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004185 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4186 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004187 ensureListEmpty(t, provideNativeLibs)
4188 ensureListEmpty(t, requireNativeLibs)
4189
Jooyung Hana0503a52023-08-23 13:12:50 +09004190 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004191 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4192 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004193 ensureListEmpty(t, provideNativeLibs)
4194 ensureListContains(t, requireNativeLibs, "libfoo.so")
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004197 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4198 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004199 ensureListContains(t, provideNativeLibs, "libfoo.so")
4200 ensureListEmpty(t, requireNativeLibs)
4201
Jooyung Hana0503a52023-08-23 13:12:50 +09004202 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004203 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4204 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004205 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004206 ensureListEmpty(t, requireNativeLibs)
4207}
4208
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004209func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4210 ctx := testApex(t, `
4211 apex {
4212 name: "myapex",
4213 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004214 native_shared_libs: ["mylib"],
4215 updatable: false,
4216 }
4217
4218 apex_key {
4219 name: "myapex.key",
4220 public_key: "testkey.avbpubkey",
4221 private_key: "testkey.pem",
4222 }
4223
4224 cc_library {
4225 name: "mylib",
4226 srcs: ["mylib.cpp"],
4227 system_shared_libs: [],
4228 stl: "none",
4229 apex_available: [
4230 "//apex_available:platform",
4231 "myapex",
4232 ],
4233 }
4234 `, android.FixtureMergeEnv(map[string]string{
4235 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4236 }))
4237
Jooyung Hana0503a52023-08-23 13:12:50 +09004238 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004239 apexManifestRule := module.Rule("apexManifestRule")
4240 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4241}
4242
Vinh Tran8f5310f2022-10-07 18:16:47 -04004243func TestCompileMultilibProp(t *testing.T) {
4244 testCases := []struct {
4245 compileMultiLibProp string
4246 containedLibs []string
4247 notContainedLibs []string
4248 }{
4249 {
4250 containedLibs: []string{
4251 "image.apex/lib64/mylib.so",
4252 "image.apex/lib/mylib.so",
4253 },
4254 compileMultiLibProp: `compile_multilib: "both",`,
4255 },
4256 {
4257 containedLibs: []string{"image.apex/lib64/mylib.so"},
4258 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4259 compileMultiLibProp: `compile_multilib: "first",`,
4260 },
4261 {
4262 containedLibs: []string{"image.apex/lib64/mylib.so"},
4263 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4264 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4265 },
4266 {
4267 containedLibs: []string{"image.apex/lib64/mylib.so"},
4268 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4269 compileMultiLibProp: `compile_multilib: "64",`,
4270 },
4271 {
4272 containedLibs: []string{"image.apex/lib/mylib.so"},
4273 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4274 compileMultiLibProp: `compile_multilib: "32",`,
4275 },
4276 }
4277 for _, testCase := range testCases {
4278 ctx := testApex(t, fmt.Sprintf(`
4279 apex {
4280 name: "myapex",
4281 key: "myapex.key",
4282 %s
4283 native_shared_libs: ["mylib"],
4284 updatable: false,
4285 }
4286 apex_key {
4287 name: "myapex.key",
4288 public_key: "testkey.avbpubkey",
4289 private_key: "testkey.pem",
4290 }
4291 cc_library {
4292 name: "mylib",
4293 srcs: ["mylib.cpp"],
4294 apex_available: [
4295 "//apex_available:platform",
4296 "myapex",
4297 ],
4298 }
4299 `, testCase.compileMultiLibProp),
4300 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004302 apexRule := module.Rule("apexRule")
4303 copyCmds := apexRule.Args["copy_commands"]
4304 for _, containedLib := range testCase.containedLibs {
4305 ensureContains(t, copyCmds, containedLib)
4306 }
4307 for _, notContainedLib := range testCase.notContainedLibs {
4308 ensureNotContains(t, copyCmds, notContainedLib)
4309 }
4310 }
4311}
4312
Alex Light0851b882019-02-07 13:20:53 -08004313func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004314 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004315 apex {
4316 name: "myapex",
4317 key: "myapex.key",
4318 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004319 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004320 }
4321
4322 apex_key {
4323 name: "myapex.key",
4324 public_key: "testkey.avbpubkey",
4325 private_key: "testkey.pem",
4326 }
4327
4328 cc_library {
4329 name: "mylib_common",
4330 srcs: ["mylib.cpp"],
4331 system_shared_libs: [],
4332 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004333 apex_available: [
4334 "//apex_available:platform",
4335 "myapex",
4336 ],
Alex Light0851b882019-02-07 13:20:53 -08004337 }
4338 `)
4339
Jooyung Hana0503a52023-08-23 13:12:50 +09004340 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004341 apexRule := module.Rule("apexRule")
4342 copyCmds := apexRule.Args["copy_commands"]
4343
4344 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4345 t.Log("Apex was a test apex!")
4346 t.Fail()
4347 }
4348 // Ensure that main rule creates an output
4349 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4350
4351 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004352 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004353
4354 // Ensure that both direct and indirect deps are copied into apex
4355 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4356
Colin Cross7113d202019-11-20 16:39:12 -08004357 // Ensure that the platform variant ends with _shared
4358 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004359
Colin Cross56a83212020-09-15 18:30:11 -07004360 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004361 t.Log("Found mylib_common not in any apex!")
4362 t.Fail()
4363 }
4364}
4365
4366func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004367 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004368 apex_test {
4369 name: "myapex",
4370 key: "myapex.key",
4371 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004372 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004373 }
4374
4375 apex_key {
4376 name: "myapex.key",
4377 public_key: "testkey.avbpubkey",
4378 private_key: "testkey.pem",
4379 }
4380
4381 cc_library {
4382 name: "mylib_common_test",
4383 srcs: ["mylib.cpp"],
4384 system_shared_libs: [],
4385 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004386 // TODO: remove //apex_available:platform
4387 apex_available: [
4388 "//apex_available:platform",
4389 "myapex",
4390 ],
Alex Light0851b882019-02-07 13:20:53 -08004391 }
4392 `)
4393
Jooyung Hana0503a52023-08-23 13:12:50 +09004394 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004395 apexRule := module.Rule("apexRule")
4396 copyCmds := apexRule.Args["copy_commands"]
4397
4398 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4399 t.Log("Apex was not a test apex!")
4400 t.Fail()
4401 }
4402 // Ensure that main rule creates an output
4403 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4404
4405 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004406 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004407
4408 // Ensure that both direct and indirect deps are copied into apex
4409 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4410
Colin Cross7113d202019-11-20 16:39:12 -08004411 // Ensure that the platform variant ends with _shared
4412 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004413}
4414
Jooyung Han85707de2023-12-01 14:21:13 +09004415func TestLibzVendorIsntStable(t *testing.T) {
4416 ctx := testApex(t, `
4417 apex {
4418 name: "myapex",
4419 key: "myapex.key",
4420 updatable: false,
4421 binaries: ["mybin"],
4422 }
4423 apex {
4424 name: "myvendorapex",
4425 key: "myapex.key",
4426 file_contexts: "myvendorapex_file_contexts",
4427 vendor: true,
4428 updatable: false,
4429 binaries: ["mybin"],
4430 }
4431 apex_key {
4432 name: "myapex.key",
4433 public_key: "testkey.avbpubkey",
4434 private_key: "testkey.pem",
4435 }
4436 cc_binary {
4437 name: "mybin",
4438 vendor_available: true,
4439 system_shared_libs: [],
4440 stl: "none",
4441 shared_libs: ["libz"],
4442 apex_available: ["//apex_available:anyapex"],
4443 }
4444 cc_library {
4445 name: "libz",
4446 vendor_available: true,
4447 system_shared_libs: [],
4448 stl: "none",
4449 stubs: {
4450 versions: ["28", "30"],
4451 },
4452 target: {
4453 vendor: {
4454 no_stubs: true,
4455 },
4456 },
4457 }
4458 `, withFiles(map[string][]byte{
4459 "myvendorapex_file_contexts": nil,
4460 }))
4461
4462 // libz provides stubs for core variant.
4463 {
4464 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4465 "bin/mybin",
4466 })
4467 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4468 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4469 }
4470 // libz doesn't provide stubs for vendor variant.
4471 {
4472 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4473 "bin/mybin",
4474 "lib64/libz.so",
4475 })
4476 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4477 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4478 }
4479}
4480
Alex Light9670d332019-01-29 18:07:33 -08004481func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004482 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004483 apex {
4484 name: "myapex",
4485 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004486 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004487 multilib: {
4488 first: {
4489 native_shared_libs: ["mylib_common"],
4490 }
4491 },
4492 target: {
4493 android: {
4494 multilib: {
4495 first: {
4496 native_shared_libs: ["mylib"],
4497 }
4498 }
4499 },
4500 host: {
4501 multilib: {
4502 first: {
4503 native_shared_libs: ["mylib2"],
4504 }
4505 }
4506 }
4507 }
4508 }
4509
4510 apex_key {
4511 name: "myapex.key",
4512 public_key: "testkey.avbpubkey",
4513 private_key: "testkey.pem",
4514 }
4515
4516 cc_library {
4517 name: "mylib",
4518 srcs: ["mylib.cpp"],
4519 system_shared_libs: [],
4520 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004521 // TODO: remove //apex_available:platform
4522 apex_available: [
4523 "//apex_available:platform",
4524 "myapex",
4525 ],
Alex Light9670d332019-01-29 18:07:33 -08004526 }
4527
4528 cc_library {
4529 name: "mylib_common",
4530 srcs: ["mylib.cpp"],
4531 system_shared_libs: [],
4532 stl: "none",
4533 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004534 // TODO: remove //apex_available:platform
4535 apex_available: [
4536 "//apex_available:platform",
4537 "myapex",
4538 ],
Alex Light9670d332019-01-29 18:07:33 -08004539 }
4540
4541 cc_library {
4542 name: "mylib2",
4543 srcs: ["mylib.cpp"],
4544 system_shared_libs: [],
4545 stl: "none",
4546 compile_multilib: "first",
4547 }
4548 `)
4549
Jooyung Hana0503a52023-08-23 13:12:50 +09004550 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004551 copyCmds := apexRule.Args["copy_commands"]
4552
4553 // Ensure that main rule creates an output
4554 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4555
4556 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004557 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4558 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4559 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004560
4561 // Ensure that both direct and indirect deps are copied into apex
4562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4563 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4564 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4565
Colin Cross7113d202019-11-20 16:39:12 -08004566 // Ensure that the platform variant ends with _shared
4567 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4569 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004570}
Jiyong Park04480cf2019-02-06 00:16:29 +09004571
Jiyong Park59140302020-12-14 18:44:04 +09004572func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004573 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004577 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004578 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004579 arch: {
4580 arm64: {
4581 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004582 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004583 },
4584 x86_64: {
4585 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004586 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004587 },
4588 }
4589 }
4590
4591 apex_key {
4592 name: "myapex.key",
4593 public_key: "testkey.avbpubkey",
4594 private_key: "testkey.pem",
4595 }
4596
4597 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004598 name: "mylib.generic",
4599 srcs: ["mylib.cpp"],
4600 system_shared_libs: [],
4601 stl: "none",
4602 // TODO: remove //apex_available:platform
4603 apex_available: [
4604 "//apex_available:platform",
4605 "myapex",
4606 ],
4607 }
4608
4609 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004610 name: "mylib.arm64",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 // TODO: remove //apex_available:platform
4615 apex_available: [
4616 "//apex_available:platform",
4617 "myapex",
4618 ],
4619 }
4620
4621 cc_library {
4622 name: "mylib.x64",
4623 srcs: ["mylib.cpp"],
4624 system_shared_libs: [],
4625 stl: "none",
4626 // TODO: remove //apex_available:platform
4627 apex_available: [
4628 "//apex_available:platform",
4629 "myapex",
4630 ],
4631 }
4632 `)
4633
Jooyung Hana0503a52023-08-23 13:12:50 +09004634 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 // Ensure that apex variant is created for the direct dep
4638 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004639 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004640 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4641
4642 // Ensure that both direct and indirect deps are copied into apex
4643 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4644 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4645}
4646
Jiyong Park04480cf2019-02-06 00:16:29 +09004647func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004648 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004649 apex {
4650 name: "myapex",
4651 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004652 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004653 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004654 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004655 }
4656
4657 apex_key {
4658 name: "myapex.key",
4659 public_key: "testkey.avbpubkey",
4660 private_key: "testkey.pem",
4661 }
4662
4663 sh_binary {
4664 name: "myscript",
4665 src: "mylib.cpp",
4666 filename: "myscript.sh",
4667 sub_dir: "script",
4668 }
4669 `)
4670
Jooyung Hana0503a52023-08-23 13:12:50 +09004671 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004672 copyCmds := apexRule.Args["copy_commands"]
4673
4674 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4675}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004676
Jooyung Han91df2082019-11-20 01:49:42 +09004677func TestApexInVariousPartition(t *testing.T) {
4678 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004679 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004680 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004681 {"", "system"},
4682 {"product_specific: true", "product"},
4683 {"soc_specific: true", "vendor"},
4684 {"proprietary: true", "vendor"},
4685 {"vendor: true", "vendor"},
4686 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004687 }
4688 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004689 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004690 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004691 apex {
4692 name: "myapex",
4693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004694 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004695 `+tc.propName+`
4696 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004697
Jooyung Han91df2082019-11-20 01:49:42 +09004698 apex_key {
4699 name: "myapex.key",
4700 public_key: "testkey.avbpubkey",
4701 private_key: "testkey.pem",
4702 }
4703 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004704
Jooyung Hana0503a52023-08-23 13:12:50 +09004705 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004706 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004707 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004708 if actual != expected {
4709 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4710 }
Jooyung Han91df2082019-11-20 01:49:42 +09004711 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004712 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004713}
Jiyong Park67882562019-03-21 01:11:21 +09004714
Jooyung Han580eb4f2020-06-24 19:33:06 +09004715func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004716 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004717 apex {
4718 name: "myapex",
4719 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004720 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004721 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004722
Jooyung Han580eb4f2020-06-24 19:33:06 +09004723 apex_key {
4724 name: "myapex.key",
4725 public_key: "testkey.avbpubkey",
4726 private_key: "testkey.pem",
4727 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004728 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004729 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004730 rule := module.Output("file_contexts")
4731 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4732}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004733
Jooyung Han580eb4f2020-06-24 19:33:06 +09004734func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004735 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004736 apex {
4737 name: "myapex",
4738 key: "myapex.key",
4739 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004740 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004741 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004742
Jooyung Han580eb4f2020-06-24 19:33:06 +09004743 apex_key {
4744 name: "myapex.key",
4745 public_key: "testkey.avbpubkey",
4746 private_key: "testkey.pem",
4747 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004748 `, withFiles(map[string][]byte{
4749 "my_own_file_contexts": nil,
4750 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004751}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004752
Jooyung Han580eb4f2020-06-24 19:33:06 +09004753func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004754 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004755 apex {
4756 name: "myapex",
4757 key: "myapex.key",
4758 product_specific: true,
4759 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004760 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004761 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004762
Jooyung Han580eb4f2020-06-24 19:33:06 +09004763 apex_key {
4764 name: "myapex.key",
4765 public_key: "testkey.avbpubkey",
4766 private_key: "testkey.pem",
4767 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004768 `)
4769
Colin Cross1c460562021-02-16 17:55:47 -08004770 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004771 apex {
4772 name: "myapex",
4773 key: "myapex.key",
4774 product_specific: true,
4775 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004776 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004777 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004778
Jooyung Han580eb4f2020-06-24 19:33:06 +09004779 apex_key {
4780 name: "myapex.key",
4781 public_key: "testkey.avbpubkey",
4782 private_key: "testkey.pem",
4783 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004784 `, withFiles(map[string][]byte{
4785 "product_specific_file_contexts": nil,
4786 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004787 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004788 rule := module.Output("file_contexts")
4789 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4790}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004793 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 apex {
4795 name: "myapex",
4796 key: "myapex.key",
4797 product_specific: true,
4798 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004799 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801
Jooyung Han580eb4f2020-06-24 19:33:06 +09004802 apex_key {
4803 name: "myapex.key",
4804 public_key: "testkey.avbpubkey",
4805 private_key: "testkey.pem",
4806 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004807
Jooyung Han580eb4f2020-06-24 19:33:06 +09004808 filegroup {
4809 name: "my-file-contexts",
4810 srcs: ["product_specific_file_contexts"],
4811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812 `, withFiles(map[string][]byte{
4813 "product_specific_file_contexts": nil,
4814 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004815 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816 rule := module.Output("file_contexts")
4817 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004818}
4819
Jiyong Park67882562019-03-21 01:11:21 +09004820func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004821 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004822 apex_key {
4823 name: "myapex.key",
4824 public_key: ":my.avbpubkey",
4825 private_key: ":my.pem",
4826 product_specific: true,
4827 }
4828
4829 filegroup {
4830 name: "my.avbpubkey",
4831 srcs: ["testkey2.avbpubkey"],
4832 }
4833
4834 filegroup {
4835 name: "my.pem",
4836 srcs: ["testkey2.pem"],
4837 }
4838 `)
4839
4840 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4841 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004842 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004843 if actual_pubkey != expected_pubkey {
4844 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4845 }
4846 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004847 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004848 if actual_privkey != expected_privkey {
4849 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4850 }
4851}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004852
4853func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004854 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004855 prebuilt_apex {
4856 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004857 arch: {
4858 arm64: {
4859 src: "myapex-arm64.apex",
4860 },
4861 arm: {
4862 src: "myapex-arm.apex",
4863 },
4864 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004865 }
4866 `)
4867
Wei Li340ee8e2022-03-18 17:33:24 -07004868 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4869 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004870
Jiyong Parkc95714e2019-03-29 14:23:10 +09004871 expectedInput := "myapex-arm64.apex"
4872 if prebuilt.inputApex.String() != expectedInput {
4873 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4874 }
Wei Li340ee8e2022-03-18 17:33:24 -07004875 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4876 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4877 rule := testingModule.Rule("genProvenanceMetaData")
4878 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4879 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4880 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4881 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004882
4883 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4884 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004885}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004886
Paul Duffinc0609c62021-03-01 17:27:16 +00004887func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004888 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004889 prebuilt_apex {
4890 name: "myapex",
4891 }
4892 `)
4893}
4894
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004895func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004896 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004897 prebuilt_apex {
4898 name: "myapex",
4899 src: "myapex-arm.apex",
4900 filename: "notmyapex.apex",
4901 }
4902 `)
4903
Wei Li340ee8e2022-03-18 17:33:24 -07004904 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4905 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004906
4907 expected := "notmyapex.apex"
4908 if p.installFilename != expected {
4909 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4910 }
Wei Li340ee8e2022-03-18 17:33:24 -07004911 rule := testingModule.Rule("genProvenanceMetaData")
4912 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4913 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4914 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4915 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004916}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004917
Samiul Islam7c02e262021-09-08 17:48:28 +01004918func TestApexSetFilenameOverride(t *testing.T) {
4919 testApex(t, `
4920 apex_set {
4921 name: "com.company.android.myapex",
4922 apex_name: "com.android.myapex",
4923 set: "company-myapex.apks",
4924 filename: "com.company.android.myapex.apex"
4925 }
4926 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4927
4928 testApex(t, `
4929 apex_set {
4930 name: "com.company.android.myapex",
4931 apex_name: "com.android.myapex",
4932 set: "company-myapex.apks",
4933 filename: "com.company.android.myapex.capex"
4934 }
4935 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4936
4937 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4938 apex_set {
4939 name: "com.company.android.myapex",
4940 apex_name: "com.android.myapex",
4941 set: "company-myapex.apks",
4942 filename: "some-random-suffix"
4943 }
4944 `)
4945}
4946
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004947func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004948 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004949 prebuilt_apex {
4950 name: "myapex.prebuilt",
4951 src: "myapex-arm.apex",
4952 overrides: [
4953 "myapex",
4954 ],
4955 }
4956 `)
4957
Wei Li340ee8e2022-03-18 17:33:24 -07004958 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4959 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004960
4961 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004962 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004963 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004964 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004965 }
Wei Li340ee8e2022-03-18 17:33:24 -07004966 rule := testingModule.Rule("genProvenanceMetaData")
4967 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4968 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4969 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4970 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004971}
4972
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004973func TestPrebuiltApexName(t *testing.T) {
4974 testApex(t, `
4975 prebuilt_apex {
4976 name: "com.company.android.myapex",
4977 apex_name: "com.android.myapex",
4978 src: "company-myapex-arm.apex",
4979 }
4980 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4981
4982 testApex(t, `
4983 apex_set {
4984 name: "com.company.android.myapex",
4985 apex_name: "com.android.myapex",
4986 set: "company-myapex.apks",
4987 }
4988 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4989}
4990
4991func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4992 _ = android.GroupFixturePreparers(
4993 java.PrepareForTestWithJavaDefaultModules,
4994 PrepareForTestWithApexBuildComponents,
4995 android.FixtureWithRootAndroidBp(`
4996 platform_bootclasspath {
4997 name: "platform-bootclasspath",
4998 fragments: [
4999 {
5000 apex: "com.android.art",
5001 module: "art-bootclasspath-fragment",
5002 },
5003 ],
5004 }
5005
5006 prebuilt_apex {
5007 name: "com.company.android.art",
5008 apex_name: "com.android.art",
5009 src: "com.company.android.art-arm.apex",
5010 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5011 }
5012
5013 prebuilt_bootclasspath_fragment {
5014 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005015 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005016 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005017 hidden_api: {
5018 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5019 metadata: "my-bootclasspath-fragment/metadata.csv",
5020 index: "my-bootclasspath-fragment/index.csv",
5021 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5022 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5023 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005024 }
5025
5026 java_import {
5027 name: "core-oj",
5028 jars: ["prebuilt.jar"],
5029 }
5030 `),
5031 ).RunTest(t)
5032}
5033
Spandan Das59a4a2b2024-01-09 21:35:56 +00005034// A minimal context object for use with DexJarBuildPath
5035type moduleErrorfTestCtx struct {
5036}
5037
5038func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5039}
5040
Paul Duffin092153d2021-01-26 11:42:39 +00005041// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5042// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005043func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005044 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005045
Paul Duffin89886cb2021-02-05 16:44:03 +00005046 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005047 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005048 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005049 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00005050 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005051 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005052 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00005053 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09005054 android.NormalizePathForTesting(dexJarBuildPath))
5055 }
5056
5057 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005058 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005059 // Make sure the import has been given the correct path to the dex jar.
5060 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5061 dexJarBuildPath := p.DexJarInstallPath()
5062 stem := android.RemoveOptionalPrebuiltPrefix(name)
5063 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5064 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5065 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005066 }
5067
Paul Duffin39853512021-02-26 11:09:39 +00005068 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005069 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005070 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005071 android.AssertArrayString(t, "Check if there is no source variant",
5072 []string{"android_common"},
5073 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005074 }
5075
5076 t.Run("prebuilt only", func(t *testing.T) {
5077 bp := `
5078 prebuilt_apex {
5079 name: "myapex",
5080 arch: {
5081 arm64: {
5082 src: "myapex-arm64.apex",
5083 },
5084 arm: {
5085 src: "myapex-arm.apex",
5086 },
5087 },
Paul Duffin39853512021-02-26 11:09:39 +00005088 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005089 }
5090
5091 java_import {
5092 name: "libfoo",
5093 jars: ["libfoo.jar"],
5094 }
Paul Duffin39853512021-02-26 11:09:39 +00005095
5096 java_sdk_library_import {
5097 name: "libbar",
5098 public: {
5099 jars: ["libbar.jar"],
5100 },
5101 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005102 `
5103
5104 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5105 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5106
Spandan Das3576e762024-01-03 18:57:03 +00005107 deapexerName := deapexerModuleName("prebuilt_myapex")
5108 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01005109
Paul Duffinf6932af2021-02-26 18:21:56 +00005110 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005111 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005112 rule := deapexer.Rule("deapexer")
5113 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5114 t.Errorf("expected: %q, found: %q", expected, actual)
5115 }
5116
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005117 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005118 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005119 rule = prebuiltApex.Rule("android/soong/android.Cp")
5120 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5121 t.Errorf("expected: %q, found: %q", expected, actual)
5122 }
5123
Paul Duffin89886cb2021-02-05 16:44:03 +00005124 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005125 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005126
5127 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005128 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005129 })
5130
5131 t.Run("prebuilt with source preferred", func(t *testing.T) {
5132
5133 bp := `
5134 prebuilt_apex {
5135 name: "myapex",
5136 arch: {
5137 arm64: {
5138 src: "myapex-arm64.apex",
5139 },
5140 arm: {
5141 src: "myapex-arm.apex",
5142 },
5143 },
Paul Duffin39853512021-02-26 11:09:39 +00005144 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005145 }
5146
5147 java_import {
5148 name: "libfoo",
5149 jars: ["libfoo.jar"],
5150 }
5151
5152 java_library {
5153 name: "libfoo",
5154 }
Paul Duffin39853512021-02-26 11:09:39 +00005155
5156 java_sdk_library_import {
5157 name: "libbar",
5158 public: {
5159 jars: ["libbar.jar"],
5160 },
5161 }
5162
5163 java_sdk_library {
5164 name: "libbar",
5165 srcs: ["foo/bar/MyClass.java"],
5166 unsafe_ignore_missing_latest_api: true,
5167 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005168 `
5169
5170 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5171 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5172
Paul Duffin89886cb2021-02-05 16:44:03 +00005173 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005174 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005175 ensureNoSourceVariant(t, ctx, "libfoo")
5176
5177 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005178 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005179 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005180 })
5181
5182 t.Run("prebuilt preferred with source", func(t *testing.T) {
5183 bp := `
5184 prebuilt_apex {
5185 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005186 arch: {
5187 arm64: {
5188 src: "myapex-arm64.apex",
5189 },
5190 arm: {
5191 src: "myapex-arm.apex",
5192 },
5193 },
Paul Duffin39853512021-02-26 11:09:39 +00005194 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005195 }
5196
5197 java_import {
5198 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005199 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005200 jars: ["libfoo.jar"],
5201 }
5202
5203 java_library {
5204 name: "libfoo",
5205 }
Paul Duffin39853512021-02-26 11:09:39 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 prefer: true,
5210 public: {
5211 jars: ["libbar.jar"],
5212 },
5213 }
5214
5215 java_sdk_library {
5216 name: "libbar",
5217 srcs: ["foo/bar/MyClass.java"],
5218 unsafe_ignore_missing_latest_api: true,
5219 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005220 `
5221
5222 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5223 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5224
Paul Duffin89886cb2021-02-05 16:44:03 +00005225 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005226 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005227 ensureNoSourceVariant(t, ctx, "libfoo")
5228
5229 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005230 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005231 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005232 })
5233}
5234
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005235func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005236 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005237 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005238 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5239 // is disabled.
5240 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5241 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005242
Paul Duffin37856732021-02-26 14:24:15 +00005243 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5244 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005245 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005247 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005249 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005250 foundLibfooJar = true
5251 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005252 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005253 }
5254 }
5255 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005256 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 +00005257 }
5258 }
5259
Paul Duffin40a3f652021-07-19 13:11:24 +01005260 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005261 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005262 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005263 var rule android.TestingBuildParams
5264
5265 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5266 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005267 }
5268
Paul Duffin40a3f652021-07-19 13:11:24 +01005269 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5270 t.Helper()
5271 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5272 var rule android.TestingBuildParams
5273
5274 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5275 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5276 }
5277
Paul Duffin89f570a2021-06-16 01:42:33 +01005278 fragment := java.ApexVariantReference{
5279 Apex: proptools.StringPtr("myapex"),
5280 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5281 }
5282
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005283 t.Run("prebuilt only", func(t *testing.T) {
5284 bp := `
5285 prebuilt_apex {
5286 name: "myapex",
5287 arch: {
5288 arm64: {
5289 src: "myapex-arm64.apex",
5290 },
5291 arm: {
5292 src: "myapex-arm.apex",
5293 },
5294 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5296 }
5297
5298 prebuilt_bootclasspath_fragment {
5299 name: "my-bootclasspath-fragment",
5300 contents: ["libfoo", "libbar"],
5301 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005302 hidden_api: {
5303 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5304 metadata: "my-bootclasspath-fragment/metadata.csv",
5305 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005306 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5307 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5308 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005309 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 }
5311
5312 java_import {
5313 name: "libfoo",
5314 jars: ["libfoo.jar"],
5315 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005316 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 }
Paul Duffin37856732021-02-26 14:24:15 +00005318
5319 java_sdk_library_import {
5320 name: "libbar",
5321 public: {
5322 jars: ["libbar.jar"],
5323 },
5324 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005325 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005326 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005327 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005328 `
5329
Paul Duffin89f570a2021-06-16 01:42:33 +01005330 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005331 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5332 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005333
Paul Duffin537ea3d2021-05-14 10:38:00 +01005334 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005335 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005336 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005337 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005338 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005339 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 +01005340 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005341 })
5342
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005343 t.Run("apex_set only", func(t *testing.T) {
5344 bp := `
5345 apex_set {
5346 name: "myapex",
5347 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005348 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005349 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005350 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5351 }
5352
5353 java_import {
5354 name: "myjavalib",
5355 jars: ["myjavalib.jar"],
5356 apex_available: ["myapex"],
5357 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005358 }
5359
5360 prebuilt_bootclasspath_fragment {
5361 name: "my-bootclasspath-fragment",
5362 contents: ["libfoo", "libbar"],
5363 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005364 hidden_api: {
5365 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5366 metadata: "my-bootclasspath-fragment/metadata.csv",
5367 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005368 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5369 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5370 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005371 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005372 }
5373
Liz Kammer2dc72442023-04-20 10:10:48 -04005374 prebuilt_systemserverclasspath_fragment {
5375 name: "my-systemserverclasspath-fragment",
5376 contents: ["libbaz"],
5377 apex_available: ["myapex"],
5378 }
5379
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005380 java_import {
5381 name: "libfoo",
5382 jars: ["libfoo.jar"],
5383 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005384 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005385 }
5386
5387 java_sdk_library_import {
5388 name: "libbar",
5389 public: {
5390 jars: ["libbar.jar"],
5391 },
5392 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005393 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005394 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005395 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005396
5397 java_sdk_library_import {
5398 name: "libbaz",
5399 public: {
5400 jars: ["libbaz.jar"],
5401 },
5402 apex_available: ["myapex"],
5403 shared_library: false,
5404 permitted_packages: ["baz"],
5405 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005406 `
5407
Paul Duffin89f570a2021-06-16 01:42:33 +01005408 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005409 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5410 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005411
Paul Duffin537ea3d2021-05-14 10:38:00 +01005412 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005413 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005414 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005415 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005416 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005417 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 +01005418 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005419
5420 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5421
5422 overrideNames := []string{
Spandan Das3576e762024-01-03 18:57:03 +00005423 "myapex",
Liz Kammer2dc72442023-04-20 10:10:48 -04005424 "myjavalib.myapex",
5425 "libfoo.myapex",
5426 "libbar.myapex",
5427 "libbaz.myapex",
5428 }
5429 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5430 for i, e := range mkEntries {
5431 g := e.OverrideName
5432 if w := overrideNames[i]; w != g {
5433 t.Errorf("Expected override name %q, got %q", w, g)
5434 }
5435 }
5436
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005437 })
5438
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005439 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5440 bp := `
5441 prebuilt_apex {
5442 name: "myapex",
5443 arch: {
5444 arm64: {
5445 src: "myapex-arm64.apex",
5446 },
5447 arm: {
5448 src: "myapex-arm.apex",
5449 },
5450 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005451 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5452 }
5453
5454 prebuilt_bootclasspath_fragment {
5455 name: "my-bootclasspath-fragment",
5456 contents: ["libfoo", "libbar"],
5457 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005458 hidden_api: {
5459 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5460 metadata: "my-bootclasspath-fragment/metadata.csv",
5461 index: "my-bootclasspath-fragment/index.csv",
5462 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5463 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5464 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 }
5466
5467 java_import {
5468 name: "libfoo",
5469 jars: ["libfoo.jar"],
5470 apex_available: ["myapex"],
5471 }
5472
5473 java_library {
5474 name: "libfoo",
5475 srcs: ["foo/bar/MyClass.java"],
5476 apex_available: ["myapex"],
5477 }
Paul Duffin37856732021-02-26 14:24:15 +00005478
5479 java_sdk_library_import {
5480 name: "libbar",
5481 public: {
5482 jars: ["libbar.jar"],
5483 },
5484 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005485 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005486 }
5487
5488 java_sdk_library {
5489 name: "libbar",
5490 srcs: ["foo/bar/MyClass.java"],
5491 unsafe_ignore_missing_latest_api: true,
5492 apex_available: ["myapex"],
5493 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005494 `
5495
5496 // In this test the source (java_library) libfoo is active since the
5497 // prebuilt (java_import) defaults to prefer:false. However the
5498 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5499 // find the dex boot jar in it. We either need to disable the source libfoo
5500 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005501 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005502 // dexbootjar check is skipped if AllowMissingDependencies is true
5503 preparerAllowMissingDeps := android.GroupFixturePreparers(
5504 preparer,
5505 android.PrepareForTestWithAllowMissingDependencies,
5506 )
5507 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 })
5509
5510 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5511 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005512 apex {
5513 name: "myapex",
5514 key: "myapex.key",
5515 updatable: false,
5516 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5517 }
5518
5519 apex_key {
5520 name: "myapex.key",
5521 public_key: "testkey.avbpubkey",
5522 private_key: "testkey.pem",
5523 }
5524
5525 bootclasspath_fragment {
5526 name: "my-bootclasspath-fragment",
5527 contents: ["libfoo", "libbar"],
5528 apex_available: ["myapex"],
5529 hidden_api: {
5530 split_packages: ["*"],
5531 },
5532 }
5533
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 prebuilt_apex {
5535 name: "myapex",
5536 arch: {
5537 arm64: {
5538 src: "myapex-arm64.apex",
5539 },
5540 arm: {
5541 src: "myapex-arm.apex",
5542 },
5543 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005544 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5545 }
5546
5547 prebuilt_bootclasspath_fragment {
5548 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005549 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005550 contents: ["libfoo", "libbar"],
5551 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005552 hidden_api: {
5553 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5554 metadata: "my-bootclasspath-fragment/metadata.csv",
5555 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005556 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5557 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5558 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005559 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005560 }
5561
5562 java_import {
5563 name: "libfoo",
5564 prefer: true,
5565 jars: ["libfoo.jar"],
5566 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005567 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005568 }
5569
5570 java_library {
5571 name: "libfoo",
5572 srcs: ["foo/bar/MyClass.java"],
5573 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005574 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005575 }
Paul Duffin37856732021-02-26 14:24:15 +00005576
5577 java_sdk_library_import {
5578 name: "libbar",
5579 prefer: true,
5580 public: {
5581 jars: ["libbar.jar"],
5582 },
5583 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005584 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005585 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005586 }
5587
5588 java_sdk_library {
5589 name: "libbar",
5590 srcs: ["foo/bar/MyClass.java"],
5591 unsafe_ignore_missing_latest_api: true,
5592 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005593 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005594 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005595 `
5596
Paul Duffin89f570a2021-06-16 01:42:33 +01005597 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005598 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5599 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005600
Paul Duffin537ea3d2021-05-14 10:38:00 +01005601 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005602 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005603 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005604 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005605 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005606 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 +01005607 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 })
5609
5610 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5611 bp := `
5612 apex {
5613 name: "myapex",
5614 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005615 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005616 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 }
5618
5619 apex_key {
5620 name: "myapex.key",
5621 public_key: "testkey.avbpubkey",
5622 private_key: "testkey.pem",
5623 }
5624
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005625 bootclasspath_fragment {
5626 name: "my-bootclasspath-fragment",
5627 contents: ["libfoo", "libbar"],
5628 apex_available: ["myapex"],
5629 hidden_api: {
5630 split_packages: ["*"],
5631 },
5632 }
5633
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 prebuilt_apex {
5635 name: "myapex",
5636 arch: {
5637 arm64: {
5638 src: "myapex-arm64.apex",
5639 },
5640 arm: {
5641 src: "myapex-arm.apex",
5642 },
5643 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005644 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5645 }
5646
5647 prebuilt_bootclasspath_fragment {
5648 name: "my-bootclasspath-fragment",
5649 contents: ["libfoo", "libbar"],
5650 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005651 hidden_api: {
5652 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5653 metadata: "my-bootclasspath-fragment/metadata.csv",
5654 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005655 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5656 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5657 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005658 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005659 }
5660
5661 java_import {
5662 name: "libfoo",
5663 jars: ["libfoo.jar"],
5664 apex_available: ["myapex"],
5665 }
5666
5667 java_library {
5668 name: "libfoo",
5669 srcs: ["foo/bar/MyClass.java"],
5670 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005671 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005672 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005673 }
Paul Duffin37856732021-02-26 14:24:15 +00005674
5675 java_sdk_library_import {
5676 name: "libbar",
5677 public: {
5678 jars: ["libbar.jar"],
5679 },
5680 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005681 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005682 }
5683
5684 java_sdk_library {
5685 name: "libbar",
5686 srcs: ["foo/bar/MyClass.java"],
5687 unsafe_ignore_missing_latest_api: true,
5688 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005689 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005690 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005691 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005692 `
5693
Paul Duffin89f570a2021-06-16 01:42:33 +01005694 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005695 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5696 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 +00005697
Paul Duffin537ea3d2021-05-14 10:38:00 +01005698 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005699 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005700 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5701 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005702 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5703 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 +01005704 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705 })
5706
5707 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5708 bp := `
5709 apex {
5710 name: "myapex",
5711 enabled: false,
5712 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005713 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005714 }
5715
5716 apex_key {
5717 name: "myapex.key",
5718 public_key: "testkey.avbpubkey",
5719 private_key: "testkey.pem",
5720 }
5721
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005722 bootclasspath_fragment {
5723 name: "my-bootclasspath-fragment",
5724 enabled: false,
5725 contents: ["libfoo", "libbar"],
5726 apex_available: ["myapex"],
5727 hidden_api: {
5728 split_packages: ["*"],
5729 },
5730 }
5731
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005732 prebuilt_apex {
5733 name: "myapex",
5734 arch: {
5735 arm64: {
5736 src: "myapex-arm64.apex",
5737 },
5738 arm: {
5739 src: "myapex-arm.apex",
5740 },
5741 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005742 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5743 }
5744
5745 prebuilt_bootclasspath_fragment {
5746 name: "my-bootclasspath-fragment",
5747 contents: ["libfoo", "libbar"],
5748 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005749 hidden_api: {
5750 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5751 metadata: "my-bootclasspath-fragment/metadata.csv",
5752 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005753 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5754 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5755 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005756 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005757 }
5758
5759 java_import {
5760 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005761 jars: ["libfoo.jar"],
5762 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005763 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005764 }
5765
5766 java_library {
5767 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005768 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005769 srcs: ["foo/bar/MyClass.java"],
5770 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005771 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005772 }
Paul Duffin37856732021-02-26 14:24:15 +00005773
5774 java_sdk_library_import {
5775 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005776 public: {
5777 jars: ["libbar.jar"],
5778 },
5779 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005780 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005781 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005782 }
5783
5784 java_sdk_library {
5785 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005786 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005787 srcs: ["foo/bar/MyClass.java"],
5788 unsafe_ignore_missing_latest_api: true,
5789 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005790 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005791 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005792 `
5793
Paul Duffin89f570a2021-06-16 01:42:33 +01005794 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005795 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5796 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005797
Paul Duffin537ea3d2021-05-14 10:38:00 +01005798 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005799 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005800 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005801 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005802 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005803 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 +01005804 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005805 })
Spandan Das3a392012024-01-17 18:26:27 +00005806
Spandan Dasf2c10572024-02-27 04:49:52 +00005807 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005808 bp := `
5809 // Source
5810 apex {
5811 name: "myapex",
5812 enabled: false,
5813 key: "myapex.key",
5814 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5815 }
5816
5817 apex_key {
5818 name: "myapex.key",
5819 public_key: "testkey.avbpubkey",
5820 private_key: "testkey.pem",
5821 }
5822
5823 // Prebuilt
5824 prebuilt_apex {
5825 name: "myapex.v1",
5826 source_apex_name: "myapex",
5827 arch: {
5828 arm64: {
5829 src: "myapex-arm64.apex",
5830 },
5831 arm: {
5832 src: "myapex-arm.apex",
5833 },
5834 },
5835 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5836 prefer: true,
5837 }
5838 prebuilt_apex {
5839 name: "myapex.v2",
5840 source_apex_name: "myapex",
5841 arch: {
5842 arm64: {
5843 src: "myapex-arm64.apex",
5844 },
5845 arm: {
5846 src: "myapex-arm.apex",
5847 },
5848 },
5849 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5850 prefer: true,
5851 }
5852
5853 prebuilt_bootclasspath_fragment {
5854 name: "my-bootclasspath-fragment",
5855 contents: ["libfoo", "libbar"],
5856 apex_available: ["myapex"],
5857 hidden_api: {
5858 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5859 metadata: "my-bootclasspath-fragment/metadata.csv",
5860 index: "my-bootclasspath-fragment/index.csv",
5861 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5862 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5863 },
5864 prefer: true,
5865 }
5866
5867 java_import {
5868 name: "libfoo",
5869 jars: ["libfoo.jar"],
5870 apex_available: ["myapex"],
5871 prefer: true,
5872 }
5873 java_import {
5874 name: "libbar",
5875 jars: ["libbar.jar"],
5876 apex_available: ["myapex"],
5877 prefer: true,
5878 }
5879 `
5880
Spandan Dasf2c10572024-02-27 04:49:52 +00005881 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005882 })
5883
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005884}
5885
Roland Levillain630846d2019-06-26 12:48:34 +01005886func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005887 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005888 apex_test {
5889 name: "myapex",
5890 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005891 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005892 tests: [
5893 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005894 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005895 ],
5896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
Liz Kammer1c14a212020-05-12 15:26:55 -07005904 filegroup {
5905 name: "fg",
5906 srcs: [
5907 "baz",
5908 "bar/baz"
5909 ],
5910 }
5911
Roland Levillain630846d2019-06-26 12:48:34 +01005912 cc_test {
5913 name: "mytest",
5914 gtest: false,
5915 srcs: ["mytest.cpp"],
5916 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005917 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005918 system_shared_libs: [],
5919 static_executable: true,
5920 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005921 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005922 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005923
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005924 cc_library {
5925 name: "mylib",
5926 srcs: ["mylib.cpp"],
5927 system_shared_libs: [],
5928 stl: "none",
5929 }
5930
Liz Kammer5bd365f2020-05-27 15:15:11 -07005931 filegroup {
5932 name: "fg2",
5933 srcs: [
5934 "testdata/baz"
5935 ],
5936 }
5937
Roland Levillain9b5fde92019-06-28 15:41:19 +01005938 cc_test {
5939 name: "mytests",
5940 gtest: false,
5941 srcs: [
5942 "mytest1.cpp",
5943 "mytest2.cpp",
5944 "mytest3.cpp",
5945 ],
5946 test_per_src: true,
5947 relative_install_path: "test",
5948 system_shared_libs: [],
5949 static_executable: true,
5950 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005951 data: [
5952 ":fg",
5953 ":fg2",
5954 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005955 }
Roland Levillain630846d2019-06-26 12:48:34 +01005956 `)
5957
Jooyung Hana0503a52023-08-23 13:12:50 +09005958 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005959 copyCmds := apexRule.Args["copy_commands"]
5960
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005961 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005962 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005963 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005964
Liz Kammer1c14a212020-05-12 15:26:55 -07005965 //Ensure that test data are copied into apex.
5966 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5967 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5968
Roland Levillain9b5fde92019-06-28 15:41:19 +01005969 // Ensure that test deps built with `test_per_src` are copied into apex.
5970 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5971 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5972 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005973
5974 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005975 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005976 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005977 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005978 prefix := "TARGET_"
5979 var builder strings.Builder
5980 data.Custom(&builder, name, prefix, "", data)
5981 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005982 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5983 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5984 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5985 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005986 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005987}
5988
Jooyung Hand48f3c32019-08-23 11:18:57 +09005989func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5990 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5991 apex {
5992 name: "myapex",
5993 key: "myapex.key",
5994 native_shared_libs: ["libfoo"],
5995 }
5996
5997 apex_key {
5998 name: "myapex.key",
5999 public_key: "testkey.avbpubkey",
6000 private_key: "testkey.pem",
6001 }
6002
6003 cc_library {
6004 name: "libfoo",
6005 stl: "none",
6006 system_shared_libs: [],
6007 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006008 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006009 }
6010 `)
6011 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6012 apex {
6013 name: "myapex",
6014 key: "myapex.key",
6015 java_libs: ["myjar"],
6016 }
6017
6018 apex_key {
6019 name: "myapex.key",
6020 public_key: "testkey.avbpubkey",
6021 private_key: "testkey.pem",
6022 }
6023
6024 java_library {
6025 name: "myjar",
6026 srcs: ["foo/bar/MyClass.java"],
6027 sdk_version: "none",
6028 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006029 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006030 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006031 }
6032 `)
6033}
6034
Bill Peckhama41a6962021-01-11 10:58:54 -08006035func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006036 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006037 apex {
6038 name: "myapex",
6039 key: "myapex.key",
6040 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006041 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006042 }
6043
6044 apex_key {
6045 name: "myapex.key",
6046 public_key: "testkey.avbpubkey",
6047 private_key: "testkey.pem",
6048 }
6049
6050 java_import {
6051 name: "myjavaimport",
6052 apex_available: ["myapex"],
6053 jars: ["my.jar"],
6054 compile_dex: true,
6055 }
6056 `)
6057
Jooyung Hana0503a52023-08-23 13:12:50 +09006058 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006059 apexRule := module.Rule("apexRule")
6060 copyCmds := apexRule.Args["copy_commands"]
6061 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6062}
6063
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006064func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006065 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006066 apex {
6067 name: "myapex",
6068 key: "myapex.key",
6069 apps: [
6070 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006071 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006072 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006073 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006074 }
6075
6076 apex_key {
6077 name: "myapex.key",
6078 public_key: "testkey.avbpubkey",
6079 private_key: "testkey.pem",
6080 }
6081
6082 android_app {
6083 name: "AppFoo",
6084 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006085 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006086 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006087 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006088 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006089 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006090 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006091
6092 android_app {
6093 name: "AppFooPriv",
6094 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006095 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006096 system_modules: "none",
6097 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006098 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006100 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006101 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006102
6103 cc_library_shared {
6104 name: "libjni",
6105 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006106 shared_libs: ["libfoo"],
6107 stl: "none",
6108 system_shared_libs: [],
6109 apex_available: [ "myapex" ],
6110 sdk_version: "current",
6111 }
6112
6113 cc_library_shared {
6114 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006115 stl: "none",
6116 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006117 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006118 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006119 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006120 `)
6121
Jooyung Hana0503a52023-08-23 13:12:50 +09006122 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006123 apexRule := module.Rule("apexRule")
6124 copyCmds := apexRule.Args["copy_commands"]
6125
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006126 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6127 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006128 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006129
Colin Crossaede88c2020-08-11 12:17:01 -07006130 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006131 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006132 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006133 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006134 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006135 // JNI libraries including transitive deps are
6136 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006137 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006138 // ... embedded inside APK (jnilibs.zip)
6139 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6140 // ... and not directly inside the APEX
6141 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6142 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006143
6144 apexBundle := module.Module().(*apexBundle)
6145 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6146 var builder strings.Builder
6147 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6148 androidMk := builder.String()
6149 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6150 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6151 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6152 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6153 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6154 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 +01006155}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006156
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006157func TestApexWithAppImportBuildId(t *testing.T) {
6158 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6159 for _, id := range invalidBuildIds {
6160 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6161 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6162 variables.BuildId = proptools.StringPtr(id)
6163 })
6164 testApexError(t, message, `apex {
6165 name: "myapex",
6166 key: "myapex.key",
6167 apps: ["AppFooPrebuilt"],
6168 updatable: false,
6169 }
6170
6171 apex_key {
6172 name: "myapex.key",
6173 public_key: "testkey.avbpubkey",
6174 private_key: "testkey.pem",
6175 }
6176
6177 android_app_import {
6178 name: "AppFooPrebuilt",
6179 apk: "PrebuiltAppFoo.apk",
6180 presigned: true,
6181 apex_available: ["myapex"],
6182 }
6183 `, fixture)
6184 }
6185}
6186
Dario Frenicde2a032019-10-27 00:29:22 +01006187func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006188 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006189 apex {
6190 name: "myapex",
6191 key: "myapex.key",
6192 apps: [
6193 "AppFooPrebuilt",
6194 "AppFooPrivPrebuilt",
6195 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006196 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006197 }
6198
6199 apex_key {
6200 name: "myapex.key",
6201 public_key: "testkey.avbpubkey",
6202 private_key: "testkey.pem",
6203 }
6204
6205 android_app_import {
6206 name: "AppFooPrebuilt",
6207 apk: "PrebuiltAppFoo.apk",
6208 presigned: true,
6209 dex_preopt: {
6210 enabled: false,
6211 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006212 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006213 }
6214
6215 android_app_import {
6216 name: "AppFooPrivPrebuilt",
6217 apk: "PrebuiltAppFooPriv.apk",
6218 privileged: true,
6219 presigned: true,
6220 dex_preopt: {
6221 enabled: false,
6222 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006223 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006224 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006225 }
6226 `)
6227
Jooyung Hana0503a52023-08-23 13:12:50 +09006228 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006229 apexRule := module.Rule("apexRule")
6230 copyCmds := apexRule.Args["copy_commands"]
6231
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006232 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6233 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006234}
6235
6236func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006237 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006238 apex {
6239 name: "myapex",
6240 key: "myapex.key",
6241 apps: [
6242 "AppFoo",
6243 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006244 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006245 }
6246
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252
6253 android_app {
6254 name: "AppFoo",
6255 srcs: ["foo/bar/MyClass.java"],
6256 sdk_version: "none",
6257 system_modules: "none",
6258 apex_available: [ "myapex" ],
6259 }
6260
6261 android_app_import {
6262 name: "AppFoo",
6263 apk: "AppFooPrebuilt.apk",
6264 filename: "AppFooPrebuilt.apk",
6265 presigned: true,
6266 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006267 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006268 }
6269 `, withFiles(map[string][]byte{
6270 "AppFooPrebuilt.apk": nil,
6271 }))
6272
Jooyung Hana0503a52023-08-23 13:12:50 +09006273 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006274 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006275 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006276}
6277
Dario Freni6f3937c2019-12-20 22:58:03 +00006278func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006279 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006280 apex {
6281 name: "myapex",
6282 key: "myapex.key",
6283 apps: [
6284 "TesterHelpAppFoo",
6285 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006286 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006287 }
6288
6289 apex_key {
6290 name: "myapex.key",
6291 public_key: "testkey.avbpubkey",
6292 private_key: "testkey.pem",
6293 }
6294
6295 android_test_helper_app {
6296 name: "TesterHelpAppFoo",
6297 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006298 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006299 }
6300
6301 `)
6302
Jooyung Hana0503a52023-08-23 13:12:50 +09006303 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006304 apexRule := module.Rule("apexRule")
6305 copyCmds := apexRule.Args["copy_commands"]
6306
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006307 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006308}
6309
Jooyung Han18020ea2019-11-13 10:50:48 +09006310func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6311 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006312 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006313 apex {
6314 name: "myapex",
6315 key: "myapex.key",
6316 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006317 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006318 }
6319
6320 apex_key {
6321 name: "myapex.key",
6322 public_key: "testkey.avbpubkey",
6323 private_key: "testkey.pem",
6324 }
6325
6326 apex {
6327 name: "otherapex",
6328 key: "myapex.key",
6329 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006330 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006331 }
6332
6333 cc_defaults {
6334 name: "libfoo-defaults",
6335 apex_available: ["otherapex"],
6336 }
6337
6338 cc_library {
6339 name: "libfoo",
6340 defaults: ["libfoo-defaults"],
6341 stl: "none",
6342 system_shared_libs: [],
6343 }`)
6344}
6345
Paul Duffine52e66f2020-03-30 17:54:29 +01006346func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006347 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006348 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006349 apex {
6350 name: "myapex",
6351 key: "myapex.key",
6352 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006353 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006354 }
6355
6356 apex_key {
6357 name: "myapex.key",
6358 public_key: "testkey.avbpubkey",
6359 private_key: "testkey.pem",
6360 }
6361
6362 apex {
6363 name: "otherapex",
6364 key: "otherapex.key",
6365 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006366 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006367 }
6368
6369 apex_key {
6370 name: "otherapex.key",
6371 public_key: "testkey.avbpubkey",
6372 private_key: "testkey.pem",
6373 }
6374
6375 cc_library {
6376 name: "libfoo",
6377 stl: "none",
6378 system_shared_libs: [],
6379 apex_available: ["otherapex"],
6380 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006381}
Jiyong Park127b40b2019-09-30 16:04:35 +09006382
Paul Duffine52e66f2020-03-30 17:54:29 +01006383func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006384 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006385 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006386.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006387.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006388.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006389.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006390.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006391.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006392 apex {
6393 name: "myapex",
6394 key: "myapex.key",
6395 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006396 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006397 }
6398
6399 apex_key {
6400 name: "myapex.key",
6401 public_key: "testkey.avbpubkey",
6402 private_key: "testkey.pem",
6403 }
6404
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 cc_library {
6406 name: "libfoo",
6407 stl: "none",
6408 shared_libs: ["libbar"],
6409 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006410 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006411 }
6412
6413 cc_library {
6414 name: "libbar",
6415 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006416 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006417 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006418 apex_available: ["myapex"],
6419 }
6420
6421 cc_library {
6422 name: "libbaz",
6423 stl: "none",
6424 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006425 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006426}
Jiyong Park127b40b2019-09-30 16:04:35 +09006427
Liz Kammer5f108fa2023-05-11 14:33:17 -04006428func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6429 testApex(t, `
6430 apex {
6431 name: "myapex",
6432 key: "myapex.key",
6433 native_shared_libs: ["libfoo"],
6434 updatable: false,
6435 }
6436
6437 apex_key {
6438 name: "myapex.key",
6439 public_key: "testkey.avbpubkey",
6440 private_key: "testkey.pem",
6441 }
6442
6443 cc_library {
6444 name: "libfoo",
6445 stl: "none",
6446 static_libs: ["libbar"],
6447 system_shared_libs: [],
6448 apex_available: ["myapex"],
6449 }
6450
6451 cc_library {
6452 name: "libbar",
6453 stl: "none",
6454 shared_libs: ["libbaz"],
6455 system_shared_libs: [],
6456 apex_available: ["myapex"],
6457 }
6458
6459 cc_library {
6460 name: "libbaz",
6461 stl: "none",
6462 system_shared_libs: [],
6463 }`)
6464
6465 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6466 apex {
6467 name: "myapex",
6468 key: "myapex.key",
6469 native_shared_libs: ["libfoo"],
6470 updatable: false,
6471 }
6472
6473 apex_key {
6474 name: "myapex.key",
6475 public_key: "testkey.avbpubkey",
6476 private_key: "testkey.pem",
6477 }
6478
6479 cc_library {
6480 name: "libfoo",
6481 stl: "none",
6482 static_libs: ["libbar"],
6483 system_shared_libs: [],
6484 apex_available: ["myapex"],
6485 }
6486
6487 cc_library {
6488 name: "libbar",
6489 stl: "none",
6490 system_shared_libs: [],
6491 }`)
6492}
6493
Paul Duffine52e66f2020-03-30 17:54:29 +01006494func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 testApexError(t, "\"otherapex\" is not a valid module name", `
6496 apex {
6497 name: "myapex",
6498 key: "myapex.key",
6499 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006500 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006501 }
6502
6503 apex_key {
6504 name: "myapex.key",
6505 public_key: "testkey.avbpubkey",
6506 private_key: "testkey.pem",
6507 }
6508
6509 cc_library {
6510 name: "libfoo",
6511 stl: "none",
6512 system_shared_libs: [],
6513 apex_available: ["otherapex"],
6514 }`)
6515
Paul Duffine52e66f2020-03-30 17:54:29 +01006516 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006517 apex {
6518 name: "myapex",
6519 key: "myapex.key",
6520 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006521 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006522 }
6523
6524 apex_key {
6525 name: "myapex.key",
6526 public_key: "testkey.avbpubkey",
6527 private_key: "testkey.pem",
6528 }
6529
6530 cc_library {
6531 name: "libfoo",
6532 stl: "none",
6533 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006534 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006535 apex_available: ["myapex"],
6536 }
6537
6538 cc_library {
6539 name: "libbar",
6540 stl: "none",
6541 system_shared_libs: [],
6542 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006543 }
6544
6545 cc_library {
6546 name: "libbaz",
6547 stl: "none",
6548 system_shared_libs: [],
6549 stubs: {
6550 versions: ["10", "20", "30"],
6551 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006552 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006553}
Jiyong Park127b40b2019-09-30 16:04:35 +09006554
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006555func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6556 t.Run("negative variant_version produces error", func(t *testing.T) {
6557 testApexError(t, "expected an integer between 0-9; got -1", `
6558 apex {
6559 name: "myapex",
6560 key: "myapex.key",
6561 apex_available_name: "com.android.foo",
6562 variant_version: "-1",
6563 updatable: false,
6564 }
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570 `)
6571 })
6572
6573 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6574 testApexError(t, "expected an integer between 0-9; got 10", `
6575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
6578 apex_available_name: "com.android.foo",
6579 variant_version: "10",
6580 updatable: false,
6581 }
6582 apex_key {
6583 name: "myapex.key",
6584 public_key: "testkey.avbpubkey",
6585 private_key: "testkey.pem",
6586 }
6587 `)
6588 })
6589}
6590
6591func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6592 context := android.GroupFixturePreparers(
6593 android.PrepareForIntegrationTestWithAndroid,
6594 PrepareForTestWithApexBuildComponents,
6595 android.FixtureMergeMockFs(android.MockFS{
6596 "system/sepolicy/apex/foo-file_contexts": nil,
6597 "system/sepolicy/apex/bar-file_contexts": nil,
6598 }),
6599 )
6600 result := context.RunTestWithBp(t, `
6601 apex {
6602 name: "foo",
6603 key: "myapex.key",
6604 apex_available_name: "com.android.foo",
6605 variant_version: "0",
6606 updatable: false,
6607 }
6608 apex {
6609 name: "bar",
6610 key: "myapex.key",
6611 apex_available_name: "com.android.foo",
6612 variant_version: "3",
6613 updatable: false,
6614 }
6615 apex_key {
6616 name: "myapex.key",
6617 public_key: "testkey.avbpubkey",
6618 private_key: "testkey.pem",
6619 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006620 override_apex {
6621 name: "myoverrideapex",
6622 base: "bar",
6623 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006624 `)
6625
Jooyung Hana0503a52023-08-23 13:12:50 +09006626 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006627 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6628 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6629 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6630 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6631 }
6632
Jooyung Hana0503a52023-08-23 13:12:50 +09006633 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006634 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6635 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6636 barActualDefaultVersion := barManifestRule.Args["default_version"]
6637 if barActualDefaultVersion != barExpectedDefaultVersion {
6638 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6639 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006640
Jooyung Hana0503a52023-08-23 13:12:50 +09006641 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006642 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6643 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6644 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6645 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006646}
6647
Sam Delmericoca816532023-06-02 14:09:50 -04006648func TestApexAvailable_ApexAvailableName(t *testing.T) {
6649 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6650 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6651 apex {
6652 name: "myapex_sminus",
6653 key: "myapex.key",
6654 apps: ["AppFoo"],
6655 apex_available_name: "myapex",
6656 updatable: false,
6657 }
6658 apex {
6659 name: "myapex",
6660 key: "myapex.key",
6661 apps: ["AppFoo"],
6662 updatable: false,
6663 }
6664 apex_key {
6665 name: "myapex.key",
6666 public_key: "testkey.avbpubkey",
6667 private_key: "testkey.pem",
6668 }
6669 android_app {
6670 name: "AppFoo",
6671 srcs: ["foo/bar/MyClass.java"],
6672 sdk_version: "none",
6673 system_modules: "none",
6674 apex_available: [ "myapex_sminus" ],
6675 }`,
6676 android.FixtureMergeMockFs(android.MockFS{
6677 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6678 }),
6679 )
6680 })
6681
6682 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6683 testApex(t, `
6684 apex {
6685 name: "myapex_sminus",
6686 key: "myapex.key",
6687 apps: ["AppFoo"],
6688 apex_available_name: "myapex",
6689 updatable: false,
6690 }
6691 apex {
6692 name: "myapex",
6693 key: "myapex.key",
6694 apps: ["AppFoo"],
6695 updatable: false,
6696 }
6697 apex_key {
6698 name: "myapex.key",
6699 public_key: "testkey.avbpubkey",
6700 private_key: "testkey.pem",
6701 }
6702 android_app {
6703 name: "AppFoo",
6704 srcs: ["foo/bar/MyClass.java"],
6705 sdk_version: "none",
6706 system_modules: "none",
6707 apex_available: [ "myapex" ],
6708 }`,
6709 android.FixtureMergeMockFs(android.MockFS{
6710 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6711 }),
6712 )
6713 })
6714
6715 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6716 testApex(t, `
6717 override_apex {
6718 name: "myoverrideapex_sminus",
6719 base: "myapex_sminus",
6720 key: "myapex.key",
6721 apps: ["AppFooOverride"],
6722 }
6723 override_apex {
6724 name: "myoverrideapex",
6725 base: "myapex",
6726 key: "myapex.key",
6727 apps: ["AppFooOverride"],
6728 }
6729 apex {
6730 name: "myapex_sminus",
6731 key: "myapex.key",
6732 apps: ["AppFoo"],
6733 apex_available_name: "myapex",
6734 updatable: false,
6735 }
6736 apex {
6737 name: "myapex",
6738 key: "myapex.key",
6739 apps: ["AppFoo"],
6740 updatable: false,
6741 }
6742 apex_key {
6743 name: "myapex.key",
6744 public_key: "testkey.avbpubkey",
6745 private_key: "testkey.pem",
6746 }
6747 android_app {
6748 name: "AppFooOverride",
6749 srcs: ["foo/bar/MyClass.java"],
6750 sdk_version: "none",
6751 system_modules: "none",
6752 apex_available: [ "myapex" ],
6753 }
6754 android_app {
6755 name: "AppFoo",
6756 srcs: ["foo/bar/MyClass.java"],
6757 sdk_version: "none",
6758 system_modules: "none",
6759 apex_available: [ "myapex" ],
6760 }`,
6761 android.FixtureMergeMockFs(android.MockFS{
6762 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6763 }),
6764 )
6765 })
6766}
6767
6768func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6769 context := android.GroupFixturePreparers(
6770 android.PrepareForIntegrationTestWithAndroid,
6771 PrepareForTestWithApexBuildComponents,
6772 java.PrepareForTestWithDexpreopt,
6773 android.FixtureMergeMockFs(android.MockFS{
6774 "system/sepolicy/apex/myapex-file_contexts": nil,
6775 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6776 }),
6777 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6778 variables.BuildId = proptools.StringPtr("buildid")
6779 }),
6780 )
6781 context.RunTestWithBp(t, `
6782 override_apex {
6783 name: "myoverrideapex_sminus",
6784 base: "myapex_sminus",
6785 }
6786 override_apex {
6787 name: "myoverrideapex",
6788 base: "myapex",
6789 }
6790 apex {
6791 name: "myapex",
6792 key: "myapex.key",
6793 apps: ["AppFoo"],
6794 updatable: false,
6795 }
6796 apex {
6797 name: "myapex_sminus",
6798 apex_available_name: "myapex",
6799 key: "myapex.key",
6800 apps: ["AppFoo_sminus"],
6801 updatable: false,
6802 }
6803 apex_key {
6804 name: "myapex.key",
6805 public_key: "testkey.avbpubkey",
6806 private_key: "testkey.pem",
6807 }
6808 android_app {
6809 name: "AppFoo",
6810 srcs: ["foo/bar/MyClass.java"],
6811 sdk_version: "none",
6812 system_modules: "none",
6813 apex_available: [ "myapex" ],
6814 }
6815 android_app {
6816 name: "AppFoo_sminus",
6817 srcs: ["foo/bar/MyClass.java"],
6818 sdk_version: "none",
6819 min_sdk_version: "29",
6820 system_modules: "none",
6821 apex_available: [ "myapex" ],
6822 }`)
6823}
6824
Jiyong Park89e850a2020-04-07 16:37:39 +09006825func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006826 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006827 apex {
6828 name: "myapex",
6829 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006830 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006831 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006832 }
6833
6834 apex_key {
6835 name: "myapex.key",
6836 public_key: "testkey.avbpubkey",
6837 private_key: "testkey.pem",
6838 }
6839
6840 cc_library {
6841 name: "libfoo",
6842 stl: "none",
6843 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006844 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006845 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006846 }
6847
6848 cc_library {
6849 name: "libfoo2",
6850 stl: "none",
6851 system_shared_libs: [],
6852 shared_libs: ["libbaz"],
6853 apex_available: ["//apex_available:platform"],
6854 }
6855
6856 cc_library {
6857 name: "libbar",
6858 stl: "none",
6859 system_shared_libs: [],
6860 apex_available: ["myapex"],
6861 }
6862
6863 cc_library {
6864 name: "libbaz",
6865 stl: "none",
6866 system_shared_libs: [],
6867 apex_available: ["myapex"],
6868 stubs: {
6869 versions: ["1"],
6870 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006871 }`)
6872
Jiyong Park89e850a2020-04-07 16:37:39 +09006873 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6874 // because it depends on libbar which isn't available to platform
6875 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6876 if libfoo.NotAvailableForPlatform() != true {
6877 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6878 }
6879
6880 // libfoo2 however can be available to platform because it depends on libbaz which provides
6881 // stubs
6882 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6883 if libfoo2.NotAvailableForPlatform() == true {
6884 t.Errorf("%q should be available to platform", libfoo2.String())
6885 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006886}
Jiyong Parka90ca002019-10-07 15:47:24 +09006887
Paul Duffine52e66f2020-03-30 17:54:29 +01006888func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006889 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006890 apex {
6891 name: "myapex",
6892 key: "myapex.key",
6893 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006894 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006895 }
6896
6897 apex_key {
6898 name: "myapex.key",
6899 public_key: "testkey.avbpubkey",
6900 private_key: "testkey.pem",
6901 }
6902
6903 cc_library {
6904 name: "libfoo",
6905 stl: "none",
6906 system_shared_libs: [],
6907 apex_available: ["myapex"],
6908 static: {
6909 apex_available: ["//apex_available:platform"],
6910 },
6911 }`)
6912
Jiyong Park89e850a2020-04-07 16:37:39 +09006913 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6914 if libfooShared.NotAvailableForPlatform() != true {
6915 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6916 }
6917 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6918 if libfooStatic.NotAvailableForPlatform() != false {
6919 t.Errorf("%q should be available to platform", libfooStatic.String())
6920 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006921}
6922
Jiyong Park5d790c32019-11-15 18:40:32 +09006923func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006924 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006925 apex {
6926 name: "myapex",
6927 key: "myapex.key",
6928 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006929 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006930 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006931 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006932 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006933 }
6934
6935 override_apex {
6936 name: "override_myapex",
6937 base: "myapex",
6938 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006939 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006940 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006941 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006942 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006943 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006944 key: "mynewapex.key",
6945 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006946 }
6947
6948 apex_key {
6949 name: "myapex.key",
6950 public_key: "testkey.avbpubkey",
6951 private_key: "testkey.pem",
6952 }
6953
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006954 apex_key {
6955 name: "mynewapex.key",
6956 public_key: "testkey2.avbpubkey",
6957 private_key: "testkey2.pem",
6958 }
6959
6960 android_app_certificate {
6961 name: "myapex.certificate",
6962 certificate: "testkey",
6963 }
6964
Jiyong Park5d790c32019-11-15 18:40:32 +09006965 android_app {
6966 name: "app",
6967 srcs: ["foo/bar/MyClass.java"],
6968 package_name: "foo",
6969 sdk_version: "none",
6970 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006971 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006972 }
6973
6974 override_android_app {
6975 name: "override_app",
6976 base: "app",
6977 package_name: "bar",
6978 }
markchien7c803b82021-08-26 22:10:06 +08006979
6980 bpf {
6981 name: "bpf",
6982 srcs: ["bpf.c"],
6983 }
6984
6985 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006986 name: "overrideBpf",
6987 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006988 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006989
6990 prebuilt_etc {
6991 name: "myetc",
6992 src: "myprebuilt",
6993 }
6994
6995 prebuilt_etc {
6996 name: "override_myetc",
6997 src: "override_myprebuilt",
6998 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006999 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007000
Jooyung Hana0503a52023-08-23 13:12:50 +09007001 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7002 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007003 if originalVariant.GetOverriddenBy() != "" {
7004 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7005 }
7006 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7007 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7008 }
7009
Jooyung Hana0503a52023-08-23 13:12:50 +09007010 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007011 apexRule := module.Rule("apexRule")
7012 copyCmds := apexRule.Args["copy_commands"]
7013
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007014 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7015 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007016
markchien7c803b82021-08-26 22:10:06 +08007017 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007018 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007019
Daniel Norman5a3ce132021-08-26 15:44:43 -07007020 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7021 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7022
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007023 apexBundle := module.Module().(*apexBundle)
7024 name := apexBundle.Name()
7025 if name != "override_myapex" {
7026 t.Errorf("name should be \"override_myapex\", but was %q", name)
7027 }
7028
Baligh Uddin004d7172020-02-19 21:29:28 -08007029 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7030 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7031 }
7032
Jiyong Park20bacab2020-03-03 11:45:41 +09007033 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007034 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007035 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7036
7037 signApkRule := module.Rule("signapk")
7038 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007039
Colin Crossaa255532020-07-03 13:18:24 -07007040 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007041 var builder strings.Builder
7042 data.Custom(&builder, name, "TARGET_", "", data)
7043 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007044 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7045 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007046 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007047 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007048 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007049 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007050 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007051 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007052}
7053
Albert Martineefabcf2022-03-21 20:11:16 +00007054func TestMinSdkVersionOverride(t *testing.T) {
7055 // Override from 29 to 31
7056 minSdkOverride31 := "31"
7057 ctx := testApex(t, `
7058 apex {
7059 name: "myapex",
7060 key: "myapex.key",
7061 native_shared_libs: ["mylib"],
7062 updatable: true,
7063 min_sdk_version: "29"
7064 }
7065
7066 override_apex {
7067 name: "override_myapex",
7068 base: "myapex",
7069 logging_parent: "com.foo.bar",
7070 package_name: "test.overridden.package"
7071 }
7072
7073 apex_key {
7074 name: "myapex.key",
7075 public_key: "testkey.avbpubkey",
7076 private_key: "testkey.pem",
7077 }
7078
7079 cc_library {
7080 name: "mylib",
7081 srcs: ["mylib.cpp"],
7082 runtime_libs: ["libbar"],
7083 system_shared_libs: [],
7084 stl: "none",
7085 apex_available: [ "myapex" ],
7086 min_sdk_version: "apex_inherit"
7087 }
7088
7089 cc_library {
7090 name: "libbar",
7091 srcs: ["mylib.cpp"],
7092 system_shared_libs: [],
7093 stl: "none",
7094 apex_available: [ "myapex" ],
7095 min_sdk_version: "apex_inherit"
7096 }
7097
7098 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7099
Jooyung Hana0503a52023-08-23 13:12:50 +09007100 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007101 copyCmds := apexRule.Args["copy_commands"]
7102
7103 // Ensure that direct non-stubs dep is always included
7104 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7105
7106 // Ensure that runtime_libs dep in included
7107 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7108
7109 // Ensure libraries target overridden min_sdk_version value
7110 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7111}
7112
7113func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7114 // Attempt to override from 31 to 29, should be a NOOP
7115 minSdkOverride29 := "29"
7116 ctx := testApex(t, `
7117 apex {
7118 name: "myapex",
7119 key: "myapex.key",
7120 native_shared_libs: ["mylib"],
7121 updatable: true,
7122 min_sdk_version: "31"
7123 }
7124
7125 override_apex {
7126 name: "override_myapex",
7127 base: "myapex",
7128 logging_parent: "com.foo.bar",
7129 package_name: "test.overridden.package"
7130 }
7131
7132 apex_key {
7133 name: "myapex.key",
7134 public_key: "testkey.avbpubkey",
7135 private_key: "testkey.pem",
7136 }
7137
7138 cc_library {
7139 name: "mylib",
7140 srcs: ["mylib.cpp"],
7141 runtime_libs: ["libbar"],
7142 system_shared_libs: [],
7143 stl: "none",
7144 apex_available: [ "myapex" ],
7145 min_sdk_version: "apex_inherit"
7146 }
7147
7148 cc_library {
7149 name: "libbar",
7150 srcs: ["mylib.cpp"],
7151 system_shared_libs: [],
7152 stl: "none",
7153 apex_available: [ "myapex" ],
7154 min_sdk_version: "apex_inherit"
7155 }
7156
7157 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7158
Jooyung Hana0503a52023-08-23 13:12:50 +09007159 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007160 copyCmds := apexRule.Args["copy_commands"]
7161
7162 // Ensure that direct non-stubs dep is always included
7163 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7164
7165 // Ensure that runtime_libs dep in included
7166 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7167
7168 // Ensure libraries target the original min_sdk_version value rather than the overridden
7169 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7170}
7171
Jooyung Han214bf372019-11-12 13:03:50 +09007172func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007173 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007174 apex {
7175 name: "myapex",
7176 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007177 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007178 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007179 }
7180
7181 apex_key {
7182 name: "myapex.key",
7183 public_key: "testkey.avbpubkey",
7184 private_key: "testkey.pem",
7185 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007186
7187 cc_library {
7188 name: "mylib",
7189 srcs: ["mylib.cpp"],
7190 stl: "libc++",
7191 system_shared_libs: [],
7192 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007193 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007194 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007195 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007196
Jooyung Hana0503a52023-08-23 13:12:50 +09007197 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007198 args := module.Rule("apexRule").Args
7199 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007200 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007201
7202 // The copies of the libraries in the apex should have one more dependency than
7203 // the ones outside the apex, namely the unwinder. Ideally we should check
7204 // the dependency names directly here but for some reason the names are blank in
7205 // this test.
7206 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007207 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007208 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7209 if len(apexImplicits) != len(nonApexImplicits)+1 {
7210 t.Errorf("%q missing unwinder dep", lib)
7211 }
7212 }
Jooyung Han214bf372019-11-12 13:03:50 +09007213}
7214
Paul Duffine05480a2021-03-08 15:07:14 +00007215var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007216 "api/current.txt": nil,
7217 "api/removed.txt": nil,
7218 "api/system-current.txt": nil,
7219 "api/system-removed.txt": nil,
7220 "api/test-current.txt": nil,
7221 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007222
Anton Hanssondff2c782020-12-21 17:10:01 +00007223 "100/public/api/foo.txt": nil,
7224 "100/public/api/foo-removed.txt": nil,
7225 "100/system/api/foo.txt": nil,
7226 "100/system/api/foo-removed.txt": nil,
7227
Paul Duffineedc5d52020-06-12 17:46:39 +01007228 // For java_sdk_library_import
7229 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007230}
7231
Jooyung Han58f26ab2019-12-18 15:34:32 +09007232func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007233 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007234 apex {
7235 name: "myapex",
7236 key: "myapex.key",
7237 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007238 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007239 }
7240
7241 apex_key {
7242 name: "myapex.key",
7243 public_key: "testkey.avbpubkey",
7244 private_key: "testkey.pem",
7245 }
7246
7247 java_sdk_library {
7248 name: "foo",
7249 srcs: ["a.java"],
7250 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007251 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007252 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007253
7254 prebuilt_apis {
7255 name: "sdk",
7256 api_dirs: ["100"],
7257 }
Paul Duffin9b879592020-05-26 13:21:35 +01007258 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007259
7260 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007262 "javalib/foo.jar",
7263 "etc/permissions/foo.xml",
7264 })
7265 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007266 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007267 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 +09007268}
7269
Paul Duffin9b879592020-05-26 13:21:35 +01007270func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007271 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007272 apex {
7273 name: "myapex",
7274 key: "myapex.key",
7275 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007276 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007277 }
7278
7279 apex_key {
7280 name: "myapex.key",
7281 public_key: "testkey.avbpubkey",
7282 private_key: "testkey.pem",
7283 }
7284
7285 java_sdk_library {
7286 name: "foo",
7287 srcs: ["a.java"],
7288 api_packages: ["foo"],
7289 apex_available: ["myapex"],
7290 sdk_version: "none",
7291 system_modules: "none",
7292 }
7293
7294 java_library {
7295 name: "bar",
7296 srcs: ["a.java"],
7297 libs: ["foo"],
7298 apex_available: ["myapex"],
7299 sdk_version: "none",
7300 system_modules: "none",
7301 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007302
7303 prebuilt_apis {
7304 name: "sdk",
7305 api_dirs: ["100"],
7306 }
Paul Duffin9b879592020-05-26 13:21:35 +01007307 `, withFiles(filesForSdkLibrary))
7308
7309 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007311 "javalib/bar.jar",
7312 "javalib/foo.jar",
7313 "etc/permissions/foo.xml",
7314 })
7315
7316 // The bar library should depend on the implementation jar.
7317 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007318 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007319 t.Errorf("expected %q, found %#q", expected, actual)
7320 }
7321}
7322
7323func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007324 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007325 apex {
7326 name: "myapex",
7327 key: "myapex.key",
7328 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007329 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007330 }
7331
7332 apex_key {
7333 name: "myapex.key",
7334 public_key: "testkey.avbpubkey",
7335 private_key: "testkey.pem",
7336 }
7337
7338 java_sdk_library {
7339 name: "foo",
7340 srcs: ["a.java"],
7341 api_packages: ["foo"],
7342 apex_available: ["myapex"],
7343 sdk_version: "none",
7344 system_modules: "none",
7345 }
7346
7347 java_library {
7348 name: "bar",
7349 srcs: ["a.java"],
7350 libs: ["foo"],
7351 sdk_version: "none",
7352 system_modules: "none",
7353 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007354
7355 prebuilt_apis {
7356 name: "sdk",
7357 api_dirs: ["100"],
7358 }
Paul Duffin9b879592020-05-26 13:21:35 +01007359 `, withFiles(filesForSdkLibrary))
7360
7361 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007362 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007363 "javalib/foo.jar",
7364 "etc/permissions/foo.xml",
7365 })
7366
7367 // The bar library should depend on the stubs jar.
7368 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007369 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007370 t.Errorf("expected %q, found %#q", expected, actual)
7371 }
7372}
7373
Paul Duffineedc5d52020-06-12 17:46:39 +01007374func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007375 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007376 prebuilt_apis {
7377 name: "sdk",
7378 api_dirs: ["100"],
7379 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007380 withFiles(map[string][]byte{
7381 "apex/a.java": nil,
7382 "apex/apex_manifest.json": nil,
7383 "apex/Android.bp": []byte(`
7384 package {
7385 default_visibility: ["//visibility:private"],
7386 }
7387
7388 apex {
7389 name: "myapex",
7390 key: "myapex.key",
7391 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007392 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007393 }
7394
7395 apex_key {
7396 name: "myapex.key",
7397 public_key: "testkey.avbpubkey",
7398 private_key: "testkey.pem",
7399 }
7400
7401 java_library {
7402 name: "bar",
7403 srcs: ["a.java"],
7404 libs: ["foo"],
7405 apex_available: ["myapex"],
7406 sdk_version: "none",
7407 system_modules: "none",
7408 }
7409`),
7410 "source/a.java": nil,
7411 "source/api/current.txt": nil,
7412 "source/api/removed.txt": nil,
7413 "source/Android.bp": []byte(`
7414 package {
7415 default_visibility: ["//visibility:private"],
7416 }
7417
7418 java_sdk_library {
7419 name: "foo",
7420 visibility: ["//apex"],
7421 srcs: ["a.java"],
7422 api_packages: ["foo"],
7423 apex_available: ["myapex"],
7424 sdk_version: "none",
7425 system_modules: "none",
7426 public: {
7427 enabled: true,
7428 },
7429 }
7430`),
7431 "prebuilt/a.jar": nil,
7432 "prebuilt/Android.bp": []byte(`
7433 package {
7434 default_visibility: ["//visibility:private"],
7435 }
7436
7437 java_sdk_library_import {
7438 name: "foo",
7439 visibility: ["//apex", "//source"],
7440 apex_available: ["myapex"],
7441 prefer: true,
7442 public: {
7443 jars: ["a.jar"],
7444 },
7445 }
7446`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007447 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007448 )
7449
7450 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007451 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007452 "javalib/bar.jar",
7453 "javalib/foo.jar",
7454 "etc/permissions/foo.xml",
7455 })
7456
7457 // The bar library should depend on the implementation jar.
7458 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007459 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007460 t.Errorf("expected %q, found %#q", expected, actual)
7461 }
7462}
7463
7464func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7465 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7466 apex {
7467 name: "myapex",
7468 key: "myapex.key",
7469 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007470 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007471 }
7472
7473 apex_key {
7474 name: "myapex.key",
7475 public_key: "testkey.avbpubkey",
7476 private_key: "testkey.pem",
7477 }
7478
7479 java_sdk_library_import {
7480 name: "foo",
7481 apex_available: ["myapex"],
7482 prefer: true,
7483 public: {
7484 jars: ["a.jar"],
7485 },
7486 }
7487
7488 `, withFiles(filesForSdkLibrary))
7489}
7490
atrost6e126252020-01-27 17:01:16 +00007491func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007492 result := android.GroupFixturePreparers(
7493 prepareForApexTest,
7494 java.PrepareForTestWithPlatformCompatConfig,
7495 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007496 apex {
7497 name: "myapex",
7498 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007499 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007500 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007501 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007502 }
7503
7504 apex_key {
7505 name: "myapex.key",
7506 public_key: "testkey.avbpubkey",
7507 private_key: "testkey.pem",
7508 }
7509
7510 platform_compat_config {
7511 name: "myjar-platform-compat-config",
7512 src: ":myjar",
7513 }
7514
7515 java_library {
7516 name: "myjar",
7517 srcs: ["foo/bar/MyClass.java"],
7518 sdk_version: "none",
7519 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007520 apex_available: [ "myapex" ],
7521 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007522
7523 // Make sure that a preferred prebuilt does not affect the apex contents.
7524 prebuilt_platform_compat_config {
7525 name: "myjar-platform-compat-config",
7526 metadata: "compat-config/metadata.xml",
7527 prefer: true,
7528 }
atrost6e126252020-01-27 17:01:16 +00007529 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007530 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007531 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007532 "etc/compatconfig/myjar-platform-compat-config.xml",
7533 "javalib/myjar.jar",
7534 })
7535}
7536
Jooyung Han862c0d62022-12-21 10:15:37 +09007537func TestNoDupeApexFiles(t *testing.T) {
7538 android.GroupFixturePreparers(
7539 android.PrepareForTestWithAndroidBuildComponents,
7540 PrepareForTestWithApexBuildComponents,
7541 prepareForTestWithMyapex,
7542 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7543 ).
7544 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7545 RunTestWithBp(t, `
7546 apex {
7547 name: "myapex",
7548 key: "myapex.key",
7549 prebuilts: ["foo", "bar"],
7550 updatable: false,
7551 }
7552
7553 apex_key {
7554 name: "myapex.key",
7555 public_key: "testkey.avbpubkey",
7556 private_key: "testkey.pem",
7557 }
7558
7559 prebuilt_etc {
7560 name: "foo",
7561 src: "myprebuilt",
7562 filename_from_src: true,
7563 }
7564
7565 prebuilt_etc {
7566 name: "bar",
7567 src: "myprebuilt",
7568 filename_from_src: true,
7569 }
7570 `)
7571}
7572
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007573func TestApexUnwantedTransitiveDeps(t *testing.T) {
7574 bp := `
7575 apex {
7576 name: "myapex",
7577 key: "myapex.key",
7578 native_shared_libs: ["libfoo"],
7579 updatable: false,
7580 unwanted_transitive_deps: ["libbar"],
7581 }
7582
7583 apex_key {
7584 name: "myapex.key",
7585 public_key: "testkey.avbpubkey",
7586 private_key: "testkey.pem",
7587 }
7588
7589 cc_library {
7590 name: "libfoo",
7591 srcs: ["foo.cpp"],
7592 shared_libs: ["libbar"],
7593 apex_available: ["myapex"],
7594 }
7595
7596 cc_library {
7597 name: "libbar",
7598 srcs: ["bar.cpp"],
7599 apex_available: ["myapex"],
7600 }`
7601 ctx := testApex(t, bp)
7602 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7603 "*/libc++.so",
7604 "*/libfoo.so",
7605 // not libbar.so
7606 })
7607}
7608
Jiyong Park479321d2019-12-16 11:47:12 +09007609func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7610 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7611 apex {
7612 name: "myapex",
7613 key: "myapex.key",
7614 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007615 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007616 }
7617
7618 apex_key {
7619 name: "myapex.key",
7620 public_key: "testkey.avbpubkey",
7621 private_key: "testkey.pem",
7622 }
7623
7624 java_library {
7625 name: "myjar",
7626 srcs: ["foo/bar/MyClass.java"],
7627 sdk_version: "none",
7628 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007629 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007630 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007631 }
7632 `)
7633}
7634
Jiyong Park7afd1072019-12-30 16:56:33 +09007635func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007636 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007637 apex {
7638 name: "myapex",
7639 key: "myapex.key",
7640 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007641 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007642 }
7643
7644 apex_key {
7645 name: "myapex.key",
7646 public_key: "testkey.avbpubkey",
7647 private_key: "testkey.pem",
7648 }
7649
7650 cc_library {
7651 name: "mylib",
7652 srcs: ["mylib.cpp"],
7653 system_shared_libs: [],
7654 stl: "none",
7655 required: ["a", "b"],
7656 host_required: ["c", "d"],
7657 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007658 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007659 }
7660 `)
7661
Jooyung Hana0503a52023-08-23 13:12:50 +09007662 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007663 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007664 name := apexBundle.BaseModuleName()
7665 prefix := "TARGET_"
7666 var builder strings.Builder
7667 data.Custom(&builder, name, prefix, "", data)
7668 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007669 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007670 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7671 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007672}
7673
Jiyong Park7cd10e32020-01-14 09:22:18 +09007674func TestSymlinksFromApexToSystem(t *testing.T) {
7675 bp := `
7676 apex {
7677 name: "myapex",
7678 key: "myapex.key",
7679 native_shared_libs: ["mylib"],
7680 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007681 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007682 }
7683
Jiyong Park9d677202020-02-19 16:29:35 +09007684 apex {
7685 name: "myapex.updatable",
7686 key: "myapex.key",
7687 native_shared_libs: ["mylib"],
7688 java_libs: ["myjar"],
7689 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007690 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007691 }
7692
Jiyong Park7cd10e32020-01-14 09:22:18 +09007693 apex_key {
7694 name: "myapex.key",
7695 public_key: "testkey.avbpubkey",
7696 private_key: "testkey.pem",
7697 }
7698
7699 cc_library {
7700 name: "mylib",
7701 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007702 shared_libs: [
7703 "myotherlib",
7704 "myotherlib_ext",
7705 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007706 system_shared_libs: [],
7707 stl: "none",
7708 apex_available: [
7709 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007710 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007711 "//apex_available:platform",
7712 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007713 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007714 }
7715
7716 cc_library {
7717 name: "myotherlib",
7718 srcs: ["mylib.cpp"],
7719 system_shared_libs: [],
7720 stl: "none",
7721 apex_available: [
7722 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007723 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007724 "//apex_available:platform",
7725 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007726 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007727 }
7728
Jiyong Parkce243632023-02-17 18:22:25 +09007729 cc_library {
7730 name: "myotherlib_ext",
7731 srcs: ["mylib.cpp"],
7732 system_shared_libs: [],
7733 system_ext_specific: true,
7734 stl: "none",
7735 apex_available: [
7736 "myapex",
7737 "myapex.updatable",
7738 "//apex_available:platform",
7739 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007740 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007741 }
7742
Jiyong Park7cd10e32020-01-14 09:22:18 +09007743 java_library {
7744 name: "myjar",
7745 srcs: ["foo/bar/MyClass.java"],
7746 sdk_version: "none",
7747 system_modules: "none",
7748 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007749 apex_available: [
7750 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007751 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007752 "//apex_available:platform",
7753 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007754 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007755 }
7756
7757 java_library {
7758 name: "myotherjar",
7759 srcs: ["foo/bar/MyClass.java"],
7760 sdk_version: "none",
7761 system_modules: "none",
7762 apex_available: [
7763 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007764 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007765 "//apex_available:platform",
7766 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007767 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007768 }
7769 `
7770
7771 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7772 for _, f := range files {
7773 if f.path == file {
7774 if f.isLink {
7775 t.Errorf("%q is not a real file", file)
7776 }
7777 return
7778 }
7779 }
7780 t.Errorf("%q is not found", file)
7781 }
7782
Jiyong Parkce243632023-02-17 18:22:25 +09007783 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007784 for _, f := range files {
7785 if f.path == file {
7786 if !f.isLink {
7787 t.Errorf("%q is not a symlink", file)
7788 }
Jiyong Parkce243632023-02-17 18:22:25 +09007789 if f.src != target {
7790 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7791 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007792 return
7793 }
7794 }
7795 t.Errorf("%q is not found", file)
7796 }
7797
Jiyong Park9d677202020-02-19 16:29:35 +09007798 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7799 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007800 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007801 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007802 ensureRealfileExists(t, files, "javalib/myjar.jar")
7803 ensureRealfileExists(t, files, "lib64/mylib.so")
7804 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007805 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007806
Jooyung Hana0503a52023-08-23 13:12:50 +09007807 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007808 ensureRealfileExists(t, files, "javalib/myjar.jar")
7809 ensureRealfileExists(t, files, "lib64/mylib.so")
7810 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007811 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007812
7813 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007814 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007815 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007816 ensureRealfileExists(t, files, "javalib/myjar.jar")
7817 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007818 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7819 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007820
Jooyung Hana0503a52023-08-23 13:12:50 +09007821 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007822 ensureRealfileExists(t, files, "javalib/myjar.jar")
7823 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007824 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7825 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007826}
7827
Yo Chiange8128052020-07-23 20:09:18 +08007828func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007829 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
7833 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007834 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 cc_library_shared {
7844 name: "mylib",
7845 srcs: ["mylib.cpp"],
7846 shared_libs: ["myotherlib"],
7847 system_shared_libs: [],
7848 stl: "none",
7849 apex_available: [
7850 "myapex",
7851 "//apex_available:platform",
7852 ],
7853 }
7854
7855 cc_prebuilt_library_shared {
7856 name: "myotherlib",
7857 srcs: ["prebuilt.so"],
7858 system_shared_libs: [],
7859 stl: "none",
7860 apex_available: [
7861 "myapex",
7862 "//apex_available:platform",
7863 ],
7864 }
7865 `)
7866
Jooyung Hana0503a52023-08-23 13:12:50 +09007867 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007868 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007869 var builder strings.Builder
7870 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7871 androidMk := builder.String()
7872 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007873 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007874 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7875 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7876 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007877 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007878}
7879
Jooyung Han643adc42020-02-27 13:50:06 +09007880func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007881 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007882 apex {
7883 name: "myapex",
7884 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007885 binaries: ["mybin"],
7886 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007887 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007888 }
7889
7890 apex_key {
7891 name: "myapex.key",
7892 public_key: "testkey.avbpubkey",
7893 private_key: "testkey.pem",
7894 }
7895
7896 cc_library {
7897 name: "mylib",
7898 srcs: ["mylib.cpp"],
7899 shared_libs: ["mylib2"],
7900 system_shared_libs: [],
7901 stl: "none",
7902 apex_available: [ "myapex" ],
7903 }
7904
7905 cc_library {
7906 name: "mylib2",
7907 srcs: ["mylib.cpp"],
7908 system_shared_libs: [],
7909 stl: "none",
7910 apex_available: [ "myapex" ],
7911 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007912
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007913 // Used as both a JNI library and a regular shared library.
7914 cc_library {
7915 name: "mylib3",
7916 srcs: ["mylib.cpp"],
7917 system_shared_libs: [],
7918 stl: "none",
7919 apex_available: [ "myapex" ],
7920 }
7921
7922 cc_binary {
7923 name: "mybin",
7924 srcs: ["mybin.cpp"],
7925 shared_libs: ["mylib3"],
7926 system_shared_libs: [],
7927 stl: "none",
7928 apex_available: [ "myapex" ],
7929 }
7930
Jiyong Park34d5c332022-02-24 18:02:44 +09007931 rust_ffi_shared {
7932 name: "libfoo.rust",
7933 crate_name: "foo",
7934 srcs: ["foo.rs"],
7935 shared_libs: ["libfoo.shared_from_rust"],
7936 prefer_rlib: true,
7937 apex_available: ["myapex"],
7938 }
7939
7940 cc_library_shared {
7941 name: "libfoo.shared_from_rust",
7942 srcs: ["mylib.cpp"],
7943 system_shared_libs: [],
7944 stl: "none",
7945 stubs: {
7946 versions: ["10", "11", "12"],
7947 },
7948 }
7949
Jooyung Han643adc42020-02-27 13:50:06 +09007950 `)
7951
Jooyung Hana0503a52023-08-23 13:12:50 +09007952 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09007953 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007954 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09007955 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007956 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09007957 "lib64/mylib.so",
7958 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007959 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007960 "lib64/libfoo.rust.so",
7961 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7962 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007963 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007964
7965 // b/220397949
7966 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007967}
7968
Jooyung Han49f67012020-04-17 13:43:10 +09007969func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007970 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007971 apex {
7972 name: "myapex",
7973 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007974 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007975 }
7976 apex_key {
7977 name: "myapex.key",
7978 public_key: "testkey.avbpubkey",
7979 private_key: "testkey.pem",
7980 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007981 `,
7982 android.FixtureModifyConfig(func(config android.Config) {
7983 delete(config.Targets, android.Android)
7984 config.AndroidCommonTarget = android.Target{}
7985 }),
7986 )
Jooyung Han49f67012020-04-17 13:43:10 +09007987
7988 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7989 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7990 }
7991}
7992
Jiyong Parkbd159612020-02-28 15:22:21 +09007993func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007994 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007995 apex {
7996 name: "myapex",
7997 key: "myapex.key",
7998 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007999 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008000 }
8001
8002 apex_key {
8003 name: "myapex.key",
8004 public_key: "testkey.avbpubkey",
8005 private_key: "testkey.pem",
8006 }
8007
8008 android_app {
8009 name: "AppFoo",
8010 srcs: ["foo/bar/MyClass.java"],
8011 sdk_version: "none",
8012 system_modules: "none",
8013 apex_available: [ "myapex" ],
8014 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008015 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008016
Jooyung Hana0503a52023-08-23 13:12:50 +09008017 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008018 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008019
8020 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008021 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 +09008022}
8023
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008024func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008025 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008026 apex {
8027 name: "myapex",
8028 key: "myapex.key",
8029 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008030 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008031 }
8032
8033 apex_key {
8034 name: "myapex.key",
8035 public_key: "testkey.avbpubkey",
8036 private_key: "testkey.pem",
8037 }
8038
8039 android_app_set {
8040 name: "AppSet",
8041 set: "AppSet.apks",
8042 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008043 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008044 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008045 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008046 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8047 s := mod.Rule("apexRule").Args["copy_commands"]
8048 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008049 if len(copyCmds) != 4 {
8050 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008051 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008052 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8053 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008054 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8055 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008056
8057 // Ensure that canned_fs_config has an entry for the app set zip file
8058 generateFsRule := mod.Rule("generateFsConfig")
8059 cmd := generateFsRule.RuleParams.Command
8060 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008061}
8062
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008063func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008064 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008065 apex_set {
8066 name: "myapex",
8067 filename: "foo_v2.apex",
8068 sanitized: {
8069 none: { set: "myapex.apks", },
8070 hwaddress: { set: "myapex.hwasan.apks", },
8071 },
Paul Duffin24704672021-04-06 16:09:30 +01008072 }
8073 `
8074 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008075
Paul Duffin24704672021-04-06 16:09:30 +01008076 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008077 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008078
Spandan Das3576e762024-01-03 18:57:03 +00008079 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008080 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008081
Paul Duffin24704672021-04-06 16:09:30 +01008082 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8083
8084 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008085 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8086 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008087
8088 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008089}
8090
Pranav Guptaeba03b02022-09-27 00:27:08 +00008091func TestApexSetApksModuleAssignment(t *testing.T) {
8092 ctx := testApex(t, `
8093 apex_set {
8094 name: "myapex",
8095 set: ":myapex_apks_file",
8096 }
8097
8098 filegroup {
8099 name: "myapex_apks_file",
8100 srcs: ["myapex.apks"],
8101 }
8102 `)
8103
Spandan Das3576e762024-01-03 18:57:03 +00008104 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008105
8106 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008107 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008108 extractedApex := m.Output(extractorOutput)
8109
8110 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8111}
8112
Paul Duffin89f570a2021-06-16 01:42:33 +01008113func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008114 t.Helper()
8115
Paul Duffin55607122021-03-30 23:32:51 +01008116 fs := android.MockFS{
8117 "a.java": nil,
8118 "a.jar": nil,
8119 "apex_manifest.json": nil,
8120 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008121 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008122 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8123 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8124 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008125 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008126 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008127
Paul Duffin55607122021-03-30 23:32:51 +01008128 errorHandler := android.FixtureExpectsNoErrors
8129 if errmsg != "" {
8130 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008131 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008132
Paul Duffin55607122021-03-30 23:32:51 +01008133 result := android.GroupFixturePreparers(
8134 cc.PrepareForTestWithCcDefaultModules,
8135 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008136 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008137 java.PrepareForTestWithJavaSdkLibraryFiles,
8138 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008139 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008140 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008141 android.FixtureModifyMockFS(func(fs android.MockFS) {
8142 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8143 insert := ""
8144 for _, fragment := range fragments {
8145 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8146 }
8147 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8148 platform_bootclasspath {
8149 name: "platform-bootclasspath",
8150 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008151 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008152 %s
8153 ],
8154 }
8155 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008156 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008157 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008158 // Dexpreopt for boot jars requires the ART boot image profile.
8159 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8160 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008161 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008162 ).
8163 ExtendWithErrorHandler(errorHandler).
8164 RunTestWithBp(t, bp)
8165
8166 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008167}
8168
Paul Duffin5556c5f2022-06-09 17:32:21 +00008169func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008170 preparers := android.GroupFixturePreparers(
8171 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008172 prepareForTestWithBootclasspathFragment,
8173 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008174 PrepareForTestWithApexBuildComponents,
8175 ).
8176 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008177 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008178
8179 bpBase := `
8180 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008181 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008182 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008183 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008184 set: "myapex.apks",
8185 }
8186
8187 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008188 name: "com.mycompany.android.art",
8189 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008190 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008191 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008192 set: "company-myapex.apks",
8193 }
8194
8195 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008196 name: "art-bootclasspath-fragment",
8197 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008198 hidden_api: {
8199 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8200 metadata: "my-bootclasspath-fragment/metadata.csv",
8201 index: "my-bootclasspath-fragment/index.csv",
8202 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8203 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8204 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008205 %s
8206 }
8207 `
8208
8209 t.Run("java_import", func(t *testing.T) {
8210 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8211 java_import {
8212 name: "libfoo",
8213 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008214 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008215 }
8216 `)
8217 })
8218
8219 t.Run("java_sdk_library_import", func(t *testing.T) {
8220 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8221 java_sdk_library_import {
8222 name: "libfoo",
8223 public: {
8224 jars: ["libbar.jar"],
8225 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008226 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008227 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008228 }
8229 `)
8230 })
8231
8232 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8233 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8234 image_name: "art",
8235 contents: ["libfoo"],
8236 `)+`
8237 java_sdk_library_import {
8238 name: "libfoo",
8239 public: {
8240 jars: ["libbar.jar"],
8241 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008242 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008243 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008244 }
8245 `)
8246 })
8247}
8248
Paul Duffin5556c5f2022-06-09 17:32:21 +00008249func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8250 preparers := android.GroupFixturePreparers(
8251 java.PrepareForTestWithJavaDefaultModules,
8252 PrepareForTestWithApexBuildComponents,
8253 )
8254
Spandan Das59a4a2b2024-01-09 21:35:56 +00008255 errCtx := moduleErrorfTestCtx{}
8256
Paul Duffin5556c5f2022-06-09 17:32:21 +00008257 bpBase := `
8258 apex_set {
8259 name: "com.android.myapex",
8260 installable: true,
8261 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8262 set: "myapex.apks",
8263 }
8264
8265 apex_set {
8266 name: "com.android.myapex_compressed",
8267 apex_name: "com.android.myapex",
8268 installable: true,
8269 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8270 set: "myapex_compressed.apks",
8271 }
8272
8273 prebuilt_bootclasspath_fragment {
8274 name: "my-bootclasspath-fragment",
8275 apex_available: [
8276 "com.android.myapex",
8277 "com.android.myapex_compressed",
8278 ],
8279 hidden_api: {
8280 annotation_flags: "annotation-flags.csv",
8281 metadata: "metadata.csv",
8282 index: "index.csv",
8283 signature_patterns: "signature_patterns.csv",
8284 },
8285 %s
8286 }
8287 `
8288
8289 t.Run("java_import", func(t *testing.T) {
8290 result := preparers.RunTestWithBp(t,
8291 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8292 java_import {
8293 name: "libfoo",
8294 jars: ["libfoo.jar"],
8295 apex_available: [
8296 "com.android.myapex",
8297 "com.android.myapex_compressed",
8298 ],
8299 }
8300 `)
8301
8302 module := result.Module("libfoo", "android_common_com.android.myapex")
8303 usesLibraryDep := module.(java.UsesLibraryDependency)
8304 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008305 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008306 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008307 })
8308
8309 t.Run("java_sdk_library_import", func(t *testing.T) {
8310 result := preparers.RunTestWithBp(t,
8311 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8312 java_sdk_library_import {
8313 name: "libfoo",
8314 public: {
8315 jars: ["libbar.jar"],
8316 },
8317 apex_available: [
8318 "com.android.myapex",
8319 "com.android.myapex_compressed",
8320 ],
8321 compile_dex: true,
8322 }
8323 `)
8324
8325 module := result.Module("libfoo", "android_common_com.android.myapex")
8326 usesLibraryDep := module.(java.UsesLibraryDependency)
8327 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008328 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008329 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008330 })
8331
8332 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8333 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8334 image_name: "art",
8335 contents: ["libfoo"],
8336 `)+`
8337 java_sdk_library_import {
8338 name: "libfoo",
8339 public: {
8340 jars: ["libbar.jar"],
8341 },
8342 apex_available: [
8343 "com.android.myapex",
8344 "com.android.myapex_compressed",
8345 ],
8346 compile_dex: true,
8347 }
8348 `)
8349 })
8350}
8351
Jooyung Han548640b2020-04-27 12:10:30 +09008352func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8353 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
8357 updatable: true,
8358 }
8359
8360 apex_key {
8361 name: "myapex.key",
8362 public_key: "testkey.avbpubkey",
8363 private_key: "testkey.pem",
8364 }
8365 `)
8366}
8367
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008368func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8369 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8370 apex {
8371 name: "myapex",
8372 key: "myapex.key",
8373 }
8374
8375 apex_key {
8376 name: "myapex.key",
8377 public_key: "testkey.avbpubkey",
8378 private_key: "testkey.pem",
8379 }
8380 `)
8381}
8382
Jooyung Handfc864c2023-03-20 18:19:07 +09008383func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8384 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008385 apex {
8386 name: "myapex",
8387 key: "myapex.key",
8388 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008389 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008390 soc_specific: true,
8391 }
8392
8393 apex_key {
8394 name: "myapex.key",
8395 public_key: "testkey.avbpubkey",
8396 private_key: "testkey.pem",
8397 }
8398 `)
8399}
8400
Jooyung Han02873da2023-03-22 17:41:03 +09008401func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8402 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8403 apex {
8404 name: "myapex",
8405 key: "myapex.key",
8406 updatable: false,
8407 min_sdk_version: "29",
8408 use_vndk_as_stable: true,
8409 vendor: true,
8410 }
8411
8412 apex_key {
8413 name: "myapex.key",
8414 public_key: "testkey.avbpubkey",
8415 private_key: "testkey.pem",
8416 }
8417 `)
8418}
8419
Jooyung Handfc864c2023-03-20 18:19:07 +09008420func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8421 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8422 apex {
8423 name: "myapex",
8424 key: "myapex.key",
8425 updatable: false,
8426 use_vndk_as_stable: true,
8427 }
8428
8429 apex_key {
8430 name: "myapex.key",
8431 public_key: "testkey.avbpubkey",
8432 private_key: "testkey.pem",
8433 }
8434 `)
8435}
8436
satayevb98371c2021-06-15 16:49:50 +01008437func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8438 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8439 apex {
8440 name: "myapex",
8441 key: "myapex.key",
8442 systemserverclasspath_fragments: [
8443 "mysystemserverclasspathfragment",
8444 ],
8445 min_sdk_version: "29",
8446 updatable: true,
8447 }
8448
8449 apex_key {
8450 name: "myapex.key",
8451 public_key: "testkey.avbpubkey",
8452 private_key: "testkey.pem",
8453 }
8454
8455 java_library {
8456 name: "foo",
8457 srcs: ["b.java"],
8458 min_sdk_version: "29",
8459 installable: true,
8460 apex_available: [
8461 "myapex",
8462 ],
8463 }
8464
8465 systemserverclasspath_fragment {
8466 name: "mysystemserverclasspathfragment",
8467 generate_classpaths_proto: false,
8468 contents: [
8469 "foo",
8470 ],
8471 apex_available: [
8472 "myapex",
8473 ],
8474 }
satayevabcd5972021-08-06 17:49:46 +01008475 `,
8476 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8477 )
satayevb98371c2021-06-15 16:49:50 +01008478}
8479
Paul Duffin064b70c2020-11-02 17:32:38 +00008480func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008481 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008482 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008483 fragment := java.ApexVariantReference{
8484 Apex: proptools.StringPtr("myapex"),
8485 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8486 }
8487
Paul Duffin064b70c2020-11-02 17:32:38 +00008488 testDexpreoptWithApexes(t, `
8489 prebuilt_apex {
8490 name: "myapex" ,
8491 arch: {
8492 arm64: {
8493 src: "myapex-arm64.apex",
8494 },
8495 arm: {
8496 src: "myapex-arm.apex",
8497 },
8498 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008499 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8500 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008501
Paul Duffin89f570a2021-06-16 01:42:33 +01008502 prebuilt_bootclasspath_fragment {
8503 name: "my-bootclasspath-fragment",
8504 contents: ["libfoo"],
8505 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008506 hidden_api: {
8507 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8508 metadata: "my-bootclasspath-fragment/metadata.csv",
8509 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008510 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8511 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8512 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008513 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008514 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008515
Paul Duffin89f570a2021-06-16 01:42:33 +01008516 java_import {
8517 name: "libfoo",
8518 jars: ["libfoo.jar"],
8519 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008520 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008521 }
8522 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008523 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008524}
8525
Spandan Dasf14e2542021-11-12 00:01:37 +00008526func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008527 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008528 bp += `
8529 apex_key {
8530 name: "myapex.key",
8531 public_key: "testkey.avbpubkey",
8532 private_key: "testkey.pem",
8533 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008534 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008535 "lib1/src/A.java": nil,
8536 "lib2/src/B.java": nil,
8537 "system/sepolicy/apex/myapex-file_contexts": nil,
8538 }
8539
Paul Duffin45338f02021-03-30 23:07:52 +01008540 errorHandler := android.FixtureExpectsNoErrors
8541 if errmsg != "" {
8542 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008543 }
Colin Crossae8600b2020-10-29 17:09:13 -07008544
Paul Duffin45338f02021-03-30 23:07:52 +01008545 android.GroupFixturePreparers(
8546 android.PrepareForTestWithAndroidBuildComponents,
8547 java.PrepareForTestWithJavaBuildComponents,
8548 PrepareForTestWithApexBuildComponents,
8549 android.PrepareForTestWithNeverallowRules(rules),
8550 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008551 apexBootJars := make([]string, 0, len(bootJars))
8552 for _, apexBootJar := range bootJars {
8553 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008554 }
satayevd604b212021-07-21 14:23:52 +01008555 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008556 }),
8557 fs.AddToFixture(),
8558 ).
8559 ExtendWithErrorHandler(errorHandler).
8560 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008561}
8562
8563func TestApexPermittedPackagesRules(t *testing.T) {
8564 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008565 name string
8566 expectedError string
8567 bp string
8568 bootJars []string
8569 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008570 }{
8571
8572 {
8573 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8574 expectedError: "",
8575 bp: `
8576 java_library {
8577 name: "bcp_lib1",
8578 srcs: ["lib1/src/*.java"],
8579 permitted_packages: ["foo.bar"],
8580 apex_available: ["myapex"],
8581 sdk_version: "none",
8582 system_modules: "none",
8583 }
8584 java_library {
8585 name: "nonbcp_lib2",
8586 srcs: ["lib2/src/*.java"],
8587 apex_available: ["myapex"],
8588 permitted_packages: ["a.b"],
8589 sdk_version: "none",
8590 system_modules: "none",
8591 }
8592 apex {
8593 name: "myapex",
8594 key: "myapex.key",
8595 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008596 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008597 }`,
8598 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008599 bcpPermittedPackages: map[string][]string{
8600 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008601 "foo.bar",
8602 },
8603 },
8604 },
8605 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008606 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008607 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 +01008608 bp: `
8609 java_library {
8610 name: "bcp_lib1",
8611 srcs: ["lib1/src/*.java"],
8612 apex_available: ["myapex"],
8613 permitted_packages: ["foo.bar"],
8614 sdk_version: "none",
8615 system_modules: "none",
8616 }
8617 java_library {
8618 name: "bcp_lib2",
8619 srcs: ["lib2/src/*.java"],
8620 apex_available: ["myapex"],
8621 permitted_packages: ["foo.bar", "bar.baz"],
8622 sdk_version: "none",
8623 system_modules: "none",
8624 }
8625 apex {
8626 name: "myapex",
8627 key: "myapex.key",
8628 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008629 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008630 }
8631 `,
8632 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008633 bcpPermittedPackages: map[string][]string{
8634 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008635 "foo.bar",
8636 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008637 "bcp_lib2": []string{
8638 "foo.bar",
8639 },
8640 },
8641 },
8642 {
8643 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8644 expectedError: "",
8645 bp: `
8646 java_library {
8647 name: "bcp_lib_restricted",
8648 srcs: ["lib1/src/*.java"],
8649 apex_available: ["myapex"],
8650 permitted_packages: ["foo.bar"],
8651 sdk_version: "none",
8652 min_sdk_version: "29",
8653 system_modules: "none",
8654 }
8655 java_library {
8656 name: "bcp_lib_unrestricted",
8657 srcs: ["lib2/src/*.java"],
8658 apex_available: ["myapex"],
8659 permitted_packages: ["foo.bar", "bar.baz"],
8660 sdk_version: "none",
8661 min_sdk_version: "29",
8662 system_modules: "none",
8663 }
8664 apex {
8665 name: "myapex",
8666 key: "myapex.key",
8667 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8668 updatable: true,
8669 min_sdk_version: "29",
8670 }
8671 `,
8672 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8673 bcpPermittedPackages: map[string][]string{
8674 "bcp_lib1_non_updateable": []string{
8675 "foo.bar",
8676 },
8677 // 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 +01008678 },
8679 },
8680 }
8681 for _, tc := range testcases {
8682 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008683 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8684 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008685 })
8686 }
8687}
8688
Jiyong Park62304bb2020-04-13 16:19:48 +09008689func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008690 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008691 apex {
8692 name: "myapex",
8693 key: "myapex.key",
8694 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008695 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008696 }
8697
8698 apex_key {
8699 name: "myapex.key",
8700 public_key: "testkey.avbpubkey",
8701 private_key: "testkey.pem",
8702 }
8703
8704 cc_library {
8705 name: "mylib",
8706 srcs: ["mylib.cpp"],
8707 system_shared_libs: [],
8708 stl: "none",
8709 stubs: {
8710 versions: ["1"],
8711 },
8712 apex_available: ["myapex"],
8713 }
8714
8715 cc_library {
8716 name: "myprivlib",
8717 srcs: ["mylib.cpp"],
8718 system_shared_libs: [],
8719 stl: "none",
8720 apex_available: ["myapex"],
8721 }
8722
8723
8724 cc_test {
8725 name: "mytest",
8726 gtest: false,
8727 srcs: ["mylib.cpp"],
8728 system_shared_libs: [],
8729 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008730 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008731 test_for: ["myapex"]
8732 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008733
8734 cc_library {
8735 name: "mytestlib",
8736 srcs: ["mylib.cpp"],
8737 system_shared_libs: [],
8738 shared_libs: ["mylib", "myprivlib"],
8739 stl: "none",
8740 test_for: ["myapex"],
8741 }
8742
8743 cc_benchmark {
8744 name: "mybench",
8745 srcs: ["mylib.cpp"],
8746 system_shared_libs: [],
8747 shared_libs: ["mylib", "myprivlib"],
8748 stl: "none",
8749 test_for: ["myapex"],
8750 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008751 `)
8752
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008753 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008754 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008755 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8756 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8757 }
8758
8759 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008760 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008761 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8762 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8763 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8764}
Jiyong Park46a512f2020-12-04 18:02:13 +09008765
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008766func TestIndirectTestFor(t *testing.T) {
8767 ctx := testApex(t, `
8768 apex {
8769 name: "myapex",
8770 key: "myapex.key",
8771 native_shared_libs: ["mylib", "myprivlib"],
8772 updatable: false,
8773 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008774
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008775 apex_key {
8776 name: "myapex.key",
8777 public_key: "testkey.avbpubkey",
8778 private_key: "testkey.pem",
8779 }
8780
8781 cc_library {
8782 name: "mylib",
8783 srcs: ["mylib.cpp"],
8784 system_shared_libs: [],
8785 stl: "none",
8786 stubs: {
8787 versions: ["1"],
8788 },
8789 apex_available: ["myapex"],
8790 }
8791
8792 cc_library {
8793 name: "myprivlib",
8794 srcs: ["mylib.cpp"],
8795 system_shared_libs: [],
8796 stl: "none",
8797 shared_libs: ["mylib"],
8798 apex_available: ["myapex"],
8799 }
8800
8801 cc_library {
8802 name: "mytestlib",
8803 srcs: ["mylib.cpp"],
8804 system_shared_libs: [],
8805 shared_libs: ["myprivlib"],
8806 stl: "none",
8807 test_for: ["myapex"],
8808 }
8809 `)
8810
8811 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008812 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008813 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8814 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8815 }
8816
8817 // The platform variant of mytestlib links to the platform variant of the
8818 // internal myprivlib.
8819 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8820
8821 // The platform variant of myprivlib links to the platform variant of mylib
8822 // and bypasses its stubs.
8823 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 +09008824}
8825
Martin Stjernholmec009002021-03-27 15:18:31 +00008826func TestTestForForLibInOtherApex(t *testing.T) {
8827 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8828 _ = testApex(t, `
8829 apex {
8830 name: "com.android.art",
8831 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008832 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008833 updatable: false,
8834 }
8835
8836 apex {
8837 name: "com.android.art.debug",
8838 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008839 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008840 updatable: false,
8841 }
8842
8843 apex_key {
8844 name: "myapex.key",
8845 public_key: "testkey.avbpubkey",
8846 private_key: "testkey.pem",
8847 }
8848
8849 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008850 name: "libnativebridge",
8851 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008852 system_shared_libs: [],
8853 stl: "none",
8854 stubs: {
8855 versions: ["1"],
8856 },
8857 apex_available: ["com.android.art", "com.android.art.debug"],
8858 }
8859
8860 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008861 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008862 srcs: ["mylib.cpp"],
8863 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008864 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008865 stl: "none",
8866 apex_available: ["com.android.art.debug"],
8867 test_for: ["com.android.art"],
8868 }
8869 `,
8870 android.MockFS{
8871 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8872 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8873 }.AddToFixture())
8874}
8875
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008876// TODO(jungjw): Move this to proptools
8877func intPtr(i int) *int {
8878 return &i
8879}
8880
8881func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008882 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008883 apex_set {
8884 name: "myapex",
8885 set: "myapex.apks",
8886 filename: "foo_v2.apex",
8887 overrides: ["foo"],
8888 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008889 `,
8890 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8891 variables.Platform_sdk_version = intPtr(30)
8892 }),
8893 android.FixtureModifyConfig(func(config android.Config) {
8894 config.Targets[android.Android] = []android.Target{
8895 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8896 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8897 }
8898 }),
8899 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008900
Spandan Das3576e762024-01-03 18:57:03 +00008901 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008902
8903 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008904 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008905 actual := extractedApex.Args["abis"]
8906 expected := "ARMEABI_V7A,ARM64_V8A"
8907 if actual != expected {
8908 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8909 }
8910 actual = extractedApex.Args["sdk-version"]
8911 expected = "30"
8912 if actual != expected {
8913 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8914 }
8915
Paul Duffin6717d882021-06-15 19:09:41 +01008916 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008917 a := m.Module().(*ApexSet)
8918 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008919 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008920 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8921 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8922 }
8923}
8924
Anton Hansson805e0a52022-11-25 14:06:46 +00008925func TestApexSet_NativeBridge(t *testing.T) {
8926 ctx := testApex(t, `
8927 apex_set {
8928 name: "myapex",
8929 set: "myapex.apks",
8930 filename: "foo_v2.apex",
8931 overrides: ["foo"],
8932 }
8933 `,
8934 android.FixtureModifyConfig(func(config android.Config) {
8935 config.Targets[android.Android] = []android.Target{
8936 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8937 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8938 }
8939 }),
8940 )
8941
Spandan Das3576e762024-01-03 18:57:03 +00008942 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00008943
8944 // Check extract_apks tool parameters. No native bridge arch expected
8945 extractedApex := m.Output("extracted/myapex.apks")
8946 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8947}
8948
Jiyong Park7d95a512020-05-10 15:16:24 +09008949func TestNoStaticLinkingToStubsLib(t *testing.T) {
8950 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8951 apex {
8952 name: "myapex",
8953 key: "myapex.key",
8954 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008955 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008956 }
8957
8958 apex_key {
8959 name: "myapex.key",
8960 public_key: "testkey.avbpubkey",
8961 private_key: "testkey.pem",
8962 }
8963
8964 cc_library {
8965 name: "mylib",
8966 srcs: ["mylib.cpp"],
8967 static_libs: ["otherlib"],
8968 system_shared_libs: [],
8969 stl: "none",
8970 apex_available: [ "myapex" ],
8971 }
8972
8973 cc_library {
8974 name: "otherlib",
8975 srcs: ["mylib.cpp"],
8976 system_shared_libs: [],
8977 stl: "none",
8978 stubs: {
8979 versions: ["1", "2", "3"],
8980 },
8981 apex_available: [ "myapex" ],
8982 }
8983 `)
8984}
8985
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008986func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008987 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008988 apex {
8989 name: "myapex",
8990 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008991 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008992 custom_sign_tool: "sign_myapex",
8993 }
8994
8995 apex_key {
8996 name: "myapex.key",
8997 public_key: "testkey.avbpubkey",
8998 private_key: "testkey.pem",
8999 }
9000 `)
9001
Jooyung Han286957d2023-10-30 16:17:56 +09009002 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009003 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009004 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 +09009005}
9006
9007func TestApexKeysTxtOverrides(t *testing.T) {
9008 ctx := testApex(t, `
9009 apex {
9010 name: "myapex",
9011 key: "myapex.key",
9012 updatable: false,
9013 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009014 }
9015
9016 apex_key {
9017 name: "myapex.key",
9018 public_key: "testkey.avbpubkey",
9019 private_key: "testkey.pem",
9020 }
9021
9022 prebuilt_apex {
9023 name: "myapex",
9024 prefer: true,
9025 arch: {
9026 arm64: {
9027 src: "myapex-arm64.apex",
9028 },
9029 arm: {
9030 src: "myapex-arm.apex",
9031 },
9032 },
9033 }
9034
9035 apex_set {
9036 name: "myapex_set",
9037 set: "myapex.apks",
9038 filename: "myapex_set.apex",
9039 overrides: ["myapex"],
9040 }
9041 `)
9042
Colin Crossf61d03d2023-11-02 16:56:39 -07009043 content := android.ContentFromFileRuleForTests(t, ctx,
9044 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009045 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 -07009046 content = android.ContentFromFileRuleForTests(t, ctx,
9047 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009048 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 +09009049}
9050
Jooyung Han938b5932020-06-20 12:47:47 +09009051func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009052 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009053 apex {
9054 name: "myapex",
9055 key: "myapex.key",
9056 apps: ["app"],
9057 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009058 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009059 }
9060
9061 apex_key {
9062 name: "myapex.key",
9063 public_key: "testkey.avbpubkey",
9064 private_key: "testkey.pem",
9065 }
9066
9067 android_app {
9068 name: "app",
9069 srcs: ["foo/bar/MyClass.java"],
9070 package_name: "foo",
9071 sdk_version: "none",
9072 system_modules: "none",
9073 apex_available: [ "myapex" ],
9074 }
9075 `, withFiles(map[string][]byte{
9076 "sub/Android.bp": []byte(`
9077 override_apex {
9078 name: "override_myapex",
9079 base: "myapex",
9080 apps: ["override_app"],
9081 allowed_files: ":allowed",
9082 }
9083 // Overridable "path" property should be referenced indirectly
9084 filegroup {
9085 name: "allowed",
9086 srcs: ["allowed.txt"],
9087 }
9088 override_android_app {
9089 name: "override_app",
9090 base: "app",
9091 package_name: "bar",
9092 }
9093 `),
9094 }))
9095
Jooyung Hana0503a52023-08-23 13:12:50 +09009096 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009097 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9098 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9099 }
9100
Jooyung Hana0503a52023-08-23 13:12:50 +09009101 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009102 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9103 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9104 }
9105}
9106
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009107func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009108 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009109 apex {
9110 name: "myapex",
9111 key: "myapex.key",
9112 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009113 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009114 }
9115
9116 apex_key {
9117 name: "myapex.key",
9118 public_key: "testkey.avbpubkey",
9119 private_key: "testkey.pem",
9120 }
9121
9122 cc_library {
9123 name: "mylib",
9124 srcs: ["mylib.cpp"],
9125 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009126 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009127 },
9128 apex_available: ["myapex"],
9129 }
9130
9131 cc_prebuilt_library_shared {
9132 name: "mylib",
9133 prefer: false,
9134 srcs: ["prebuilt.so"],
9135 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009136 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009137 },
9138 apex_available: ["myapex"],
9139 }
9140 `)
9141}
9142
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009143func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009144 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009145 apex {
9146 name: "myapex",
9147 key: "myapex.key",
9148 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009149 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009150 }
9151 apex_key {
9152 name: "myapex.key",
9153 public_key: "testkey.avbpubkey",
9154 private_key: "testkey.pem",
9155 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009156 `,
9157 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9158 variables.CompressedApex = proptools.BoolPtr(true)
9159 }),
9160 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009161
Jooyung Hana0503a52023-08-23 13:12:50 +09009162 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009163 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9164
Jooyung Hana0503a52023-08-23 13:12:50 +09009165 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009166 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9167
9168 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009169 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009170 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9171
9172 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009173 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009174 var builder strings.Builder
9175 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9176 androidMk := builder.String()
9177 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9178}
9179
Martin Stjernholm2856c662020-12-02 15:03:42 +00009180func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009181 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
9185 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009186 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009187 }
9188
9189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
9194
9195 cc_library {
9196 name: "mylib",
9197 srcs: ["mylib.cpp"],
9198 apex_available: ["myapex"],
9199 shared_libs: ["otherlib"],
9200 system_shared_libs: [],
9201 }
9202
9203 cc_library {
9204 name: "otherlib",
9205 srcs: ["mylib.cpp"],
9206 stubs: {
9207 versions: ["current"],
9208 },
9209 }
9210
9211 cc_prebuilt_library_shared {
9212 name: "otherlib",
9213 prefer: true,
9214 srcs: ["prebuilt.so"],
9215 stubs: {
9216 versions: ["current"],
9217 },
9218 }
9219 `)
9220
Jooyung Hana0503a52023-08-23 13:12:50 +09009221 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009222 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009223 var builder strings.Builder
9224 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9225 androidMk := builder.String()
9226
9227 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9228 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009229 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009230}
9231
Jiyong Parke3867542020-12-03 17:28:25 +09009232func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009233 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009234 apex {
9235 name: "myapex",
9236 key: "myapex.key",
9237 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009238 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009239 }
9240
9241 apex_key {
9242 name: "myapex.key",
9243 public_key: "testkey.avbpubkey",
9244 private_key: "testkey.pem",
9245 }
9246
9247 cc_library {
9248 name: "mylib",
9249 srcs: ["mylib.cpp"],
9250 system_shared_libs: [],
9251 stl: "none",
9252 apex_available: ["myapex"],
9253 shared_libs: ["mylib2"],
9254 target: {
9255 apex: {
9256 exclude_shared_libs: ["mylib2"],
9257 },
9258 },
9259 }
9260
9261 cc_library {
9262 name: "mylib2",
9263 srcs: ["mylib.cpp"],
9264 system_shared_libs: [],
9265 stl: "none",
9266 }
9267 `)
9268
9269 // Check if mylib is linked to mylib2 for the non-apex target
9270 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9271 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9272
9273 // Make sure that the link doesn't occur for the apex target
9274 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9275 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9276
9277 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009278 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009279 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9280}
9281
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009282func TestPrebuiltStubLibDep(t *testing.T) {
9283 bpBase := `
9284 apex {
9285 name: "myapex",
9286 key: "myapex.key",
9287 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009288 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009289 }
9290 apex_key {
9291 name: "myapex.key",
9292 public_key: "testkey.avbpubkey",
9293 private_key: "testkey.pem",
9294 }
9295 cc_library {
9296 name: "mylib",
9297 srcs: ["mylib.cpp"],
9298 apex_available: ["myapex"],
9299 shared_libs: ["stublib"],
9300 system_shared_libs: [],
9301 }
9302 apex {
9303 name: "otherapex",
9304 enabled: %s,
9305 key: "myapex.key",
9306 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009307 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009308 }
9309 `
9310
9311 stublibSourceBp := `
9312 cc_library {
9313 name: "stublib",
9314 srcs: ["mylib.cpp"],
9315 apex_available: ["otherapex"],
9316 system_shared_libs: [],
9317 stl: "none",
9318 stubs: {
9319 versions: ["1"],
9320 },
9321 }
9322 `
9323
9324 stublibPrebuiltBp := `
9325 cc_prebuilt_library_shared {
9326 name: "stublib",
9327 srcs: ["prebuilt.so"],
9328 apex_available: ["otherapex"],
9329 stubs: {
9330 versions: ["1"],
9331 },
9332 %s
9333 }
9334 `
9335
9336 tests := []struct {
9337 name string
9338 stublibBp string
9339 usePrebuilt bool
9340 modNames []string // Modules to collect AndroidMkEntries for
9341 otherApexEnabled []string
9342 }{
9343 {
9344 name: "only_source",
9345 stublibBp: stublibSourceBp,
9346 usePrebuilt: false,
9347 modNames: []string{"stublib"},
9348 otherApexEnabled: []string{"true", "false"},
9349 },
9350 {
9351 name: "source_preferred",
9352 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9353 usePrebuilt: false,
9354 modNames: []string{"stublib", "prebuilt_stublib"},
9355 otherApexEnabled: []string{"true", "false"},
9356 },
9357 {
9358 name: "prebuilt_preferred",
9359 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9360 usePrebuilt: true,
9361 modNames: []string{"stublib", "prebuilt_stublib"},
9362 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9363 },
9364 {
9365 name: "only_prebuilt",
9366 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9367 usePrebuilt: true,
9368 modNames: []string{"stublib"},
9369 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9370 },
9371 }
9372
9373 for _, test := range tests {
9374 t.Run(test.name, func(t *testing.T) {
9375 for _, otherApexEnabled := range test.otherApexEnabled {
9376 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009377 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009378
9379 type modAndMkEntries struct {
9380 mod *cc.Module
9381 mkEntries android.AndroidMkEntries
9382 }
9383 entries := []*modAndMkEntries{}
9384
9385 // Gather shared lib modules that are installable
9386 for _, modName := range test.modNames {
9387 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9388 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9389 continue
9390 }
9391 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009392 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009393 continue
9394 }
Colin Crossaa255532020-07-03 13:18:24 -07009395 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009396 if ent.Disabled {
9397 continue
9398 }
9399 entries = append(entries, &modAndMkEntries{
9400 mod: mod,
9401 mkEntries: ent,
9402 })
9403 }
9404 }
9405 }
9406
9407 var entry *modAndMkEntries = nil
9408 for _, ent := range entries {
9409 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9410 if entry != nil {
9411 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9412 } else {
9413 entry = ent
9414 }
9415 }
9416 }
9417
9418 if entry == nil {
9419 t.Errorf("AndroidMk entry for \"stublib\" missing")
9420 } else {
9421 isPrebuilt := entry.mod.Prebuilt() != nil
9422 if isPrebuilt != test.usePrebuilt {
9423 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9424 }
9425 if !entry.mod.IsStubs() {
9426 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9427 }
9428 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9429 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9430 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009431 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009432 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009433 if !android.InList(expected, cflags) {
9434 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9435 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009436 }
9437 })
9438 }
9439 })
9440 }
9441}
9442
Colin Crossc33e5212021-05-25 18:16:02 -07009443func TestApexJavaCoverage(t *testing.T) {
9444 bp := `
9445 apex {
9446 name: "myapex",
9447 key: "myapex.key",
9448 java_libs: ["mylib"],
9449 bootclasspath_fragments: ["mybootclasspathfragment"],
9450 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9451 updatable: false,
9452 }
9453
9454 apex_key {
9455 name: "myapex.key",
9456 public_key: "testkey.avbpubkey",
9457 private_key: "testkey.pem",
9458 }
9459
9460 java_library {
9461 name: "mylib",
9462 srcs: ["mylib.java"],
9463 apex_available: ["myapex"],
9464 compile_dex: true,
9465 }
9466
9467 bootclasspath_fragment {
9468 name: "mybootclasspathfragment",
9469 contents: ["mybootclasspathlib"],
9470 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009471 hidden_api: {
9472 split_packages: ["*"],
9473 },
Colin Crossc33e5212021-05-25 18:16:02 -07009474 }
9475
9476 java_library {
9477 name: "mybootclasspathlib",
9478 srcs: ["mybootclasspathlib.java"],
9479 apex_available: ["myapex"],
9480 compile_dex: true,
9481 }
9482
9483 systemserverclasspath_fragment {
9484 name: "mysystemserverclasspathfragment",
9485 contents: ["mysystemserverclasspathlib"],
9486 apex_available: ["myapex"],
9487 }
9488
9489 java_library {
9490 name: "mysystemserverclasspathlib",
9491 srcs: ["mysystemserverclasspathlib.java"],
9492 apex_available: ["myapex"],
9493 compile_dex: true,
9494 }
9495 `
9496
9497 result := android.GroupFixturePreparers(
9498 PrepareForTestWithApexBuildComponents,
9499 prepareForTestWithMyapex,
9500 java.PrepareForTestWithJavaDefaultModules,
9501 android.PrepareForTestWithAndroidBuildComponents,
9502 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009503 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9504 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009505 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009506 ).RunTest(t)
9507
9508 // Make sure jacoco ran on both mylib and mybootclasspathlib
9509 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9510 t.Errorf("Failed to find jacoco rule for mylib")
9511 }
9512 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9513 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9514 }
9515 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9516 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9517 }
9518}
9519
Jiyong Park192600a2021-08-03 07:52:17 +00009520func TestProhibitStaticExecutable(t *testing.T) {
9521 testApexError(t, `executable mybin is static`, `
9522 apex {
9523 name: "myapex",
9524 key: "myapex.key",
9525 binaries: ["mybin"],
9526 min_sdk_version: "29",
9527 }
9528
9529 apex_key {
9530 name: "myapex.key",
9531 public_key: "testkey.avbpubkey",
9532 private_key: "testkey.pem",
9533 }
9534
9535 cc_binary {
9536 name: "mybin",
9537 srcs: ["mylib.cpp"],
9538 relative_install_path: "foo/bar",
9539 static_executable: true,
9540 system_shared_libs: [],
9541 stl: "none",
9542 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009543 min_sdk_version: "29",
9544 }
9545 `)
9546
9547 testApexError(t, `executable mybin.rust is static`, `
9548 apex {
9549 name: "myapex",
9550 key: "myapex.key",
9551 binaries: ["mybin.rust"],
9552 min_sdk_version: "29",
9553 }
9554
9555 apex_key {
9556 name: "myapex.key",
9557 public_key: "testkey.avbpubkey",
9558 private_key: "testkey.pem",
9559 }
9560
9561 rust_binary {
9562 name: "mybin.rust",
9563 srcs: ["foo.rs"],
9564 static_executable: true,
9565 apex_available: ["myapex"],
9566 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009567 }
9568 `)
9569}
9570
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009571func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9572 ctx := testApex(t, `
9573 apex {
9574 name: "myapex",
9575 key: "myapex.key",
9576 updatable: false,
9577 java_libs: ["foo"],
9578 }
9579
9580 apex_key {
9581 name: "myapex.key",
9582 public_key: "testkey.avbpubkey",
9583 private_key: "testkey.pem",
9584 }
9585
9586 java_library {
9587 name: "foo",
9588 srcs: ["foo.java"],
9589 apex_available: ["myapex"],
9590 installable: true,
9591 }
9592 `,
9593 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9594 )
9595
Jooyung Hana0503a52023-08-23 13:12:50 +09009596 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009597 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9598 var builder strings.Builder
9599 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9600 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009601 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 +00009602}
9603
9604func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9605 ctx := testApex(t, `
9606 prebuilt_apex {
9607 name: "myapex",
9608 arch: {
9609 arm64: {
9610 src: "myapex-arm64.apex",
9611 },
9612 arm: {
9613 src: "myapex-arm.apex",
9614 },
9615 },
9616 exported_java_libs: ["foo"],
9617 }
9618
9619 java_import {
9620 name: "foo",
9621 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009622 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009623 }
9624 `,
9625 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9626 )
9627
9628 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9629 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9630 mainModuleEntries := entriesList[0]
9631 android.AssertArrayString(t,
9632 "LOCAL_REQUIRED_MODULES",
9633 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9634 []string{
9635 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9636 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9637 })
9638}
9639
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009640func TestAndroidMk_RequiredModules(t *testing.T) {
9641 ctx := testApex(t, `
9642 apex {
9643 name: "myapex",
9644 key: "myapex.key",
9645 updatable: false,
9646 java_libs: ["foo"],
9647 required: ["otherapex"],
9648 }
9649
9650 apex {
9651 name: "otherapex",
9652 key: "myapex.key",
9653 updatable: false,
9654 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009655 }
9656
9657 apex_key {
9658 name: "myapex.key",
9659 public_key: "testkey.avbpubkey",
9660 private_key: "testkey.pem",
9661 }
9662
9663 java_library {
9664 name: "foo",
9665 srcs: ["foo.java"],
9666 apex_available: ["myapex", "otherapex"],
9667 installable: true,
9668 }
9669 `)
9670
Jooyung Hana0503a52023-08-23 13:12:50 +09009671 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009672 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9673 var builder strings.Builder
9674 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9675 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009676 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009677}
9678
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009679func TestAndroidMk_RequiredDeps(t *testing.T) {
9680 ctx := testApex(t, `
9681 apex {
9682 name: "myapex",
9683 key: "myapex.key",
9684 updatable: false,
9685 }
9686
9687 apex_key {
9688 name: "myapex.key",
9689 public_key: "testkey.avbpubkey",
9690 private_key: "testkey.pem",
9691 }
9692 `)
9693
Jooyung Hana0503a52023-08-23 13:12:50 +09009694 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009695 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009696 data := android.AndroidMkDataForTest(t, ctx, bundle)
9697 var builder strings.Builder
9698 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9699 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009700 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009701}
9702
Jooyung Hana6d36672022-02-24 13:58:07 +09009703func TestApexOutputFileProducer(t *testing.T) {
9704 for _, tc := range []struct {
9705 name string
9706 ref string
9707 expected_data []string
9708 }{
9709 {
9710 name: "test_using_output",
9711 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009712 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009713 },
9714 {
9715 name: "test_using_apex",
9716 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009717 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009718 },
9719 } {
9720 t.Run(tc.name, func(t *testing.T) {
9721 ctx := testApex(t, `
9722 apex {
9723 name: "myapex",
9724 key: "myapex.key",
9725 compressible: true,
9726 updatable: false,
9727 }
9728
9729 apex_key {
9730 name: "myapex.key",
9731 public_key: "testkey.avbpubkey",
9732 private_key: "testkey.pem",
9733 }
9734
9735 java_test {
9736 name: "`+tc.name+`",
9737 srcs: ["a.java"],
9738 data: ["`+tc.ref+`"],
9739 }
9740 `,
9741 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9742 variables.CompressedApex = proptools.BoolPtr(true)
9743 }))
9744 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9745 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9746 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9747 })
9748 }
9749}
9750
satayev758968a2021-12-06 11:42:40 +00009751func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9752 preparer := android.GroupFixturePreparers(
9753 PrepareForTestWithApexBuildComponents,
9754 prepareForTestWithMyapex,
9755 java.PrepareForTestWithJavaSdkLibraryFiles,
9756 java.PrepareForTestWithJavaDefaultModules,
9757 android.PrepareForTestWithAndroidBuildComponents,
9758 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9759 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9760 )
9761
9762 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9763 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9764 preparer.RunTestWithBp(t, `
9765 apex {
9766 name: "myapex",
9767 key: "myapex.key",
9768 bootclasspath_fragments: ["mybootclasspathfragment"],
9769 min_sdk_version: "30",
9770 updatable: false,
9771 }
9772
9773 apex_key {
9774 name: "myapex.key",
9775 public_key: "testkey.avbpubkey",
9776 private_key: "testkey.pem",
9777 }
9778
9779 bootclasspath_fragment {
9780 name: "mybootclasspathfragment",
9781 contents: ["mybootclasspathlib"],
9782 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009783 hidden_api: {
9784 split_packages: ["*"],
9785 },
satayev758968a2021-12-06 11:42:40 +00009786 }
9787
9788 java_sdk_library {
9789 name: "mybootclasspathlib",
9790 srcs: ["mybootclasspathlib.java"],
9791 apex_available: ["myapex"],
9792 compile_dex: true,
9793 unsafe_ignore_missing_latest_api: true,
9794 min_sdk_version: "31",
9795 static_libs: ["util"],
9796 }
9797
9798 java_library {
9799 name: "util",
9800 srcs: ["a.java"],
9801 apex_available: ["myapex"],
9802 min_sdk_version: "31",
9803 static_libs: ["another_util"],
9804 }
9805
9806 java_library {
9807 name: "another_util",
9808 srcs: ["a.java"],
9809 min_sdk_version: "31",
9810 apex_available: ["myapex"],
9811 }
9812 `)
9813 })
9814
9815 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9816 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9817 preparer.RunTestWithBp(t, `
9818 apex {
9819 name: "myapex",
9820 key: "myapex.key",
9821 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9822 min_sdk_version: "30",
9823 updatable: false,
9824 }
9825
9826 apex_key {
9827 name: "myapex.key",
9828 public_key: "testkey.avbpubkey",
9829 private_key: "testkey.pem",
9830 }
9831
9832 systemserverclasspath_fragment {
9833 name: "mysystemserverclasspathfragment",
9834 contents: ["mysystemserverclasspathlib"],
9835 apex_available: ["myapex"],
9836 }
9837
9838 java_sdk_library {
9839 name: "mysystemserverclasspathlib",
9840 srcs: ["mysystemserverclasspathlib.java"],
9841 apex_available: ["myapex"],
9842 compile_dex: true,
9843 min_sdk_version: "32",
9844 unsafe_ignore_missing_latest_api: true,
9845 static_libs: ["util"],
9846 }
9847
9848 java_library {
9849 name: "util",
9850 srcs: ["a.java"],
9851 apex_available: ["myapex"],
9852 min_sdk_version: "31",
9853 static_libs: ["another_util"],
9854 }
9855
9856 java_library {
9857 name: "another_util",
9858 srcs: ["a.java"],
9859 min_sdk_version: "31",
9860 apex_available: ["myapex"],
9861 }
9862 `)
9863 })
9864
9865 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9866 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9867 RunTestWithBp(t, `
9868 apex {
9869 name: "myapex",
9870 key: "myapex.key",
9871 bootclasspath_fragments: ["mybootclasspathfragment"],
9872 min_sdk_version: "30",
9873 updatable: false,
9874 }
9875
9876 apex_key {
9877 name: "myapex.key",
9878 public_key: "testkey.avbpubkey",
9879 private_key: "testkey.pem",
9880 }
9881
9882 bootclasspath_fragment {
9883 name: "mybootclasspathfragment",
9884 contents: ["mybootclasspathlib"],
9885 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009886 hidden_api: {
9887 split_packages: ["*"],
9888 },
satayev758968a2021-12-06 11:42:40 +00009889 }
9890
9891 java_sdk_library {
9892 name: "mybootclasspathlib",
9893 srcs: ["mybootclasspathlib.java"],
9894 apex_available: ["myapex"],
9895 compile_dex: true,
9896 unsafe_ignore_missing_latest_api: true,
9897 }
9898 `)
9899 })
9900
9901 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9902 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9903 RunTestWithBp(t, `
9904 apex {
9905 name: "myapex",
9906 key: "myapex.key",
9907 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9908 min_sdk_version: "30",
9909 updatable: false,
9910 }
9911
9912 apex_key {
9913 name: "myapex.key",
9914 public_key: "testkey.avbpubkey",
9915 private_key: "testkey.pem",
9916 }
9917
9918 systemserverclasspath_fragment {
9919 name: "mysystemserverclasspathfragment",
9920 contents: ["mysystemserverclasspathlib"],
9921 apex_available: ["myapex"],
9922 }
9923
9924 java_sdk_library {
9925 name: "mysystemserverclasspathlib",
9926 srcs: ["mysystemserverclasspathlib.java"],
9927 apex_available: ["myapex"],
9928 compile_dex: true,
9929 unsafe_ignore_missing_latest_api: true,
9930 }
9931 `)
9932 })
9933}
9934
Jiakai Zhang6decef92022-01-12 17:56:19 +00009935// Verifies that the APEX depends on all the Make modules in the list.
9936func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9937 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9938 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009939 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009940 }
9941}
9942
9943// Verifies that the APEX does not depend on any of the Make modules in the list.
9944func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9945 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9946 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009947 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009948 }
9949}
9950
Cole Faust1021ccd2023-02-26 21:15:25 -08009951// TODO(b/193460475): Re-enable this test
9952//func TestApexStrictUpdtabilityLint(t *testing.T) {
9953// bpTemplate := `
9954// apex {
9955// name: "myapex",
9956// key: "myapex.key",
9957// java_libs: ["myjavalib"],
9958// updatable: %v,
9959// min_sdk_version: "29",
9960// }
9961// apex_key {
9962// name: "myapex.key",
9963// }
9964// java_library {
9965// name: "myjavalib",
9966// srcs: ["MyClass.java"],
9967// apex_available: [ "myapex" ],
9968// lint: {
9969// strict_updatability_linting: %v,
9970// },
9971// sdk_version: "current",
9972// min_sdk_version: "29",
9973// }
9974// `
9975// fs := android.MockFS{
9976// "lint-baseline.xml": nil,
9977// }
9978//
9979// testCases := []struct {
9980// testCaseName string
9981// apexUpdatable bool
9982// javaStrictUpdtabilityLint bool
9983// lintFileExists bool
9984// disallowedFlagExpected bool
9985// }{
9986// {
9987// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9988// apexUpdatable: true,
9989// javaStrictUpdtabilityLint: true,
9990// lintFileExists: false,
9991// disallowedFlagExpected: false,
9992// },
9993// {
9994// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9995// apexUpdatable: false,
9996// javaStrictUpdtabilityLint: false,
9997// lintFileExists: true,
9998// disallowedFlagExpected: false,
9999// },
10000// {
10001// testCaseName: "non-updatable apex respects strict updatability of javalib",
10002// apexUpdatable: false,
10003// javaStrictUpdtabilityLint: true,
10004// lintFileExists: true,
10005// disallowedFlagExpected: true,
10006// },
10007// {
10008// testCaseName: "updatable apex sets strict updatability of javalib to true",
10009// apexUpdatable: true,
10010// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10011// lintFileExists: true,
10012// disallowedFlagExpected: true,
10013// },
10014// }
10015//
10016// for _, testCase := range testCases {
10017// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10018// fixtures := []android.FixturePreparer{}
10019// if testCase.lintFileExists {
10020// fixtures = append(fixtures, fs.AddToFixture())
10021// }
10022//
10023// result := testApex(t, bp, fixtures...)
10024// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10025// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10026// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10027//
10028// if disallowedFlagActual != testCase.disallowedFlagExpected {
10029// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10030// }
10031// }
10032//}
10033//
10034//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10035// bp := `
10036// apex {
10037// name: "myapex",
10038// key: "myapex.key",
10039// java_libs: ["myjavalib"],
10040// updatable: true,
10041// min_sdk_version: "29",
10042// }
10043// apex_key {
10044// name: "myapex.key",
10045// }
10046// java_library {
10047// name: "myjavalib",
10048// srcs: ["MyClass.java"],
10049// apex_available: [ "myapex" ],
10050// sdk_version: "current",
10051// min_sdk_version: "29",
10052// }
10053// `
10054//
10055// testCases := []struct {
10056// testCaseName string
10057// moduleDirectory string
10058// disallowedFlagExpected bool
10059// }{
10060// {
10061// testCaseName: "lintable module defined outside libcore",
10062// moduleDirectory: "",
10063// disallowedFlagExpected: true,
10064// },
10065// {
10066// testCaseName: "lintable module defined in libcore root directory",
10067// moduleDirectory: "libcore/",
10068// disallowedFlagExpected: false,
10069// },
10070// {
10071// testCaseName: "lintable module defined in libcore child directory",
10072// moduleDirectory: "libcore/childdir/",
10073// disallowedFlagExpected: true,
10074// },
10075// }
10076//
10077// for _, testCase := range testCases {
10078// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10079// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10080// result := testApex(t, "", lintFileCreator, bpFileCreator)
10081// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10082// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10083// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10084// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10085//
10086// if disallowedFlagActual != testCase.disallowedFlagExpected {
10087// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10088// }
10089// }
10090//}
10091//
10092//// checks transtive deps of an apex coming from bootclasspath_fragment
10093//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10094// bp := `
10095// apex {
10096// name: "myapex",
10097// key: "myapex.key",
10098// bootclasspath_fragments: ["mybootclasspathfragment"],
10099// updatable: true,
10100// min_sdk_version: "29",
10101// }
10102// apex_key {
10103// name: "myapex.key",
10104// }
10105// bootclasspath_fragment {
10106// name: "mybootclasspathfragment",
10107// contents: ["myjavalib"],
10108// apex_available: ["myapex"],
10109// hidden_api: {
10110// split_packages: ["*"],
10111// },
10112// }
10113// java_library {
10114// name: "myjavalib",
10115// srcs: ["MyClass.java"],
10116// apex_available: [ "myapex" ],
10117// sdk_version: "current",
10118// min_sdk_version: "29",
10119// compile_dex: true,
10120// }
10121// `
10122// fs := android.MockFS{
10123// "lint-baseline.xml": nil,
10124// }
10125//
10126// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10127// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10128// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10129// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10130// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10131// }
10132//}
Spandan Das66773252022-01-15 00:23:18 +000010133
Spandan Das42e89502022-05-06 22:12:55 +000010134// updatable apexes should propagate updatable=true to its apps
10135func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10136 bp := `
10137 apex {
10138 name: "myapex",
10139 key: "myapex.key",
10140 updatable: %v,
10141 apps: [
10142 "myapp",
10143 ],
10144 min_sdk_version: "30",
10145 }
10146 apex_key {
10147 name: "myapex.key",
10148 }
10149 android_app {
10150 name: "myapp",
10151 updatable: %v,
10152 apex_available: [
10153 "myapex",
10154 ],
10155 sdk_version: "current",
10156 min_sdk_version: "30",
10157 }
10158 `
10159 testCases := []struct {
10160 name string
10161 apex_is_updatable_bp bool
10162 app_is_updatable_bp bool
10163 app_is_updatable_expected bool
10164 }{
10165 {
10166 name: "Non-updatable apex respects updatable property of non-updatable app",
10167 apex_is_updatable_bp: false,
10168 app_is_updatable_bp: false,
10169 app_is_updatable_expected: false,
10170 },
10171 {
10172 name: "Non-updatable apex respects updatable property of updatable app",
10173 apex_is_updatable_bp: false,
10174 app_is_updatable_bp: true,
10175 app_is_updatable_expected: true,
10176 },
10177 {
10178 name: "Updatable apex respects updatable property of updatable app",
10179 apex_is_updatable_bp: true,
10180 app_is_updatable_bp: true,
10181 app_is_updatable_expected: true,
10182 },
10183 {
10184 name: "Updatable apex sets updatable=true on non-updatable app",
10185 apex_is_updatable_bp: true,
10186 app_is_updatable_bp: false,
10187 app_is_updatable_expected: true,
10188 },
10189 }
10190 for _, testCase := range testCases {
10191 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10192 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10193 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10194 }
10195}
10196
Kiyoung Kim487689e2022-07-26 09:48:22 +090010197func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10198 bp := `
10199 apex {
10200 name: "myapex",
10201 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010202 native_shared_libs: ["libbaz"],
10203 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010204 min_sdk_version: "29",
10205 }
10206 apex_key {
10207 name: "myapex.key",
10208 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010209 cc_binary {
10210 name: "binfoo",
10211 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010212 apex_available: ["myapex"],
10213 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010214 recovery_available: false,
10215 }
10216 cc_library {
10217 name: "libbar",
10218 srcs: ["libbar.cc"],
10219 stubs: {
10220 symbol_file: "libbar.map.txt",
10221 versions: [
10222 "29",
10223 ],
10224 },
10225 }
10226 cc_library {
10227 name: "libbaz",
10228 srcs: ["libbaz.cc"],
10229 apex_available: ["myapex"],
10230 min_sdk_version: "29",
10231 stubs: {
10232 symbol_file: "libbaz.map.txt",
10233 versions: [
10234 "29",
10235 ],
10236 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010237 }
10238 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010239 name: "libbar",
10240 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010241 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010242 variants: ["apex.29"],
10243 }
10244 cc_api_variant {
10245 name: "libbar",
10246 variant: "apex",
10247 version: "29",
10248 src: "libbar_apex_29.so",
10249 }
10250 cc_api_library {
10251 name: "libbaz",
10252 src: "libbaz_stub.so",
10253 min_sdk_version: "29",
10254 variants: ["apex.29"],
10255 }
10256 cc_api_variant {
10257 name: "libbaz",
10258 variant: "apex",
10259 version: "29",
10260 src: "libbaz_apex_29.so",
10261 }
10262 cc_api_library {
10263 name: "libqux",
10264 src: "libqux_stub.so",
10265 min_sdk_version: "29",
10266 variants: ["apex.29"],
10267 }
10268 cc_api_variant {
10269 name: "libqux",
10270 variant: "apex",
10271 version: "29",
10272 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010273 }
10274 api_imports {
10275 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010276 apex_shared_libs: [
10277 "libbar",
10278 "libbaz",
10279 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010280 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010281 }
10282 `
10283 result := testApex(t, bp)
10284
10285 hasDep := func(m android.Module, wantDep android.Module) bool {
10286 t.Helper()
10287 var found bool
10288 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10289 if dep == wantDep {
10290 found = true
10291 }
10292 })
10293 return found
10294 }
10295
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010296 // Library defines stubs and cc_api_library should be used with cc_api_library
10297 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10298 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10299 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010300
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010301 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10302 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010303
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010304 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10305 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10306 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10307 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10308
10309 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10310 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10311 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10312 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10313 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10314
10315 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10316 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10317 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10318
10319 // cc_api_library defined without original library should be linked with cc_api_library
10320 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10321 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10322 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10323}
10324
10325func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10326 bp := `
10327 apex {
10328 name: "myapex",
10329 key: "myapex.key",
10330 native_shared_libs: ["libbar"],
10331 min_sdk_version: "29",
10332 }
10333 apex_key {
10334 name: "myapex.key",
10335 }
10336 cc_binary {
10337 name: "binfoo",
10338 shared_libs: ["libbar"],
10339 recovery_available: false,
10340 }
10341 cc_library {
10342 name: "libbar",
10343 srcs: ["libbar.cc"],
10344 apex_available: ["myapex"],
10345 min_sdk_version: "29",
10346 stubs: {
10347 symbol_file: "libbar.map.txt",
10348 versions: [
10349 "29",
10350 ],
10351 },
10352 }
10353 cc_api_library {
10354 name: "libbar",
10355 src: "libbar_stub.so",
10356 variants: ["apex.29"],
10357 }
10358 cc_api_variant {
10359 name: "libbar",
10360 variant: "apex",
10361 version: "29",
10362 src: "libbar_apex_29.so",
10363 }
10364 api_imports {
10365 name: "api_imports",
10366 apex_shared_libs: [
10367 "libbar",
10368 ],
10369 }
10370 `
10371
10372 result := testApex(t, bp)
10373
10374 hasDep := func(m android.Module, wantDep android.Module) bool {
10375 t.Helper()
10376 var found bool
10377 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10378 if dep == wantDep {
10379 found = true
10380 }
10381 })
10382 return found
10383 }
10384
10385 // Library defines stubs and cc_api_library should be used with cc_api_library
10386 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10387 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10388 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10389
10390 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10391 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10392
10393 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10394 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10395 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10396 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010397}
Dennis Shend4f5d932023-01-31 20:27:21 +000010398
10399func TestTrimmedApex(t *testing.T) {
10400 bp := `
10401 apex {
10402 name: "myapex",
10403 key: "myapex.key",
10404 native_shared_libs: ["libfoo","libbaz"],
10405 min_sdk_version: "29",
10406 trim_against: "mydcla",
10407 }
10408 apex {
10409 name: "mydcla",
10410 key: "myapex.key",
10411 native_shared_libs: ["libfoo","libbar"],
10412 min_sdk_version: "29",
10413 file_contexts: ":myapex-file_contexts",
10414 dynamic_common_lib_apex: true,
10415 }
10416 apex_key {
10417 name: "myapex.key",
10418 }
10419 cc_library {
10420 name: "libfoo",
10421 shared_libs: ["libc"],
10422 apex_available: ["myapex","mydcla"],
10423 min_sdk_version: "29",
10424 }
10425 cc_library {
10426 name: "libbar",
10427 shared_libs: ["libc"],
10428 apex_available: ["myapex","mydcla"],
10429 min_sdk_version: "29",
10430 }
10431 cc_library {
10432 name: "libbaz",
10433 shared_libs: ["libc"],
10434 apex_available: ["myapex","mydcla"],
10435 min_sdk_version: "29",
10436 }
10437 cc_api_library {
10438 name: "libc",
10439 src: "libc.so",
10440 min_sdk_version: "29",
10441 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010442 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010443 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010444 }
10445 api_imports {
10446 name: "api_imports",
10447 shared_libs: [
10448 "libc",
10449 ],
10450 header_libs: [],
10451 }
10452 `
10453 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010454 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010455 apexRule := module.MaybeRule("apexRule")
10456 if apexRule.Rule == nil {
10457 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10458 }
10459
10460 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010461 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010462 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10463 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10464 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10465 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10466}
Jingwen Chendea7a642023-03-28 11:30:50 +000010467
10468func TestCannedFsConfig(t *testing.T) {
10469 ctx := testApex(t, `
10470 apex {
10471 name: "myapex",
10472 key: "myapex.key",
10473 updatable: false,
10474 }
10475
10476 apex_key {
10477 name: "myapex.key",
10478 public_key: "testkey.avbpubkey",
10479 private_key: "testkey.pem",
10480 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010481 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010482 generateFsRule := mod.Rule("generateFsConfig")
10483 cmd := generateFsRule.RuleParams.Command
10484
10485 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10486}
10487
10488func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10489 ctx := testApex(t, `
10490 apex {
10491 name: "myapex",
10492 key: "myapex.key",
10493 canned_fs_config: "my_config",
10494 updatable: false,
10495 }
10496
10497 apex_key {
10498 name: "myapex.key",
10499 public_key: "testkey.avbpubkey",
10500 private_key: "testkey.pem",
10501 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010502 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010503 generateFsRule := mod.Rule("generateFsConfig")
10504 cmd := generateFsRule.RuleParams.Command
10505
10506 // Ensure that canned_fs_config has "cat my_config" at the end
10507 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10508}
Spandan Das20fce2d2023-04-12 17:21:39 +000010509
10510func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10511 testCases := []struct {
10512 desc string
10513 hasStubs bool
10514 apexAvailable string
10515 expectedError string
10516 }{
10517 {
10518 desc: "non-stub library can have multiple apex_available",
10519 hasStubs: false,
10520 apexAvailable: `["myapex", "otherapex"]`,
10521 },
10522 {
10523 desc: "stub library should not be available to anyapex",
10524 hasStubs: true,
10525 apexAvailable: `["//apex_available:anyapex"]`,
10526 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10527 },
10528 {
10529 desc: "stub library should not be available to multiple apexes",
10530 hasStubs: true,
10531 apexAvailable: `["myapex", "otherapex"]`,
10532 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10533 },
10534 {
10535 desc: "stub library can be available to a core apex and a test apex",
10536 hasStubs: true,
10537 apexAvailable: `["myapex", "test_myapex"]`,
10538 },
10539 }
10540 bpTemplate := `
10541 cc_library {
10542 name: "libfoo",
10543 %v
10544 apex_available: %v,
10545 }
10546 apex {
10547 name: "myapex",
10548 key: "apex.key",
10549 updatable: false,
10550 native_shared_libs: ["libfoo"],
10551 }
10552 apex {
10553 name: "otherapex",
10554 key: "apex.key",
10555 updatable: false,
10556 }
10557 apex_test {
10558 name: "test_myapex",
10559 key: "apex.key",
10560 updatable: false,
10561 native_shared_libs: ["libfoo"],
10562 }
10563 apex_key {
10564 name: "apex.key",
10565 }
10566 `
10567 for _, tc := range testCases {
10568 stubs := ""
10569 if tc.hasStubs {
10570 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10571 }
10572 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10573 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10574 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10575 })
10576 if tc.expectedError == "" {
10577 testApex(t, bp, mockFsFixturePreparer)
10578 } else {
10579 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10580 }
10581 }
10582}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010583
10584func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10585 context := android.GroupFixturePreparers(
10586 android.PrepareForIntegrationTestWithAndroid,
10587 cc.PrepareForIntegrationTestWithCc,
10588 PrepareForTestWithApexBuildComponents,
10589 prepareForTestWithMyapex,
10590 filesystem.PrepareForTestWithFilesystemBuildComponents,
10591 )
10592 result := context.RunTestWithBp(t, `
10593 android_system_image {
10594 name: "myfilesystem",
10595 deps: [
10596 "libfoo",
10597 ],
10598 linker_config_src: "linker.config.json",
10599 }
10600
10601 cc_library {
10602 name: "libfoo",
10603 shared_libs: [
10604 "libbar",
10605 ],
10606 stl: "none",
10607 }
10608
10609 cc_library {
10610 name: "libbar",
10611 stl: "none",
10612 apex_available: ["myapex"],
10613 }
10614
10615 apex {
10616 name: "myapex",
10617 native_shared_libs: ["libbar"],
10618 key: "myapex.key",
10619 updatable: false,
10620 }
10621
10622 apex_key {
10623 name: "myapex.key",
10624 public_key: "testkey.avbpubkey",
10625 private_key: "testkey.pem",
10626 }
10627 `)
10628
Cole Faust3b806d32024-03-11 15:15:03 -070010629 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010630 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10631 inputs.Strings(),
10632 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10633}
Yu Liueae7b362023-11-16 17:05:47 -080010634
10635var apex_default_bp = `
10636 apex_key {
10637 name: "myapex.key",
10638 public_key: "testkey.avbpubkey",
10639 private_key: "testkey.pem",
10640 }
10641
10642 filegroup {
10643 name: "myapex.manifest",
10644 srcs: ["apex_manifest.json"],
10645 }
10646
10647 filegroup {
10648 name: "myapex.androidmanifest",
10649 srcs: ["AndroidManifest.xml"],
10650 }
10651`
10652
10653func TestAconfigFilesJavaDeps(t *testing.T) {
10654 ctx := testApex(t, apex_default_bp+`
10655 apex {
10656 name: "myapex",
10657 manifest: ":myapex.manifest",
10658 androidManifest: ":myapex.androidmanifest",
10659 key: "myapex.key",
10660 java_libs: [
10661 "my_java_library_foo",
10662 "my_java_library_bar",
10663 ],
10664 updatable: false,
10665 }
10666
10667 java_library {
10668 name: "my_java_library_foo",
10669 srcs: ["foo/bar/MyClass.java"],
10670 sdk_version: "none",
10671 system_modules: "none",
10672 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010673 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010674 "myapex",
10675 ],
10676 }
10677
10678 java_library {
10679 name: "my_java_library_bar",
10680 srcs: ["foo/bar/MyClass.java"],
10681 sdk_version: "none",
10682 system_modules: "none",
10683 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010684 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010685 "myapex",
10686 ],
10687 }
10688
10689 aconfig_declarations {
10690 name: "my_aconfig_declarations_foo",
10691 package: "com.example.package",
10692 container: "myapex",
10693 srcs: ["foo.aconfig"],
10694 }
10695
10696 java_aconfig_library {
10697 name: "my_java_aconfig_library_foo",
10698 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010699 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010700 "myapex",
10701 ],
10702 }
10703
10704 aconfig_declarations {
10705 name: "my_aconfig_declarations_bar",
10706 package: "com.example.package",
10707 container: "myapex",
10708 srcs: ["bar.aconfig"],
10709 }
10710
10711 java_aconfig_library {
10712 name: "my_java_aconfig_library_bar",
10713 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010714 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010715 "myapex",
10716 ],
10717 }
10718 `)
10719
10720 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10721 s := mod.Rule("apexRule").Args["copy_commands"]
10722 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010723 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010724 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10725 }
10726
Yu Liuab31c822024-02-28 22:21:31 +000010727 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10728 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10729 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10730 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010731
Yu Liubba555e2024-02-17 00:36:42 +000010732 inputs := []string{
10733 "my_aconfig_declarations_foo/intermediate.pb",
10734 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010735 }
Yu Liubba555e2024-02-17 00:36:42 +000010736 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10737 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10738 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10739 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010740}
10741
10742func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10743 ctx := testApex(t, apex_default_bp+`
10744 apex {
10745 name: "myapex",
10746 manifest: ":myapex.manifest",
10747 androidManifest: ":myapex.androidmanifest",
10748 key: "myapex.key",
10749 java_libs: [
10750 "my_java_library_foo",
10751 ],
10752 native_shared_libs: [
10753 "my_cc_library_bar",
10754 ],
10755 binaries: [
10756 "my_cc_binary_baz",
10757 ],
10758 updatable: false,
10759 }
10760
10761 java_library {
10762 name: "my_java_library_foo",
10763 srcs: ["foo/bar/MyClass.java"],
10764 sdk_version: "none",
10765 system_modules: "none",
10766 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010767 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010768 "myapex",
10769 ],
10770 }
10771
10772 cc_library {
10773 name: "my_cc_library_bar",
10774 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010775 static_libs: [
10776 "my_cc_aconfig_library_bar",
10777 "my_cc_aconfig_library_baz",
10778 ],
Yu Liueae7b362023-11-16 17:05:47 -080010779 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010780 "myapex",
10781 ],
10782 }
10783
10784 cc_binary {
10785 name: "my_cc_binary_baz",
10786 srcs: ["foo/bar/MyClass.cc"],
10787 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010788 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010789 "myapex",
10790 ],
10791 }
10792
10793 aconfig_declarations {
10794 name: "my_aconfig_declarations_foo",
10795 package: "com.example.package",
10796 container: "myapex",
10797 srcs: ["foo.aconfig"],
10798 }
10799
10800 java_aconfig_library {
10801 name: "my_java_aconfig_library_foo",
10802 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010803 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010804 "myapex",
10805 ],
10806 }
10807
10808 aconfig_declarations {
10809 name: "my_aconfig_declarations_bar",
10810 package: "com.example.package",
10811 container: "myapex",
10812 srcs: ["bar.aconfig"],
10813 }
10814
10815 cc_aconfig_library {
10816 name: "my_cc_aconfig_library_bar",
10817 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010818 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010819 "myapex",
10820 ],
10821 }
10822
10823 aconfig_declarations {
10824 name: "my_aconfig_declarations_baz",
10825 package: "com.example.package",
10826 container: "myapex",
10827 srcs: ["baz.aconfig"],
10828 }
10829
10830 cc_aconfig_library {
10831 name: "my_cc_aconfig_library_baz",
10832 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010833 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010834 "myapex",
10835 ],
10836 }
10837
10838 cc_library {
10839 name: "server_configurable_flags",
10840 srcs: ["server_configurable_flags.cc"],
10841 }
10842 `)
10843
10844 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10845 s := mod.Rule("apexRule").Args["copy_commands"]
10846 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010847 if len(copyCmds) != 12 {
10848 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010849 }
10850
Yu Liuab31c822024-02-28 22:21:31 +000010851 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10852 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
10853 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
10854 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010855
Yu Liubba555e2024-02-17 00:36:42 +000010856 inputs := []string{
10857 "my_aconfig_declarations_foo/intermediate.pb",
10858 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10859 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010860 }
Yu Liubba555e2024-02-17 00:36:42 +000010861 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10862 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10863 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10864 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010865}
10866
Yu Liucec0e412023-11-30 16:45:50 -080010867func TestAconfigFilesRustDeps(t *testing.T) {
10868 ctx := testApex(t, apex_default_bp+`
10869 apex {
10870 name: "myapex",
10871 manifest: ":myapex.manifest",
10872 androidManifest: ":myapex.androidmanifest",
10873 key: "myapex.key",
10874 native_shared_libs: [
10875 "libmy_rust_library",
10876 ],
10877 binaries: [
10878 "my_rust_binary",
10879 ],
10880 rust_dyn_libs: [
10881 "libmy_rust_dylib",
10882 ],
10883 updatable: false,
10884 }
10885
10886 rust_library {
10887 name: "libflags_rust", // test mock
10888 crate_name: "flags_rust",
10889 srcs: ["lib.rs"],
10890 apex_available: [
10891 "myapex",
10892 ],
10893 }
10894
10895 rust_library {
10896 name: "liblazy_static", // test mock
10897 crate_name: "lazy_static",
10898 srcs: ["src/lib.rs"],
10899 apex_available: [
10900 "myapex",
10901 ],
10902 }
10903
Ted Bauer02d475c2024-03-27 20:56:26 +000010904 rust_library {
10905 name: "libaconfig_storage_read_api", // test mock
10906 crate_name: "aconfig_storage_read_api",
10907 srcs: ["src/lib.rs"],
10908 apex_available: [
10909 "myapex",
10910 ],
10911 }
10912
Yu Liucec0e412023-11-30 16:45:50 -080010913 rust_ffi_shared {
10914 name: "libmy_rust_library",
10915 srcs: ["src/lib.rs"],
10916 rustlibs: ["libmy_rust_aconfig_library_foo"],
10917 crate_name: "my_rust_library",
10918 apex_available: [
10919 "myapex",
10920 ],
10921 }
10922
10923 rust_library_dylib {
10924 name: "libmy_rust_dylib",
10925 srcs: ["foo/bar/MyClass.rs"],
10926 rustlibs: ["libmy_rust_aconfig_library_bar"],
10927 crate_name: "my_rust_dylib",
10928 apex_available: [
10929 "myapex",
10930 ],
10931 }
10932
10933 rust_binary {
10934 name: "my_rust_binary",
10935 srcs: ["foo/bar/MyClass.rs"],
10936 rustlibs: [
10937 "libmy_rust_aconfig_library_baz",
10938 "libmy_rust_dylib",
10939 ],
10940 apex_available: [
10941 "myapex",
10942 ],
10943 }
10944
10945 aconfig_declarations {
10946 name: "my_aconfig_declarations_foo",
10947 package: "com.example.package",
10948 container: "myapex",
10949 srcs: ["foo.aconfig"],
10950 }
10951
10952 aconfig_declarations {
10953 name: "my_aconfig_declarations_bar",
10954 package: "com.example.package",
10955 container: "myapex",
10956 srcs: ["bar.aconfig"],
10957 }
10958
10959 aconfig_declarations {
10960 name: "my_aconfig_declarations_baz",
10961 package: "com.example.package",
10962 container: "myapex",
10963 srcs: ["baz.aconfig"],
10964 }
10965
10966 rust_aconfig_library {
10967 name: "libmy_rust_aconfig_library_foo",
10968 aconfig_declarations: "my_aconfig_declarations_foo",
10969 crate_name: "my_rust_aconfig_library_foo",
10970 apex_available: [
10971 "myapex",
10972 ],
10973 }
10974
10975 rust_aconfig_library {
10976 name: "libmy_rust_aconfig_library_bar",
10977 aconfig_declarations: "my_aconfig_declarations_bar",
10978 crate_name: "my_rust_aconfig_library_bar",
10979 apex_available: [
10980 "myapex",
10981 ],
10982 }
10983
10984 rust_aconfig_library {
10985 name: "libmy_rust_aconfig_library_baz",
10986 aconfig_declarations: "my_aconfig_declarations_baz",
10987 crate_name: "my_rust_aconfig_library_baz",
10988 apex_available: [
10989 "myapex",
10990 ],
10991 }
10992 `)
10993
10994 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10995 s := mod.Rule("apexRule").Args["copy_commands"]
10996 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer02d475c2024-03-27 20:56:26 +000010997 if len(copyCmds) != 28 {
10998 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010999 }
11000
Ted Bauer02d475c2024-03-27 20:56:26 +000011001 ensureMatches(t, copyCmds[24], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11002 ensureMatches(t, copyCmds[25], "^cp -f .*/package.map .*/image.apex/etc$")
11003 ensureMatches(t, copyCmds[26], "^cp -f .*/flag.map .*/image.apex/etc$")
11004 ensureMatches(t, copyCmds[27], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011005
Yu Liubba555e2024-02-17 00:36:42 +000011006 inputs := []string{
11007 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011008 "my_aconfig_declarations_bar/intermediate.pb",
11009 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011010 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11011 }
11012 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11013 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11014 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11015 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11016}
11017
11018func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11019 aconfigRule := mod.Description(desc)
11020 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011021 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011022 if len(aconfigArgs) != len(inputs) {
11023 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011024 }
Yu Liucec0e412023-11-30 16:45:50 -080011025
Yu Liubba555e2024-02-17 00:36:42 +000011026 ensureEquals(t, container, aconfigRule.Args["container"])
11027 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11028
11029 buildParams := aconfigRule.BuildParams
11030 for _, input := range inputs {
11031 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11032 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011033 }
Yu Liubba555e2024-02-17 00:36:42 +000011034
11035 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011036}
11037
Yu Liueae7b362023-11-16 17:05:47 -080011038func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11039 ctx := testApex(t, apex_default_bp+`
11040 apex {
11041 name: "myapex",
11042 manifest: ":myapex.manifest",
11043 androidManifest: ":myapex.androidmanifest",
11044 key: "myapex.key",
11045 java_libs: [
11046 "my_java_library_foo",
11047 "other_java_library_bar",
11048 ],
11049 updatable: false,
11050 }
11051
11052 java_library {
11053 name: "my_java_library_foo",
11054 srcs: ["foo/bar/MyClass.java"],
11055 sdk_version: "none",
11056 system_modules: "none",
11057 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011058 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011059 "myapex",
11060 ],
11061 }
11062
11063 java_library {
11064 name: "other_java_library_bar",
11065 srcs: ["foo/bar/MyClass.java"],
11066 sdk_version: "none",
11067 system_modules: "none",
11068 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011069 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011070 "myapex",
11071 ],
11072 }
11073
11074 aconfig_declarations {
11075 name: "my_aconfig_declarations_foo",
11076 package: "com.example.package",
11077 container: "myapex",
11078 srcs: ["foo.aconfig"],
11079 }
11080
11081 java_aconfig_library {
11082 name: "my_java_aconfig_library_foo",
11083 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011084 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011085 "myapex",
11086 ],
11087 }
11088
11089 aconfig_declarations {
11090 name: "other_aconfig_declarations_bar",
11091 package: "com.example.package",
11092 container: "otherapex",
11093 srcs: ["bar.aconfig"],
11094 }
11095
11096 java_aconfig_library {
11097 name: "other_java_aconfig_library_bar",
11098 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011099 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011100 "myapex",
11101 ],
11102 }
11103 `)
11104
11105 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11106 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11107 s := " " + combineAconfigRule.Args["cache_files"]
11108 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11109 if len(aconfigArgs) != 1 {
11110 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11111 }
11112 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11113
11114 buildParams := combineAconfigRule.BuildParams
11115 if len(buildParams.Inputs) != 1 {
11116 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11117 }
11118 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11119 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11120}
11121
11122func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11123 ctx := testApex(t, apex_default_bp+`
11124 apex {
11125 name: "myapex",
11126 manifest: ":myapex.manifest",
11127 androidManifest: ":myapex.androidmanifest",
11128 key: "myapex.key",
11129 java_libs: [
11130 "my_java_library_foo",
11131 "my_java_library_bar",
11132 ],
11133 updatable: false,
11134 }
11135
11136 java_library {
11137 name: "my_java_library_foo",
11138 srcs: ["foo/bar/MyClass.java"],
11139 sdk_version: "none",
11140 system_modules: "none",
11141 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011142 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011143 "myapex",
11144 ],
11145 }
11146
11147 java_library {
11148 name: "my_java_library_bar",
11149 srcs: ["foo/bar/MyClass.java"],
11150 sdk_version: "none",
11151 system_modules: "none",
11152 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011153 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011154 "myapex",
11155 ],
11156 }
11157
11158 aconfig_declarations {
11159 name: "my_aconfig_declarations_foo",
11160 package: "com.example.package",
11161 container: "myapex",
11162 srcs: ["foo.aconfig"],
11163 }
11164
11165 java_aconfig_library {
11166 name: "my_java_aconfig_library_foo",
11167 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011168 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011169 "myapex",
11170 ],
11171 }
11172
11173 java_aconfig_library {
11174 name: "my_java_aconfig_library_bar",
11175 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011176 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011177 "myapex",
11178 ],
11179 }
11180 `)
11181
11182 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11183 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11184 s := " " + combineAconfigRule.Args["cache_files"]
11185 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11186 if len(aconfigArgs) != 1 {
11187 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11188 }
11189 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11190
11191 buildParams := combineAconfigRule.BuildParams
11192 if len(buildParams.Inputs) != 1 {
11193 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11194 }
11195 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11196 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11197}
Spandan Das5be63332023-12-13 00:06:32 +000011198
11199// Test that the boot jars come from the _selected_ apex prebuilt
11200// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11201func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11202 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11203 t.Helper()
11204 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11205 foundLibfooJar := false
11206 base := stem + ".jar"
11207 for _, output := range s.AllOutputs() {
11208 if filepath.Base(output) == base {
11209 foundLibfooJar = true
11210 buildRule := s.Output(output)
11211 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11212 }
11213 }
11214 if !foundLibfooJar {
11215 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11216 }
11217 }
11218
Spandan Das64c9e0c2023-12-20 20:13:34 +000011219 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11220 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11221 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11222 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11223 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11224 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)
11225 }
11226
11227 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11228 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11229 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11230 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11231 }
11232
Spandan Das5be63332023-12-13 00:06:32 +000011233 bp := `
11234 // Source APEX.
11235
11236 java_library {
11237 name: "framework-foo",
11238 srcs: ["foo.java"],
11239 installable: true,
11240 apex_available: [
11241 "com.android.foo",
11242 ],
11243 }
11244
11245 bootclasspath_fragment {
11246 name: "foo-bootclasspath-fragment",
11247 contents: ["framework-foo"],
11248 apex_available: [
11249 "com.android.foo",
11250 ],
11251 hidden_api: {
11252 split_packages: ["*"],
11253 },
11254 }
11255
11256 apex_key {
11257 name: "com.android.foo.key",
11258 public_key: "com.android.foo.avbpubkey",
11259 private_key: "com.android.foo.pem",
11260 }
11261
11262 apex {
11263 name: "com.android.foo",
11264 key: "com.android.foo.key",
11265 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11266 updatable: false,
11267 }
11268
11269 // Prebuilt APEX.
11270
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011271 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011272 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011273 public: {
11274 jars: ["foo.jar"],
11275 },
Spandan Das5be63332023-12-13 00:06:32 +000011276 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011277 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011278 }
11279
11280 prebuilt_bootclasspath_fragment {
11281 name: "foo-bootclasspath-fragment",
11282 contents: ["framework-foo"],
11283 hidden_api: {
11284 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11285 metadata: "my-bootclasspath-fragment/metadata.csv",
11286 index: "my-bootclasspath-fragment/index.csv",
11287 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11288 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11289 },
11290 apex_available: [
11291 "com.android.foo",
11292 ],
11293 }
11294
11295 prebuilt_apex {
11296 name: "com.android.foo",
11297 apex_name: "com.android.foo",
11298 src: "com.android.foo-arm.apex",
11299 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11300 }
11301
11302 // Another Prebuilt ART APEX
11303 prebuilt_apex {
11304 name: "com.android.foo.v2",
11305 apex_name: "com.android.foo", // Used to determine the API domain
11306 src: "com.android.foo-arm.apex",
11307 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11308 }
11309
11310 // APEX contribution modules
11311
11312 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011313 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011314 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011315 contents: ["com.android.foo"],
11316 }
11317
11318 apex_contributions {
11319 name: "foo.prebuilt.contributions",
11320 api_domain: "com.android.foo",
11321 contents: ["prebuilt_com.android.foo"],
11322 }
11323
11324 apex_contributions {
11325 name: "foo.prebuilt.v2.contributions",
11326 api_domain: "com.android.foo",
11327 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011328 }
11329 `
11330
11331 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011332 desc string
11333 selectedApexContributions string
11334 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011335 }{
11336 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011337 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11338 selectedApexContributions: "foo.source.contributions",
11339 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011340 },
11341 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011342 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11343 selectedApexContributions: "foo.prebuilt.contributions",
11344 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011345 },
11346 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011347 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11348 selectedApexContributions: "foo.prebuilt.v2.contributions",
11349 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011350 },
11351 }
11352
11353 fragment := java.ApexVariantReference{
11354 Apex: proptools.StringPtr("com.android.foo"),
11355 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11356 }
11357
11358 for _, tc := range testCases {
11359 preparer := android.GroupFixturePreparers(
11360 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11361 android.FixtureMergeMockFs(map[string][]byte{
11362 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11363 }),
11364 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11365 variables.BuildFlags = map[string]string{
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011366 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
Spandan Das5be63332023-12-13 00:06:32 +000011367 }
11368 }),
11369 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011370 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011371 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011372 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11373 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011374 }
11375}
Spandan Das3576e762024-01-03 18:57:03 +000011376
11377// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11378// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11379func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
11380 // check that the LOCAL_MODULE in the generated mk file matches the name used in PRODUCT_PACKAGES
11381 // Since the name used in PRODUCT_PACKAGES does not contain prebuilt_ prefix, LOCAL_MODULE should not contain any prefix either
11382 checkLocalModuleName := func(t *testing.T, ctx *android.TestContext, soongApexModuleName string, expectedLocalModuleName string) {
11383 // Variations are created based on apex_name
11384 entries := android.AndroidMkEntriesForTest(t, ctx, ctx.ModuleForTests(soongApexModuleName, "android_common_com.android.foo").Module())
11385 android.AssertStringEquals(t, "LOCAL_MODULE of the prebuilt apex must match the name listed in PRODUCT_PACKAGES", expectedLocalModuleName, entries[0].EntryMap["LOCAL_MODULE"][0])
11386 }
11387 // for a mainline module family, check that only the flagged soong module is visible to make
11388 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11389 variation := func(moduleName string) string {
11390 ret := "android_common_com.android.foo"
11391 if moduleName == "com.google.android.foo" {
11392 ret = "android_common_com.google.android.foo_com.android.foo"
11393 }
11394 return ret
11395 }
11396
11397 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11398 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11399
11400 for _, hiddenModuleName := range hiddenModuleNames {
11401 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11402 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11403
11404 }
11405 }
11406
11407 bp := `
11408 apex_key {
11409 name: "com.android.foo.key",
11410 public_key: "com.android.foo.avbpubkey",
11411 private_key: "com.android.foo.pem",
11412 }
11413
11414 // AOSP source apex
11415 apex {
11416 name: "com.android.foo",
11417 key: "com.android.foo.key",
11418 updatable: false,
11419 }
11420
11421 // Google source apex
11422 override_apex {
11423 name: "com.google.android.foo",
11424 base: "com.android.foo",
11425 key: "com.android.foo.key",
11426 }
11427
11428 // Prebuilt Google APEX.
11429
11430 prebuilt_apex {
11431 name: "com.google.android.foo",
11432 apex_name: "com.android.foo",
11433 src: "com.android.foo-arm.apex",
11434 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11435 }
11436
11437 // Another Prebuilt Google APEX
11438 prebuilt_apex {
11439 name: "com.google.android.foo.v2",
11440 apex_name: "com.android.foo",
11441 source_apex_name: "com.google.android.foo", // source_apex_name becomes LOCAL_MODULE in the generated mk file
11442 src: "com.android.foo-arm.apex",
11443 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11444 }
11445
11446 // APEX contribution modules
11447
11448 apex_contributions {
11449 name: "foo.source.contributions",
11450 api_domain: "com.android.foo",
11451 contents: ["com.google.android.foo"],
11452 }
11453
11454 apex_contributions {
11455 name: "foo.prebuilt.contributions",
11456 api_domain: "com.android.foo",
11457 contents: ["prebuilt_com.google.android.foo"],
11458 }
11459
11460 apex_contributions {
11461 name: "foo.prebuilt.v2.contributions",
11462 api_domain: "com.android.foo",
11463 contents: ["prebuilt_com.google.android.foo.v2"],
11464 }
11465
11466 // This is an incompatible module because it selects multiple versions of the same mainline module
11467 apex_contributions {
11468 name: "foo.prebuilt.duplicate.contributions",
11469 api_domain: "com.android.foo",
11470 contents: [
11471 "prebuilt_com.google.android.foo",
11472 "prebuilt_com.google.android.foo.v2",
11473 ],
11474 }
11475 `
11476
11477 testCases := []struct {
11478 desc string
11479 selectedApexContributions string
11480 expectedVisibleModuleName string
11481 expectedHiddenModuleNames []string
11482 expectedError string
11483 }{
11484 {
11485 desc: "Source apex is selected, prebuilts should be hidden from make",
11486 selectedApexContributions: "foo.source.contributions",
11487 expectedVisibleModuleName: "com.google.android.foo",
11488 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11489 },
11490 {
11491 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11492 selectedApexContributions: "foo.prebuilt.contributions",
11493 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11494 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11495 },
11496 {
11497 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11498 selectedApexContributions: "foo.prebuilt.v2.contributions",
11499 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11500 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11501 },
11502 {
11503 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11504 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11505 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11506 },
11507 }
11508
11509 for _, tc := range testCases {
11510 preparer := android.GroupFixturePreparers(
11511 android.FixtureMergeMockFs(map[string][]byte{
11512 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11513 }),
11514 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
11515 variables.BuildFlags = map[string]string{
11516 "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": tc.selectedApexContributions,
11517 }
11518 }),
11519 )
11520 if tc.expectedError != "" {
11521 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11522 testApex(t, bp, preparer)
11523 return
11524 }
11525 ctx := testApex(t, bp, preparer)
11526
11527 // Check that the LOCAL_MODULE of the two prebuilts is com.android.foo
11528 // This ensures that product packaging can pick them for installation if it has been flagged by apex_contributions
11529 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo", "com.google.android.foo")
11530 checkLocalModuleName(t, ctx, "prebuilt_com.google.android.foo.v2", "com.google.android.foo")
11531
11532 // Check that
11533 // 1. The contents of the selected apex_contributions are visible to make
11534 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11535 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11536 }
11537}