blob: c4708a8c0ca85d593e6861304daab534b59dc921 [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
Kiyoung Kim487689e2022-07-26 09:48:22 +090028 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090029 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Albert Martineefabcf2022-03-21 20:11:16 +0000116func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
117 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
118 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
119 })
120}
121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withBinder32bit = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Binder32bit = proptools.BoolPtr(true)
125 },
126)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900127
Paul Duffin810f33d2021-03-09 14:12:32 +0000128var withUnbundledBuild = android.FixtureModifyProductVariables(
129 func(variables android.FixtureProductVariables) {
130 variables.Unbundled_build = proptools.BoolPtr(true)
131 },
132)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900133
Paul Duffin284165a2021-03-29 01:50:31 +0100134// Legacy preparer used for running tests within the apex package.
135//
136// This includes everything that was needed to run any test in the apex package prior to the
137// introduction of the test fixtures. Tests that are being converted to use fixtures directly
138// rather than through the testApex...() methods should avoid using this and instead use the
139// various preparers directly, using android.GroupFixturePreparers(...) to group them when
140// necessary.
141//
142// deprecated
143var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000144 // General preparers in alphabetical order as test infrastructure will enforce correct
145 // registration order.
146 android.PrepareForTestWithAndroidBuildComponents,
147 bpf.PrepareForTestWithBpf,
148 cc.PrepareForTestWithCcBuildComponents,
149 java.PrepareForTestWithJavaDefaultModules,
150 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
151 rust.PrepareForTestWithRustDefaultModules,
152 sh.PrepareForTestWithShBuildComponents,
153
154 PrepareForTestWithApexBuildComponents,
155
156 // Additional apex test specific preparers.
157 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
158 filegroup {
159 name: "myapex-file_contexts",
160 srcs: [
161 "apex/myapex-file_contexts",
162 ],
163 }
164 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000165 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000167 "a.java": nil,
168 "PrebuiltAppFoo.apk": nil,
169 "PrebuiltAppFooPriv.apk": nil,
170 "apex_manifest.json": nil,
171 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000172 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
173 "system/sepolicy/apex/myapex2-file_contexts": nil,
174 "system/sepolicy/apex/otherapex-file_contexts": nil,
175 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
176 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700177 "mylib.cpp": nil,
178 "mytest.cpp": nil,
179 "mytest1.cpp": nil,
180 "mytest2.cpp": nil,
181 "mytest3.cpp": nil,
182 "myprebuilt": nil,
183 "my_include": nil,
184 "foo/bar/MyClass.java": nil,
185 "prebuilt.jar": nil,
186 "prebuilt.so": nil,
187 "vendor/foo/devkeys/test.x509.pem": nil,
188 "vendor/foo/devkeys/test.pk8": nil,
189 "testkey.x509.pem": nil,
190 "testkey.pk8": nil,
191 "testkey.override.x509.pem": nil,
192 "testkey.override.pk8": nil,
193 "vendor/foo/devkeys/testkey.avbpubkey": nil,
194 "vendor/foo/devkeys/testkey.pem": nil,
195 "NOTICE": nil,
196 "custom_notice": nil,
197 "custom_notice_for_static_lib": nil,
198 "testkey2.avbpubkey": nil,
199 "testkey2.pem": nil,
200 "myapex-arm64.apex": nil,
201 "myapex-arm.apex": nil,
202 "myapex.apks": nil,
203 "frameworks/base/api/current.txt": nil,
204 "framework/aidl/a.aidl": nil,
205 "dummy.txt": nil,
206 "baz": nil,
207 "bar/baz": nil,
208 "testdata/baz": nil,
209 "AppSet.apks": nil,
210 "foo.rs": nil,
211 "libfoo.jar": nil,
212 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000213 },
214 ),
215
216 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
217 variables.DeviceVndkVersion = proptools.StringPtr("current")
218 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
219 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
220 variables.Platform_sdk_codename = proptools.StringPtr("Q")
221 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000222 // "Tiramisu" needs to be in the next line for compatibility with soong code,
223 // not because of these tests specifically (it's not used by the tests)
224 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900225 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000226 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000227 }),
228)
229
Paul Duffin52bfaa42021-03-23 23:40:12 +0000230var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
231 "system/sepolicy/apex/myapex-file_contexts": nil,
232})
233
Jooyung Han643adc42020-02-27 13:50:06 +0900234// ensure that 'result' equals 'expected'
235func ensureEquals(t *testing.T, result string, expected string) {
236 t.Helper()
237 if result != expected {
238 t.Errorf("%q != %q", expected, result)
239 }
240}
241
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242// ensure that 'result' contains 'expected'
243func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900244 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245 if !strings.Contains(result, expected) {
246 t.Errorf("%q is not found in %q", expected, result)
247 }
248}
249
Liz Kammer5bd365f2020-05-27 15:15:11 -0700250// ensure that 'result' contains 'expected' exactly one time
251func ensureContainsOnce(t *testing.T, result string, expected string) {
252 t.Helper()
253 count := strings.Count(result, expected)
254 if count != 1 {
255 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
256 }
257}
258
Jiyong Park25fc6a92018-11-18 18:02:45 +0900259// ensures that 'result' does not contain 'notExpected'
260func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900261 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262 if strings.Contains(result, notExpected) {
263 t.Errorf("%q is found in %q", notExpected, result)
264 }
265}
266
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700267func ensureMatches(t *testing.T, result string, expectedRex string) {
268 ok, err := regexp.MatchString(expectedRex, result)
269 if err != nil {
270 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
271 return
272 }
273 if !ok {
274 t.Errorf("%s does not match regular expession %s", result, expectedRex)
275 }
276}
277
Jiyong Park25fc6a92018-11-18 18:02:45 +0900278func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if !android.InList(expected, result) {
281 t.Errorf("%q is not found in %v", expected, result)
282 }
283}
284
285func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900286 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900287 if android.InList(notExpected, result) {
288 t.Errorf("%q is found in %v", notExpected, result)
289 }
290}
291
Jooyung Hane1633032019-08-01 17:41:43 +0900292func ensureListEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) > 0 {
295 t.Errorf("%q is expected to be empty", result)
296 }
297}
298
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000299func ensureListNotEmpty(t *testing.T, result []string) {
300 t.Helper()
301 if len(result) == 0 {
302 t.Errorf("%q is expected to be not empty", result)
303 }
304}
305
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306// Minimal test
307func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800308 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900309 apex_defaults {
310 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900311 manifest: ":myapex.manifest",
312 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900313 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900314 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900315 native_shared_libs: [
316 "mylib",
317 "libfoo.ffi",
318 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900319 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800320 multilib: {
321 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900322 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800323 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900324 },
Jiyong Park77acec62020-06-01 21:39:15 +0900325 java_libs: [
326 "myjar",
327 "myjar_dex",
328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000329 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 }
331
Jiyong Park30ca9372019-02-07 16:27:23 +0900332 apex {
333 name: "myapex",
334 defaults: ["myapex-defaults"],
335 }
336
Jiyong Park25fc6a92018-11-18 18:02:45 +0900337 apex_key {
338 name: "myapex.key",
339 public_key: "testkey.avbpubkey",
340 private_key: "testkey.pem",
341 }
342
Jiyong Park809bb722019-02-13 21:33:49 +0900343 filegroup {
344 name: "myapex.manifest",
345 srcs: ["apex_manifest.json"],
346 }
347
348 filegroup {
349 name: "myapex.androidmanifest",
350 srcs: ["AndroidManifest.xml"],
351 }
352
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 cc_library {
354 name: "mylib",
355 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900356 shared_libs: [
357 "mylib2",
358 "libbar.ffi",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 system_shared_libs: [],
361 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000362 // TODO: remove //apex_available:platform
363 apex_available: [
364 "//apex_available:platform",
365 "myapex",
366 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900367 }
368
Alex Light3d673592019-01-18 14:37:31 -0800369 cc_binary {
370 name: "foo",
371 srcs: ["mylib.cpp"],
372 compile_multilib: "both",
373 multilib: {
374 lib32: {
375 suffix: "32",
376 },
377 lib64: {
378 suffix: "64",
379 },
380 },
381 symlinks: ["foo_link_"],
382 symlink_preferred_arch: true,
383 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800384 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700385 apex_available: [ "myapex", "com.android.gki.*" ],
386 }
387
Jiyong Park99644e92020-11-17 22:21:02 +0900388 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000389 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900390 srcs: ["foo.rs"],
391 rlibs: ["libfoo.rlib.rust"],
392 dylibs: ["libfoo.dylib.rust"],
393 apex_available: ["myapex"],
394 }
395
396 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000397 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900398 srcs: ["foo.rs"],
399 crate_name: "foo",
400 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900401 shared_libs: ["libfoo.shared_from_rust"],
402 }
403
404 cc_library_shared {
405 name: "libfoo.shared_from_rust",
406 srcs: ["mylib.cpp"],
407 system_shared_libs: [],
408 stl: "none",
409 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900410 }
411
412 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000413 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900419 rust_ffi_shared {
420 name: "libfoo.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "foo",
423 apex_available: ["myapex"],
424 }
425
426 rust_ffi_shared {
427 name: "libbar.ffi",
428 srcs: ["foo.rs"],
429 crate_name: "bar",
430 apex_available: ["myapex"],
431 }
432
Yifan Hongd22a84a2020-07-28 17:37:46 -0700433 apex {
434 name: "com.android.gki.fake",
435 binaries: ["foo"],
436 key: "myapex.key",
437 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000438 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900442 name: "mylib2",
443 srcs: ["mylib.cpp"],
444 system_shared_libs: [],
445 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900446 static_libs: ["libstatic"],
447 // TODO: remove //apex_available:platform
448 apex_available: [
449 "//apex_available:platform",
450 "myapex",
451 ],
452 }
453
Paul Duffindddd5462020-04-07 15:25:44 +0100454 cc_prebuilt_library_shared {
455 name: "mylib2",
456 srcs: ["prebuilt.so"],
457 // TODO: remove //apex_available:platform
458 apex_available: [
459 "//apex_available:platform",
460 "myapex",
461 ],
462 }
463
Jiyong Park9918e1a2020-03-17 19:16:40 +0900464 cc_library_static {
465 name: "libstatic",
466 srcs: ["mylib.cpp"],
467 system_shared_libs: [],
468 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000469 // TODO: remove //apex_available:platform
470 apex_available: [
471 "//apex_available:platform",
472 "myapex",
473 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900474 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475
476 java_library {
477 name: "myjar",
478 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900479 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900480 sdk_version: "none",
481 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900482 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900483 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000484 // TODO: remove //apex_available:platform
485 apex_available: [
486 "//apex_available:platform",
487 "myapex",
488 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900489 }
490
Jiyong Park77acec62020-06-01 21:39:15 +0900491 dex_import {
492 name: "myjar_dex",
493 jars: ["prebuilt.jar"],
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
498 }
499
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 java_library {
501 name: "myotherjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900505 // TODO: remove //apex_available:platform
506 apex_available: [
507 "//apex_available:platform",
508 "myapex",
509 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900510 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900511
512 java_library {
513 name: "mysharedjar",
514 srcs: ["foo/bar/MyClass.java"],
515 sdk_version: "none",
516 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900517 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900518 `)
519
Paul Duffina71a67a2021-03-29 00:42:57 +0100520 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900521
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 // Make sure that Android.mk is created
523 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700524 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 var builder strings.Builder
526 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
527
528 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000529 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900530 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
531
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532 optFlags := apexRule.Args["opt_flags"]
533 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700534 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100535 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900536
Jiyong Park25fc6a92018-11-18 18:02:45 +0900537 copyCmds := apexRule.Args["copy_commands"]
538
539 // Ensure that main rule creates an output
540 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
541
542 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700543 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
544 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900548
549 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700550 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
551 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900552 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
553 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900554 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900556
557 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800558 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900560 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900561 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900562 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900563 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
564 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900566 // .. but not for java libs
567 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900568 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800569
Colin Cross7113d202019-11-20 16:39:12 -0800570 // Ensure that the platform variant ends with _shared or _common
571 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
572 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900573 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
574 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900575 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
576
577 // Ensure that dynamic dependency to java libs are not included
578 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800579
580 // Ensure that all symlinks are present.
581 found_foo_link_64 := false
582 found_foo := false
583 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900584 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800585 if strings.HasSuffix(cmd, "bin/foo") {
586 found_foo = true
587 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
588 found_foo_link_64 = true
589 }
590 }
591 }
592 good := found_foo && found_foo_link_64
593 if !good {
594 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
595 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900596
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
600 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
601 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100602
603 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
606 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
607 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800608}
609
Jooyung Hanf21c7972019-12-16 22:32:06 +0900610func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800611 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900612 apex_defaults {
613 name: "myapex-defaults",
614 key: "myapex.key",
615 prebuilts: ["myetc"],
616 native_shared_libs: ["mylib"],
617 java_libs: ["myjar"],
618 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900619 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800620 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000621 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900622 }
623
624 prebuilt_etc {
625 name: "myetc",
626 src: "myprebuilt",
627 }
628
629 apex {
630 name: "myapex",
631 defaults: ["myapex-defaults"],
632 }
633
634 apex_key {
635 name: "myapex.key",
636 public_key: "testkey.avbpubkey",
637 private_key: "testkey.pem",
638 }
639
640 cc_library {
641 name: "mylib",
642 system_shared_libs: [],
643 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000644 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900645 }
646
647 java_library {
648 name: "myjar",
649 srcs: ["foo/bar/MyClass.java"],
650 sdk_version: "none",
651 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 android_app {
656 name: "AppFoo",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900662
663 runtime_resource_overlay {
664 name: "rro",
665 theme: "blue",
666 }
667
markchien2f59ec92020-09-02 16:23:38 +0800668 bpf {
669 name: "bpf",
670 srcs: ["bpf.c", "bpf2.c"],
671 }
672
Ken Chenfad7f9d2021-11-10 22:02:57 +0800673 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800674 name: "netdTest",
675 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 sub_dir: "netd",
677 }
678
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000680 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900681 "etc/myetc",
682 "javalib/myjar.jar",
683 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000684 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900685 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800686 "etc/bpf/bpf.o",
687 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800688 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 })
690}
691
Jooyung Han01a3ee22019-11-02 02:52:25 +0900692func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
707 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
715 ctx := testApex(t, `
716 apex_defaults {
717 name: "my_defaults",
718 key: "myapex.key",
719 product_specific: true,
720 file_contexts: ":my-file-contexts",
721 updatable: false,
722 }
723 apex {
724 name: "myapex_30",
725 min_sdk_version: "30",
726 defaults: ["my_defaults"],
727 }
728
729 apex {
730 name: "myapex_current",
731 min_sdk_version: "current",
732 defaults: ["my_defaults"],
733 }
734
735 apex {
736 name: "myapex_none",
737 defaults: ["my_defaults"],
738 }
739
740 apex_key {
741 name: "myapex.key",
742 public_key: "testkey.avbpubkey",
743 private_key: "testkey.pem",
744 }
745
746 filegroup {
747 name: "my-file-contexts",
748 srcs: ["product_specific_file_contexts"],
749 }
750 `, withFiles(map[string][]byte{
751 "product_specific_file_contexts": nil,
752 }), android.FixtureModifyProductVariables(
753 func(variables android.FixtureProductVariables) {
754 variables.Unbundled_build = proptools.BoolPtr(true)
755 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
756 }), android.FixtureMergeEnv(map[string]string{
757 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
758 }))
759
760 testCases := []struct {
761 module string
762 minSdkVersion string
763 }{
764 {
765 module: "myapex_30",
766 minSdkVersion: "30",
767 },
768 {
769 module: "myapex_current",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 {
773 module: "myapex_none",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 }
777 for _, tc := range testCases {
778 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
779 args := module.Rule("apexRule").Args
780 optFlags := args["opt_flags"]
781 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
782 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
783 }
784 }
785}
786
Jooyung Hanaf730952023-02-28 14:13:38 +0900787func TestFileContexts(t *testing.T) {
788 for _, useFileContextsAsIs := range []bool{true, false} {
789 prop := ""
790 if useFileContextsAsIs {
791 prop = "use_file_contexts_as_is: true,\n"
792 }
793 ctx := testApex(t, `
794 apex {
795 name: "myapex",
796 key: "myapex.key",
797 file_contexts: "file_contexts",
798 updatable: false,
799 vendor: true,
800 `+prop+`
801 }
802
803 apex_key {
804 name: "myapex.key",
805 public_key: "testkey.avbpubkey",
806 private_key: "testkey.pem",
807 }
808 `, withFiles(map[string][]byte{
809 "file_contexts": nil,
810 }))
811
812 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
813 forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
814 if useFileContextsAsIs {
815 android.AssertStringDoesNotContain(t, "should force-label",
816 rule.RuleParams.Command, forceLabellingCommand)
817 } else {
818 android.AssertStringDoesContain(t, "shouldn't force-label",
819 rule.RuleParams.Command, forceLabellingCommand)
820 }
821 }
822}
823
Alex Light5098a612018-11-29 17:12:15 -0800824func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 payload_type: "zip",
830 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
852 system_shared_libs: [],
853 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000854 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800855 }
856 `)
857
Sundong Ahnabb64432019-10-22 13:58:29 +0900858 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800859 copyCmds := zipApexRule.Args["copy_commands"]
860
861 // Ensure that main rule creates an output
862 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
863
864 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700865 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800866
867 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700868 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800869
870 // Ensure that both direct and indirect deps are copied into apex
871 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
872 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900873}
874
875func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800876 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900877 apex {
878 name: "myapex",
879 key: "myapex.key",
880 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900881 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000882 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 }
884
885 apex_key {
886 name: "myapex.key",
887 public_key: "testkey.avbpubkey",
888 private_key: "testkey.pem",
889 }
890
891 cc_library {
892 name: "mylib",
893 srcs: ["mylib.cpp"],
894 shared_libs: ["mylib2", "mylib3"],
895 system_shared_libs: [],
896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000897 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 cc_library {
901 name: "mylib2",
902 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900903 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900904 system_shared_libs: [],
905 stl: "none",
906 stubs: {
907 versions: ["1", "2", "3"],
908 },
909 }
910
911 cc_library {
912 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900913 srcs: ["mylib.cpp"],
914 shared_libs: ["mylib4"],
915 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 stl: "none",
917 stubs: {
918 versions: ["10", "11", "12"],
919 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900922
923 cc_library {
924 name: "mylib4",
925 srcs: ["mylib.cpp"],
926 system_shared_libs: [],
927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000928 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900929 }
Jiyong Park105dc322021-06-11 17:22:09 +0900930
931 rust_binary {
932 name: "foo.rust",
933 srcs: ["foo.rs"],
934 shared_libs: ["libfoo.shared_from_rust"],
935 prefer_rlib: true,
936 apex_available: ["myapex"],
937 }
938
939 cc_library_shared {
940 name: "libfoo.shared_from_rust",
941 srcs: ["mylib.cpp"],
942 system_shared_libs: [],
943 stl: "none",
944 stubs: {
945 versions: ["10", "11", "12"],
946 },
947 }
948
Jiyong Park25fc6a92018-11-18 18:02:45 +0900949 `)
950
Sundong Ahnabb64432019-10-22 13:58:29 +0900951 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900952 copyCmds := apexRule.Args["copy_commands"]
953
954 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800955 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900956
957 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800958 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959
960 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800961 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962
Colin Crossaede88c2020-08-11 12:17:01 -0700963 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964
965 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900966 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900967 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900968 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900969
970 // 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 -0700971 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700973 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900974
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700975 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
976 // is replaced by sharing of "cFlags" in cc/builder.go.
977 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
978 // module variable representing "cflags". So it was not detected by ensureNotContains.
979 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
980 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
981 // including the original cflags's "-include mylib.h".
982 //
Jiyong Park64379952018-12-13 18:37:29 +0900983 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700984 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
985 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900986
Jiyong Park85cc35a2022-07-17 11:30:47 +0900987 // Ensure that genstub for platform-provided lib is invoked with --systemapi
988 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
989 // Ensure that genstub for apex-provided lib is invoked with --apex
990 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900991
Jooyung Hana57af4a2020-01-23 05:36:59 +0000992 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900993 "lib64/mylib.so",
994 "lib64/mylib3.so",
995 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900996 "bin/foo.rust",
997 "lib64/libc++.so", // by the implicit dependency from foo.rust
998 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900999 })
Jiyong Park105dc322021-06-11 17:22:09 +09001000
1001 // Ensure that stub dependency from a rust module is not included
1002 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1003 // The rust module is linked to the stub cc library
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001004 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001005 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1006 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001007
1008 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1009 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010}
1011
Jiyong Park1bc84122021-06-22 20:23:05 +09001012func TestApexCanUsePrivateApis(t *testing.T) {
1013 ctx := testApex(t, `
1014 apex {
1015 name: "myapex",
1016 key: "myapex.key",
1017 native_shared_libs: ["mylib"],
1018 binaries: ["foo.rust"],
1019 updatable: false,
1020 platform_apis: true,
1021 }
1022
1023 apex_key {
1024 name: "myapex.key",
1025 public_key: "testkey.avbpubkey",
1026 private_key: "testkey.pem",
1027 }
1028
1029 cc_library {
1030 name: "mylib",
1031 srcs: ["mylib.cpp"],
1032 shared_libs: ["mylib2"],
1033 system_shared_libs: [],
1034 stl: "none",
1035 apex_available: [ "myapex" ],
1036 }
1037
1038 cc_library {
1039 name: "mylib2",
1040 srcs: ["mylib.cpp"],
1041 cflags: ["-include mylib.h"],
1042 system_shared_libs: [],
1043 stl: "none",
1044 stubs: {
1045 versions: ["1", "2", "3"],
1046 },
1047 }
1048
1049 rust_binary {
1050 name: "foo.rust",
1051 srcs: ["foo.rs"],
1052 shared_libs: ["libfoo.shared_from_rust"],
1053 prefer_rlib: true,
1054 apex_available: ["myapex"],
1055 }
1056
1057 cc_library_shared {
1058 name: "libfoo.shared_from_rust",
1059 srcs: ["mylib.cpp"],
1060 system_shared_libs: [],
1061 stl: "none",
1062 stubs: {
1063 versions: ["10", "11", "12"],
1064 },
1065 }
1066 `)
1067
1068 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1069 copyCmds := apexRule.Args["copy_commands"]
1070
1071 // Ensure that indirect stubs dep is not included
1072 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1073 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1074
1075 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1076 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001077 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001078 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1079 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Peter Collingbournee7c71c32023-03-31 20:21:19 -07001080 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001081 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1082 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1083}
1084
Colin Cross7812fd32020-09-25 12:35:10 -07001085func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1086 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001087 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001088 apex {
1089 name: "myapex",
1090 key: "myapex.key",
1091 native_shared_libs: ["mylib", "mylib3"],
1092 min_sdk_version: "29",
1093 }
1094
1095 apex_key {
1096 name: "myapex.key",
1097 public_key: "testkey.avbpubkey",
1098 private_key: "testkey.pem",
1099 }
1100
1101 cc_library {
1102 name: "mylib",
1103 srcs: ["mylib.cpp"],
1104 shared_libs: ["mylib2", "mylib3"],
1105 system_shared_libs: [],
1106 stl: "none",
1107 apex_available: [ "myapex" ],
1108 min_sdk_version: "28",
1109 }
1110
1111 cc_library {
1112 name: "mylib2",
1113 srcs: ["mylib.cpp"],
1114 cflags: ["-include mylib.h"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 stubs: {
1118 versions: ["28", "29", "30", "current"],
1119 },
1120 min_sdk_version: "28",
1121 }
1122
1123 cc_library {
1124 name: "mylib3",
1125 srcs: ["mylib.cpp"],
1126 shared_libs: ["mylib4"],
1127 system_shared_libs: [],
1128 stl: "none",
1129 stubs: {
1130 versions: ["28", "29", "30", "current"],
1131 },
1132 apex_available: [ "myapex" ],
1133 min_sdk_version: "28",
1134 }
1135
1136 cc_library {
1137 name: "mylib4",
1138 srcs: ["mylib.cpp"],
1139 system_shared_libs: [],
1140 stl: "none",
1141 apex_available: [ "myapex" ],
1142 min_sdk_version: "28",
1143 }
1144 `)
1145
1146 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1147 copyCmds := apexRule.Args["copy_commands"]
1148
1149 // Ensure that direct non-stubs dep is always included
1150 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1151
1152 // Ensure that indirect stubs dep is not included
1153 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1154
1155 // Ensure that direct stubs dep is included
1156 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1157
1158 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1159
Jiyong Park55549df2021-02-26 23:57:23 +09001160 // Ensure that mylib is linking with the latest version of stub for mylib2
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001162 // ... and not linking to the non-stub (impl) variant of mylib2
1163 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1164
1165 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1166 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1167 // .. and not linking to the stubs variant of mylib3
1168 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1169
1170 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001171 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001172 ensureNotContains(t, mylib2Cflags, "-include ")
1173
Jiyong Park85cc35a2022-07-17 11:30:47 +09001174 // Ensure that genstub is invoked with --systemapi
1175 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001176
1177 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1178 "lib64/mylib.so",
1179 "lib64/mylib3.so",
1180 "lib64/mylib4.so",
1181 })
1182}
1183
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001184func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1185 t.Parallel()
1186 // myapex (Z)
1187 // mylib -----------------.
1188 // |
1189 // otherapex (29) |
1190 // libstub's versions: 29 Z current
1191 // |
1192 // <platform> |
1193 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001194 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195 apex {
1196 name: "myapex",
1197 key: "myapex.key",
1198 native_shared_libs: ["mylib"],
1199 min_sdk_version: "Z", // non-final
1200 }
1201
1202 cc_library {
1203 name: "mylib",
1204 srcs: ["mylib.cpp"],
1205 shared_libs: ["libstub"],
1206 apex_available: ["myapex"],
1207 min_sdk_version: "Z",
1208 }
1209
1210 apex_key {
1211 name: "myapex.key",
1212 public_key: "testkey.avbpubkey",
1213 private_key: "testkey.pem",
1214 }
1215
1216 apex {
1217 name: "otherapex",
1218 key: "myapex.key",
1219 native_shared_libs: ["libstub"],
1220 min_sdk_version: "29",
1221 }
1222
1223 cc_library {
1224 name: "libstub",
1225 srcs: ["mylib.cpp"],
1226 stubs: {
1227 versions: ["29", "Z", "current"],
1228 },
1229 apex_available: ["otherapex"],
1230 min_sdk_version: "29",
1231 }
1232
1233 // platform module depending on libstub from otherapex should use the latest stub("current")
1234 cc_library {
1235 name: "libplatform",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libstub"],
1238 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001239 `,
1240 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1241 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1242 variables.Platform_sdk_final = proptools.BoolPtr(false)
1243 variables.Platform_version_active_codenames = []string{"Z"}
1244 }),
1245 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001246
Jiyong Park55549df2021-02-26 23:57:23 +09001247 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001248 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001249 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001250 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001251 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001252
1253 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1254 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1255 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1256 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1257 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1258}
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001261 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001262 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001263 name: "myapex2",
1264 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001266 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001267 }
1268
1269 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001270 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001271 public_key: "testkey.avbpubkey",
1272 private_key: "testkey.pem",
1273 }
1274
1275 cc_library {
1276 name: "mylib",
1277 srcs: ["mylib.cpp"],
1278 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001279 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 system_shared_libs: [],
1281 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001282 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001283 }
1284
1285 cc_library {
1286 name: "libfoo",
1287 srcs: ["mylib.cpp"],
1288 shared_libs: ["libbar"],
1289 system_shared_libs: [],
1290 stl: "none",
1291 stubs: {
1292 versions: ["10", "20", "30"],
1293 },
1294 }
1295
1296 cc_library {
1297 name: "libbar",
1298 srcs: ["mylib.cpp"],
1299 system_shared_libs: [],
1300 stl: "none",
1301 }
1302
Jiyong Park678c8812020-02-07 17:25:49 +09001303 cc_library_static {
1304 name: "libbaz",
1305 srcs: ["mylib.cpp"],
1306 system_shared_libs: [],
1307 stl: "none",
1308 apex_available: [ "myapex2" ],
1309 }
1310
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001311 `)
1312
Jiyong Park83dc74b2020-01-14 18:38:44 +09001313 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001314 copyCmds := apexRule.Args["copy_commands"]
1315
1316 // Ensure that direct non-stubs dep is always included
1317 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1318
1319 // Ensure that indirect stubs dep is not included
1320 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1321
1322 // Ensure that dependency of stubs is not included
1323 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1324
Colin Crossaede88c2020-08-11 12:17:01 -07001325 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001326
1327 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001328 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001329 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001330 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001331
Jiyong Park3ff16992019-12-27 14:11:47 +09001332 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001333
1334 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1335 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001336
Artur Satayeva8bd1132020-04-27 18:07:06 +01001337 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001338 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001339
Artur Satayeva8bd1132020-04-27 18:07:06 +01001340 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001341 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001342}
1343
Jooyung Hand3639552019-08-09 12:57:43 +09001344func TestApexWithRuntimeLibsDependency(t *testing.T) {
1345 /*
1346 myapex
1347 |
1348 v (runtime_libs)
1349 mylib ------+------> libfoo [provides stub]
1350 |
1351 `------> libbar
1352 */
Colin Cross1c460562021-02-16 17:55:47 -08001353 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001354 apex {
1355 name: "myapex",
1356 key: "myapex.key",
1357 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001358 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001359 }
1360
1361 apex_key {
1362 name: "myapex.key",
1363 public_key: "testkey.avbpubkey",
1364 private_key: "testkey.pem",
1365 }
1366
1367 cc_library {
1368 name: "mylib",
1369 srcs: ["mylib.cpp"],
1370 runtime_libs: ["libfoo", "libbar"],
1371 system_shared_libs: [],
1372 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001373 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001374 }
1375
1376 cc_library {
1377 name: "libfoo",
1378 srcs: ["mylib.cpp"],
1379 system_shared_libs: [],
1380 stl: "none",
1381 stubs: {
1382 versions: ["10", "20", "30"],
1383 },
1384 }
1385
1386 cc_library {
1387 name: "libbar",
1388 srcs: ["mylib.cpp"],
1389 system_shared_libs: [],
1390 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001391 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001392 }
1393
1394 `)
1395
Sundong Ahnabb64432019-10-22 13:58:29 +09001396 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001397 copyCmds := apexRule.Args["copy_commands"]
1398
1399 // Ensure that direct non-stubs dep is always included
1400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1401
1402 // Ensure that indirect stubs dep is not included
1403 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1404
1405 // Ensure that runtime_libs dep in included
1406 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1407
Sundong Ahnabb64432019-10-22 13:58:29 +09001408 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001409 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1410 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001411
1412}
1413
Paul Duffina02cae32021-03-09 01:44:06 +00001414var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1415 cc.PrepareForTestWithCcBuildComponents,
1416 PrepareForTestWithApexBuildComponents,
1417 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001418 apex {
1419 name: "com.android.runtime",
1420 key: "com.android.runtime.key",
1421 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001422 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423 }
1424
1425 apex_key {
1426 name: "com.android.runtime.key",
1427 public_key: "testkey.avbpubkey",
1428 private_key: "testkey.pem",
1429 }
Paul Duffina02cae32021-03-09 01:44:06 +00001430 `),
1431 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1432)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001433
Paul Duffina02cae32021-03-09 01:44:06 +00001434func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001435 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001436 cc_library {
1437 name: "libc",
1438 no_libcrt: true,
1439 nocrt: true,
1440 stl: "none",
1441 system_shared_libs: [],
1442 stubs: { versions: ["1"] },
1443 apex_available: ["com.android.runtime"],
1444
1445 sanitize: {
1446 hwaddress: true,
1447 }
1448 }
1449
1450 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001451 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001452 no_libcrt: true,
1453 nocrt: true,
1454 stl: "none",
1455 system_shared_libs: [],
1456 srcs: [""],
1457 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001458 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001459
1460 sanitize: {
1461 never: true,
1462 },
Spandan Das4de7b492023-05-05 21:13:01 +00001463 apex_available: [
1464 "//apex_available:anyapex",
1465 "//apex_available:platform",
1466 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001467 } `)
1468 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001469
1470 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1471 "lib64/bionic/libc.so",
1472 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1473 })
1474
Colin Cross4c4c1be2022-02-10 11:41:18 -08001475 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001476
1477 installed := hwasan.Description("install libclang_rt.hwasan")
1478 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1479
1480 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1481 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1482 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1483}
1484
1485func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001486 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001487 prepareForTestOfRuntimeApexWithHwasan,
1488 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1489 variables.SanitizeDevice = []string{"hwaddress"}
1490 }),
1491 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001492 cc_library {
1493 name: "libc",
1494 no_libcrt: true,
1495 nocrt: true,
1496 stl: "none",
1497 system_shared_libs: [],
1498 stubs: { versions: ["1"] },
1499 apex_available: ["com.android.runtime"],
1500 }
1501
1502 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001503 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001504 no_libcrt: true,
1505 nocrt: true,
1506 stl: "none",
1507 system_shared_libs: [],
1508 srcs: [""],
1509 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001510 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001511
1512 sanitize: {
1513 never: true,
1514 },
Spandan Das4de7b492023-05-05 21:13:01 +00001515 apex_available: [
1516 "//apex_available:anyapex",
1517 "//apex_available:platform",
1518 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001519 }
Paul Duffina02cae32021-03-09 01:44:06 +00001520 `)
1521 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001522
1523 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1524 "lib64/bionic/libc.so",
1525 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1526 })
1527
Colin Cross4c4c1be2022-02-10 11:41:18 -08001528 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001529
1530 installed := hwasan.Description("install libclang_rt.hwasan")
1531 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1532
1533 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1534 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1535 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1536}
1537
Jooyung Han61b66e92020-03-21 14:21:46 +00001538func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1539 testcases := []struct {
1540 name string
1541 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001542 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 shouldLink string
1544 shouldNotLink []string
1545 }{
1546 {
Jiyong Park55549df2021-02-26 23:57:23 +09001547 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001548 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001549 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001550 shouldLink: "current",
1551 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001552 },
1553 {
Jiyong Park55549df2021-02-26 23:57:23 +09001554 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001555 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001556 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001557 shouldLink: "current",
1558 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 },
1560 }
1561 for _, tc := range testcases {
1562 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001563 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 apex {
1565 name: "myapex",
1566 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001567 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001568 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001569 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001571
Jooyung Han61b66e92020-03-21 14:21:46 +00001572 apex_key {
1573 name: "myapex.key",
1574 public_key: "testkey.avbpubkey",
1575 private_key: "testkey.pem",
1576 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001577
Jooyung Han61b66e92020-03-21 14:21:46 +00001578 cc_library {
1579 name: "mylib",
1580 srcs: ["mylib.cpp"],
1581 vendor_available: true,
1582 shared_libs: ["libbar"],
1583 system_shared_libs: [],
1584 stl: "none",
1585 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001586 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001587 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001588
Jooyung Han61b66e92020-03-21 14:21:46 +00001589 cc_library {
1590 name: "libbar",
1591 srcs: ["mylib.cpp"],
1592 system_shared_libs: [],
1593 stl: "none",
1594 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001595 llndk: {
1596 symbol_file: "libbar.map.txt",
1597 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001598 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001599 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001600 withUnbundledBuild,
1601 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001602
Jooyung Han61b66e92020-03-21 14:21:46 +00001603 // Ensure that LLNDK dep is not included
1604 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1605 "lib64/mylib.so",
1606 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001607
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 // Ensure that LLNDK dep is required
1609 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1610 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1611 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001612
Steven Moreland2c4000c2021-04-27 02:08:49 +00001613 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1614 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001615 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001616 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001618
Steven Moreland2c4000c2021-04-27 02:08:49 +00001619 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001620 ver := tc.shouldLink
1621 if tc.shouldLink == "current" {
1622 ver = strconv.Itoa(android.FutureApiLevelInt)
1623 }
1624 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001625 })
1626 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001627}
1628
Jiyong Park25fc6a92018-11-18 18:02:45 +09001629func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001630 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631 apex {
1632 name: "myapex",
1633 key: "myapex.key",
1634 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001635 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001636 }
1637
1638 apex_key {
1639 name: "myapex.key",
1640 public_key: "testkey.avbpubkey",
1641 private_key: "testkey.pem",
1642 }
1643
1644 cc_library {
1645 name: "mylib",
1646 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001647 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648 shared_libs: ["libdl#27"],
1649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001650 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001651 }
1652
1653 cc_library_shared {
1654 name: "mylib_shared",
1655 srcs: ["mylib.cpp"],
1656 shared_libs: ["libdl#27"],
1657 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001658 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 }
1660
1661 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001662 name: "libBootstrap",
1663 srcs: ["mylib.cpp"],
1664 stl: "none",
1665 bootstrap: true,
1666 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667 `)
1668
Sundong Ahnabb64432019-10-22 13:58:29 +09001669 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670 copyCmds := apexRule.Args["copy_commands"]
1671
1672 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001673 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001674 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1675 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676
1677 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001678 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679
Colin Crossaede88c2020-08-11 12:17:01 -07001680 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1681 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1682 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683
1684 // For dependency to libc
1685 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001686 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001688 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1691 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001692
1693 // For dependency to libm
1694 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001695 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001696 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001697 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001698 // ... and is not compiling with the stub
1699 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1700 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1701
1702 // For dependency to libdl
1703 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001704 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001705 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001706 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1707 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001708 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001709 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710 // ... Cflags from stub is correctly exported to mylib
1711 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1712 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001713
1714 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001715 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1716 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1717 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1718 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001719}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001720
Jooyung Han749dc692020-04-15 11:03:39 +09001721func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001722 // there are three links between liba --> libz.
1723 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001724 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001725 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001726 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001727 apex {
1728 name: "myapex",
1729 key: "myapex.key",
1730 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001731 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001732 }
1733
1734 apex {
1735 name: "otherapex",
1736 key: "myapex.key",
1737 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001738 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001739 }
1740
1741 apex_key {
1742 name: "myapex.key",
1743 public_key: "testkey.avbpubkey",
1744 private_key: "testkey.pem",
1745 }
1746
1747 cc_library {
1748 name: "libx",
1749 shared_libs: ["liba"],
1750 system_shared_libs: [],
1751 stl: "none",
1752 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001753 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 cc_library {
1757 name: "liby",
1758 shared_libs: ["liba"],
1759 system_shared_libs: [],
1760 stl: "none",
1761 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001762 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001763 }
1764
1765 cc_library {
1766 name: "liba",
1767 shared_libs: ["libz"],
1768 system_shared_libs: [],
1769 stl: "none",
1770 apex_available: [
1771 "//apex_available:anyapex",
1772 "//apex_available:platform",
1773 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001774 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001775 }
1776
1777 cc_library {
1778 name: "libz",
1779 system_shared_libs: [],
1780 stl: "none",
1781 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001782 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001783 },
1784 }
Jooyung Han749dc692020-04-15 11:03:39 +09001785 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001786
1787 expectLink := func(from, from_variant, to, to_variant string) {
1788 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1789 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1790 }
1791 expectNoLink := func(from, from_variant, to, to_variant string) {
1792 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1793 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1794 }
1795 // platform liba is linked to non-stub version
1796 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001797 // liba in myapex is linked to current
1798 expectLink("liba", "shared_apex29", "libz", "shared_current")
1799 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001800 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001801 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001802 // liba in otherapex is linked to current
1803 expectLink("liba", "shared_apex30", "libz", "shared_current")
1804 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001805 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1806 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001807}
1808
Jooyung Hanaed150d2020-04-02 01:41:41 +09001809func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001810 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001811 apex {
1812 name: "myapex",
1813 key: "myapex.key",
1814 native_shared_libs: ["libx"],
1815 min_sdk_version: "R",
1816 }
1817
1818 apex_key {
1819 name: "myapex.key",
1820 public_key: "testkey.avbpubkey",
1821 private_key: "testkey.pem",
1822 }
1823
1824 cc_library {
1825 name: "libx",
1826 shared_libs: ["libz"],
1827 system_shared_libs: [],
1828 stl: "none",
1829 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001830 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001831 }
1832
1833 cc_library {
1834 name: "libz",
1835 system_shared_libs: [],
1836 stl: "none",
1837 stubs: {
1838 versions: ["29", "R"],
1839 },
1840 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001841 `,
1842 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1843 variables.Platform_version_active_codenames = []string{"R"}
1844 }),
1845 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001846
1847 expectLink := func(from, from_variant, to, to_variant string) {
1848 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1849 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1850 }
1851 expectNoLink := func(from, from_variant, to, to_variant string) {
1852 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1853 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1854 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001855 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1856 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001857 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1858 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001859}
1860
Jooyung Han4c4da062021-06-23 10:23:16 +09001861func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1862 testApex(t, `
1863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 java_libs: ["libx"],
1867 min_sdk_version: "S",
1868 }
1869
1870 apex_key {
1871 name: "myapex.key",
1872 public_key: "testkey.avbpubkey",
1873 private_key: "testkey.pem",
1874 }
1875
1876 java_library {
1877 name: "libx",
1878 srcs: ["a.java"],
1879 apex_available: [ "myapex" ],
1880 sdk_version: "current",
1881 min_sdk_version: "S", // should be okay
1882 }
1883 `,
1884 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1885 variables.Platform_version_active_codenames = []string{"S"}
1886 variables.Platform_sdk_codename = proptools.StringPtr("S")
1887 }),
1888 )
1889}
1890
Jooyung Han749dc692020-04-15 11:03:39 +09001891func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001892 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001893 apex {
1894 name: "myapex",
1895 key: "myapex.key",
1896 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001897 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001898 }
1899
1900 apex_key {
1901 name: "myapex.key",
1902 public_key: "testkey.avbpubkey",
1903 private_key: "testkey.pem",
1904 }
1905
1906 cc_library {
1907 name: "libx",
1908 shared_libs: ["libz"],
1909 system_shared_libs: [],
1910 stl: "none",
1911 apex_available: [ "myapex" ],
1912 }
1913
1914 cc_library {
1915 name: "libz",
1916 system_shared_libs: [],
1917 stl: "none",
1918 stubs: {
1919 versions: ["1", "2"],
1920 },
1921 }
1922 `)
1923
1924 expectLink := func(from, from_variant, to, to_variant string) {
1925 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1926 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1927 }
1928 expectNoLink := func(from, from_variant, to, to_variant string) {
1929 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1930 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1931 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001932 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001933 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001934 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001935 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001936}
1937
Jooyung Handfc864c2023-03-20 18:19:07 +09001938func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001939 ctx := testApex(t, `
1940 apex {
1941 name: "myapex",
1942 key: "myapex.key",
1943 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001944 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001945 vendor: true,
1946 min_sdk_version: "29",
1947 }
1948
1949 apex_key {
1950 name: "myapex.key",
1951 public_key: "testkey.avbpubkey",
1952 private_key: "testkey.pem",
1953 }
1954
1955 cc_library {
1956 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001957 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001958 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001959 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001960 shared_libs: ["libbar"],
1961 }
1962
1963 cc_library {
1964 name: "libbar",
1965 stubs: { versions: ["29", "30"] },
1966 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001967 }
1968 `)
1969
1970 vendorVariant := "android_vendor.29_arm64_armv8-a"
1971
Jooyung Handfc864c2023-03-20 18:19:07 +09001972 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1973
1974 // Ensure that mylib links with "current" LLNDK
1975 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1976 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1977
1978 // Ensure that mylib is targeting 29
1979 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1980 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1981
1982 // Ensure that the correct variant of crtbegin_so is used.
1983 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1984 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001985
1986 // Ensure that the crtbegin_so used by the APEX is targeting 29
1987 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1988 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1989}
1990
Jooyung Han4495f842023-04-25 16:39:59 +09001991func TestTrackAllowedDeps(t *testing.T) {
1992 ctx := testApex(t, `
1993 apex {
1994 name: "myapex",
1995 key: "myapex.key",
1996 updatable: true,
1997 native_shared_libs: [
1998 "mylib",
1999 "yourlib",
2000 ],
2001 min_sdk_version: "29",
2002 }
2003
2004 apex {
2005 name: "myapex2",
2006 key: "myapex.key",
2007 updatable: false,
2008 native_shared_libs: ["yourlib"],
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 cc_library {
2018 name: "mylib",
2019 srcs: ["mylib.cpp"],
2020 shared_libs: ["libbar"],
2021 min_sdk_version: "29",
2022 apex_available: ["myapex"],
2023 }
2024
2025 cc_library {
2026 name: "libbar",
2027 stubs: { versions: ["29", "30"] },
2028 }
2029
2030 cc_library {
2031 name: "yourlib",
2032 srcs: ["mylib.cpp"],
2033 min_sdk_version: "29",
2034 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2035 }
2036 `, withFiles(android.MockFS{
2037 "packages/modules/common/build/allowed_deps.txt": nil,
2038 }))
2039
2040 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2041 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2042 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2043 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2044 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2045 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2046
2047 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2048 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2049 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2050 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2051 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2052 flatlist, "mylib:(minSdkVersion:29)")
2053 android.AssertStringListContains(t, "track platform-available lib",
2054 flatlist, "yourlib(minSdkVersion:29)")
2055}
2056
2057func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2058 ctx := testApex(t, `
2059 apex {
2060 name: "myapex",
2061 key: "myapex.key",
2062 updatable: true,
2063 min_sdk_version: "29",
2064 }
2065
2066 apex_key {
2067 name: "myapex.key",
2068 public_key: "testkey.avbpubkey",
2069 private_key: "testkey.pem",
2070 }
2071 `)
2072 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2073 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2074 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2075 }
2076}
2077
Jooyung Han03b51852020-02-26 22:45:42 +09002078func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002079 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002080 apex {
2081 name: "myapex",
2082 key: "myapex.key",
2083 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002084 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002085 }
2086
2087 apex_key {
2088 name: "myapex.key",
2089 public_key: "testkey.avbpubkey",
2090 private_key: "testkey.pem",
2091 }
2092
2093 cc_library {
2094 name: "libx",
2095 system_shared_libs: [],
2096 stl: "none",
2097 apex_available: [ "myapex" ],
2098 stubs: {
2099 versions: ["1", "2"],
2100 },
2101 }
2102
2103 cc_library {
2104 name: "libz",
2105 shared_libs: ["libx"],
2106 system_shared_libs: [],
2107 stl: "none",
2108 }
2109 `)
2110
2111 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002112 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002113 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2114 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2115 }
2116 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002117 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002118 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2119 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2120 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002121 expectLink("libz", "shared", "libx", "shared_current")
2122 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002123 expectNoLink("libz", "shared", "libz", "shared_1")
2124 expectNoLink("libz", "shared", "libz", "shared")
2125}
2126
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002127var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2128 func(variables android.FixtureProductVariables) {
2129 variables.SanitizeDevice = []string{"hwaddress"}
2130 },
2131)
2132
Jooyung Han75568392020-03-20 04:29:24 +09002133func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002134 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libx"],
2139 min_sdk_version: "29",
2140 }
2141
2142 apex_key {
2143 name: "myapex.key",
2144 public_key: "testkey.avbpubkey",
2145 private_key: "testkey.pem",
2146 }
2147
2148 cc_library {
2149 name: "libx",
2150 shared_libs: ["libbar"],
2151 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002152 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002153 }
2154
2155 cc_library {
2156 name: "libbar",
2157 stubs: {
2158 versions: ["29", "30"],
2159 },
2160 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002161 `,
2162 prepareForTestWithSantitizeHwaddress,
2163 )
Jooyung Han03b51852020-02-26 22:45:42 +09002164 expectLink := func(from, from_variant, to, to_variant string) {
2165 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2166 libFlags := ld.Args["libFlags"]
2167 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2168 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002169 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002170}
2171
Jooyung Han75568392020-03-20 04:29:24 +09002172func TestQTargetApexUsesStaticUnwinder(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"],
2178 min_sdk_version: "29",
2179 }
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 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002190 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002191 }
Jooyung Han75568392020-03-20 04:29:24 +09002192 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002193
2194 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002195 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002196 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002197 // note that platform variant is not.
2198 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002199 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002200}
2201
Jooyung Han749dc692020-04-15 11:03:39 +09002202func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2203 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002204 apex {
2205 name: "myapex",
2206 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002207 native_shared_libs: ["mylib"],
2208 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002209 }
2210
2211 apex_key {
2212 name: "myapex.key",
2213 public_key: "testkey.avbpubkey",
2214 private_key: "testkey.pem",
2215 }
Jooyung Han749dc692020-04-15 11:03:39 +09002216
2217 cc_library {
2218 name: "mylib",
2219 srcs: ["mylib.cpp"],
2220 system_shared_libs: [],
2221 stl: "none",
2222 apex_available: [
2223 "myapex",
2224 ],
2225 min_sdk_version: "30",
2226 }
2227 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002228
2229 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2230 apex {
2231 name: "myapex",
2232 key: "myapex.key",
2233 native_shared_libs: ["libfoo.ffi"],
2234 min_sdk_version: "29",
2235 }
2236
2237 apex_key {
2238 name: "myapex.key",
2239 public_key: "testkey.avbpubkey",
2240 private_key: "testkey.pem",
2241 }
2242
2243 rust_ffi_shared {
2244 name: "libfoo.ffi",
2245 srcs: ["foo.rs"],
2246 crate_name: "foo",
2247 apex_available: [
2248 "myapex",
2249 ],
2250 min_sdk_version: "30",
2251 }
2252 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002253
2254 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2255 apex {
2256 name: "myapex",
2257 key: "myapex.key",
2258 java_libs: ["libfoo"],
2259 min_sdk_version: "29",
2260 }
2261
2262 apex_key {
2263 name: "myapex.key",
2264 public_key: "testkey.avbpubkey",
2265 private_key: "testkey.pem",
2266 }
2267
2268 java_import {
2269 name: "libfoo",
2270 jars: ["libfoo.jar"],
2271 apex_available: [
2272 "myapex",
2273 ],
2274 min_sdk_version: "30",
2275 }
2276 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002277
2278 // Skip check for modules compiling against core API surface
2279 testApex(t, `
2280 apex {
2281 name: "myapex",
2282 key: "myapex.key",
2283 java_libs: ["libfoo"],
2284 min_sdk_version: "29",
2285 }
2286
2287 apex_key {
2288 name: "myapex.key",
2289 public_key: "testkey.avbpubkey",
2290 private_key: "testkey.pem",
2291 }
2292
2293 java_library {
2294 name: "libfoo",
2295 srcs: ["Foo.java"],
2296 apex_available: [
2297 "myapex",
2298 ],
2299 // Compile against core API surface
2300 sdk_version: "core_current",
2301 min_sdk_version: "30",
2302 }
2303 `)
2304
Jooyung Han749dc692020-04-15 11:03:39 +09002305}
2306
2307func TestApexMinSdkVersion_Okay(t *testing.T) {
2308 testApex(t, `
2309 apex {
2310 name: "myapex",
2311 key: "myapex.key",
2312 native_shared_libs: ["libfoo"],
2313 java_libs: ["libbar"],
2314 min_sdk_version: "29",
2315 }
2316
2317 apex_key {
2318 name: "myapex.key",
2319 public_key: "testkey.avbpubkey",
2320 private_key: "testkey.pem",
2321 }
2322
2323 cc_library {
2324 name: "libfoo",
2325 srcs: ["mylib.cpp"],
2326 shared_libs: ["libfoo_dep"],
2327 apex_available: ["myapex"],
2328 min_sdk_version: "29",
2329 }
2330
2331 cc_library {
2332 name: "libfoo_dep",
2333 srcs: ["mylib.cpp"],
2334 apex_available: ["myapex"],
2335 min_sdk_version: "29",
2336 }
2337
2338 java_library {
2339 name: "libbar",
2340 sdk_version: "current",
2341 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002342 static_libs: [
2343 "libbar_dep",
2344 "libbar_import_dep",
2345 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
2349
2350 java_library {
2351 name: "libbar_dep",
2352 sdk_version: "current",
2353 srcs: ["a.java"],
2354 apex_available: ["myapex"],
2355 min_sdk_version: "29",
2356 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002357
2358 java_import {
2359 name: "libbar_import_dep",
2360 jars: ["libbar.jar"],
2361 apex_available: ["myapex"],
2362 min_sdk_version: "29",
2363 }
Jooyung Han03b51852020-02-26 22:45:42 +09002364 `)
2365}
2366
Colin Cross8ca61c12022-10-06 21:00:14 -07002367func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2368 // Tests that an apex dependency with min_sdk_version higher than the
2369 // min_sdk_version of the apex is allowed as long as the dependency's
2370 // min_sdk_version is less than or equal to the api level that the
2371 // architecture was introduced in. In this case, arm64 didn't exist
2372 // until api level 21, so the arm64 code will never need to run on
2373 // an api level 20 device, even if other architectures of the apex
2374 // will.
2375 testApex(t, `
2376 apex {
2377 name: "myapex",
2378 key: "myapex.key",
2379 native_shared_libs: ["libfoo"],
2380 min_sdk_version: "20",
2381 }
2382
2383 apex_key {
2384 name: "myapex.key",
2385 public_key: "testkey.avbpubkey",
2386 private_key: "testkey.pem",
2387 }
2388
2389 cc_library {
2390 name: "libfoo",
2391 srcs: ["mylib.cpp"],
2392 apex_available: ["myapex"],
2393 min_sdk_version: "21",
2394 stl: "none",
2395 }
2396 `)
2397}
2398
Artur Satayev8cf899a2020-04-15 17:29:42 +01002399func TestJavaStableSdkVersion(t *testing.T) {
2400 testCases := []struct {
2401 name string
2402 expectedError string
2403 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002404 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002405 }{
2406 {
2407 name: "Non-updatable apex with non-stable dep",
2408 bp: `
2409 apex {
2410 name: "myapex",
2411 java_libs: ["myjar"],
2412 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002413 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002414 }
2415 apex_key {
2416 name: "myapex.key",
2417 public_key: "testkey.avbpubkey",
2418 private_key: "testkey.pem",
2419 }
2420 java_library {
2421 name: "myjar",
2422 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002423 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002424 apex_available: ["myapex"],
2425 }
2426 `,
2427 },
2428 {
2429 name: "Updatable apex with stable dep",
2430 bp: `
2431 apex {
2432 name: "myapex",
2433 java_libs: ["myjar"],
2434 key: "myapex.key",
2435 updatable: true,
2436 min_sdk_version: "29",
2437 }
2438 apex_key {
2439 name: "myapex.key",
2440 public_key: "testkey.avbpubkey",
2441 private_key: "testkey.pem",
2442 }
2443 java_library {
2444 name: "myjar",
2445 srcs: ["foo/bar/MyClass.java"],
2446 sdk_version: "current",
2447 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002448 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002449 }
2450 `,
2451 },
2452 {
2453 name: "Updatable apex with non-stable dep",
2454 expectedError: "cannot depend on \"myjar\"",
2455 bp: `
2456 apex {
2457 name: "myapex",
2458 java_libs: ["myjar"],
2459 key: "myapex.key",
2460 updatable: true,
2461 }
2462 apex_key {
2463 name: "myapex.key",
2464 public_key: "testkey.avbpubkey",
2465 private_key: "testkey.pem",
2466 }
2467 java_library {
2468 name: "myjar",
2469 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002470 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002471 apex_available: ["myapex"],
2472 }
2473 `,
2474 },
2475 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002476 name: "Updatable apex with non-stable legacy core platform dep",
2477 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2478 bp: `
2479 apex {
2480 name: "myapex",
2481 java_libs: ["myjar-uses-legacy"],
2482 key: "myapex.key",
2483 updatable: true,
2484 }
2485 apex_key {
2486 name: "myapex.key",
2487 public_key: "testkey.avbpubkey",
2488 private_key: "testkey.pem",
2489 }
2490 java_library {
2491 name: "myjar-uses-legacy",
2492 srcs: ["foo/bar/MyClass.java"],
2493 sdk_version: "core_platform",
2494 apex_available: ["myapex"],
2495 }
2496 `,
2497 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2498 },
2499 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002500 name: "Updatable apex with non-stable transitive dep",
2501 // This is not actually detecting that the transitive dependency is unstable, rather it is
2502 // detecting that the transitive dependency is building against a wider API surface than the
2503 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002504 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002505 bp: `
2506 apex {
2507 name: "myapex",
2508 java_libs: ["myjar"],
2509 key: "myapex.key",
2510 updatable: true,
2511 }
2512 apex_key {
2513 name: "myapex.key",
2514 public_key: "testkey.avbpubkey",
2515 private_key: "testkey.pem",
2516 }
2517 java_library {
2518 name: "myjar",
2519 srcs: ["foo/bar/MyClass.java"],
2520 sdk_version: "current",
2521 apex_available: ["myapex"],
2522 static_libs: ["transitive-jar"],
2523 }
2524 java_library {
2525 name: "transitive-jar",
2526 srcs: ["foo/bar/MyClass.java"],
2527 sdk_version: "core_platform",
2528 apex_available: ["myapex"],
2529 }
2530 `,
2531 },
2532 }
2533
2534 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2536 continue
2537 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002538 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002539 errorHandler := android.FixtureExpectsNoErrors
2540 if test.expectedError != "" {
2541 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002542 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002543 android.GroupFixturePreparers(
2544 java.PrepareForTestWithJavaDefaultModules,
2545 PrepareForTestWithApexBuildComponents,
2546 prepareForTestWithMyapex,
2547 android.OptionalFixturePreparer(test.preparer),
2548 ).
2549 ExtendWithErrorHandler(errorHandler).
2550 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002551 })
2552 }
2553}
2554
Jooyung Han749dc692020-04-15 11:03:39 +09002555func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2556 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2557 apex {
2558 name: "myapex",
2559 key: "myapex.key",
2560 native_shared_libs: ["mylib"],
2561 min_sdk_version: "29",
2562 }
2563
2564 apex_key {
2565 name: "myapex.key",
2566 public_key: "testkey.avbpubkey",
2567 private_key: "testkey.pem",
2568 }
2569
2570 cc_library {
2571 name: "mylib",
2572 srcs: ["mylib.cpp"],
2573 shared_libs: ["mylib2"],
2574 system_shared_libs: [],
2575 stl: "none",
2576 apex_available: [
2577 "myapex",
2578 ],
2579 min_sdk_version: "29",
2580 }
2581
2582 // indirect part of the apex
2583 cc_library {
2584 name: "mylib2",
2585 srcs: ["mylib.cpp"],
2586 system_shared_libs: [],
2587 stl: "none",
2588 apex_available: [
2589 "myapex",
2590 ],
2591 min_sdk_version: "30",
2592 }
2593 `)
2594}
2595
2596func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2597 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2598 apex {
2599 name: "myapex",
2600 key: "myapex.key",
2601 apps: ["AppFoo"],
2602 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002603 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002604 }
2605
2606 apex_key {
2607 name: "myapex.key",
2608 public_key: "testkey.avbpubkey",
2609 private_key: "testkey.pem",
2610 }
2611
2612 android_app {
2613 name: "AppFoo",
2614 srcs: ["foo/bar/MyClass.java"],
2615 sdk_version: "current",
2616 min_sdk_version: "29",
2617 system_modules: "none",
2618 stl: "none",
2619 static_libs: ["bar"],
2620 apex_available: [ "myapex" ],
2621 }
2622
2623 java_library {
2624 name: "bar",
2625 sdk_version: "current",
2626 srcs: ["a.java"],
2627 apex_available: [ "myapex" ],
2628 }
2629 `)
2630}
2631
2632func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002633 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002634 apex {
2635 name: "myapex",
2636 key: "myapex.key",
2637 native_shared_libs: ["mylib"],
2638 min_sdk_version: "29",
2639 }
2640
2641 apex_key {
2642 name: "myapex.key",
2643 public_key: "testkey.avbpubkey",
2644 private_key: "testkey.pem",
2645 }
2646
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002647 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002648 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2649 cc_library {
2650 name: "mylib",
2651 srcs: ["mylib.cpp"],
2652 shared_libs: ["mylib2"],
2653 system_shared_libs: [],
2654 stl: "none",
2655 apex_available: ["myapex", "otherapex"],
2656 min_sdk_version: "29",
2657 }
2658
2659 cc_library {
2660 name: "mylib2",
2661 srcs: ["mylib.cpp"],
2662 system_shared_libs: [],
2663 stl: "none",
2664 apex_available: ["otherapex"],
2665 stubs: { versions: ["29", "30"] },
2666 min_sdk_version: "30",
2667 }
2668
2669 apex {
2670 name: "otherapex",
2671 key: "myapex.key",
2672 native_shared_libs: ["mylib", "mylib2"],
2673 min_sdk_version: "30",
2674 }
2675 `)
2676 expectLink := func(from, from_variant, to, to_variant string) {
2677 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2678 libFlags := ld.Args["libFlags"]
2679 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2680 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002681 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002682 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002683}
2684
Jooyung Haned124c32021-01-26 11:43:46 +09002685func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002686 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2687 func(variables android.FixtureProductVariables) {
2688 variables.Platform_sdk_codename = proptools.StringPtr("S")
2689 variables.Platform_version_active_codenames = []string{"S"}
2690 },
2691 )
Jooyung Haned124c32021-01-26 11:43:46 +09002692 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2693 apex {
2694 name: "myapex",
2695 key: "myapex.key",
2696 native_shared_libs: ["libfoo"],
2697 min_sdk_version: "S",
2698 }
2699 apex_key {
2700 name: "myapex.key",
2701 public_key: "testkey.avbpubkey",
2702 private_key: "testkey.pem",
2703 }
2704 cc_library {
2705 name: "libfoo",
2706 shared_libs: ["libbar"],
2707 apex_available: ["myapex"],
2708 min_sdk_version: "29",
2709 }
2710 cc_library {
2711 name: "libbar",
2712 apex_available: ["myapex"],
2713 }
2714 `, withSAsActiveCodeNames)
2715}
2716
2717func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002718 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2719 variables.Platform_sdk_codename = proptools.StringPtr("S")
2720 variables.Platform_version_active_codenames = []string{"S", "T"}
2721 })
Colin Cross1c460562021-02-16 17:55:47 -08002722 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002723 apex {
2724 name: "myapex",
2725 key: "myapex.key",
2726 native_shared_libs: ["libfoo"],
2727 min_sdk_version: "S",
2728 }
2729 apex_key {
2730 name: "myapex.key",
2731 public_key: "testkey.avbpubkey",
2732 private_key: "testkey.pem",
2733 }
2734 cc_library {
2735 name: "libfoo",
2736 shared_libs: ["libbar"],
2737 apex_available: ["myapex"],
2738 min_sdk_version: "S",
2739 }
2740 cc_library {
2741 name: "libbar",
2742 stubs: {
2743 symbol_file: "libbar.map.txt",
2744 versions: ["30", "S", "T"],
2745 },
2746 }
2747 `, withSAsActiveCodeNames)
2748
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002749 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002750 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2751 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002752 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002753}
2754
Jiyong Park7c2ee712018-12-07 00:42:25 +09002755func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002756 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002757 apex {
2758 name: "myapex",
2759 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002760 native_shared_libs: ["mylib"],
2761 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002762 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002763 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002764 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002765 }
2766
2767 apex_key {
2768 name: "myapex.key",
2769 public_key: "testkey.avbpubkey",
2770 private_key: "testkey.pem",
2771 }
2772
2773 prebuilt_etc {
2774 name: "myetc",
2775 src: "myprebuilt",
2776 sub_dir: "foo/bar",
2777 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778
2779 cc_library {
2780 name: "mylib",
2781 srcs: ["mylib.cpp"],
2782 relative_install_path: "foo/bar",
2783 system_shared_libs: [],
2784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002785 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002786 }
2787
2788 cc_binary {
2789 name: "mybin",
2790 srcs: ["mylib.cpp"],
2791 relative_install_path: "foo/bar",
2792 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002793 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002794 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002795 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002796 `)
2797
Sundong Ahnabb64432019-10-22 13:58:29 +09002798 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002799 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002800
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002801 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002802 ensureContains(t, cmd, "/etc ")
2803 ensureContains(t, cmd, "/etc/foo ")
2804 ensureContains(t, cmd, "/etc/foo/bar ")
2805 ensureContains(t, cmd, "/lib64 ")
2806 ensureContains(t, cmd, "/lib64/foo ")
2807 ensureContains(t, cmd, "/lib64/foo/bar ")
2808 ensureContains(t, cmd, "/lib ")
2809 ensureContains(t, cmd, "/lib/foo ")
2810 ensureContains(t, cmd, "/lib/foo/bar ")
2811 ensureContains(t, cmd, "/bin ")
2812 ensureContains(t, cmd, "/bin/foo ")
2813 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002814}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002815
Jooyung Han35155c42020-02-06 17:33:20 +09002816func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002817 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002818 apex {
2819 name: "myapex",
2820 key: "myapex.key",
2821 multilib: {
2822 both: {
2823 native_shared_libs: ["mylib"],
2824 binaries: ["mybin"],
2825 },
2826 },
2827 compile_multilib: "both",
2828 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002829 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002830 }
2831
2832 apex_key {
2833 name: "myapex.key",
2834 public_key: "testkey.avbpubkey",
2835 private_key: "testkey.pem",
2836 }
2837
2838 cc_library {
2839 name: "mylib",
2840 relative_install_path: "foo/bar",
2841 system_shared_libs: [],
2842 stl: "none",
2843 apex_available: [ "myapex" ],
2844 native_bridge_supported: true,
2845 }
2846
2847 cc_binary {
2848 name: "mybin",
2849 relative_install_path: "foo/bar",
2850 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002851 stl: "none",
2852 apex_available: [ "myapex" ],
2853 native_bridge_supported: true,
2854 compile_multilib: "both", // default is "first" for binary
2855 multilib: {
2856 lib64: {
2857 suffix: "64",
2858 },
2859 },
2860 }
2861 `, withNativeBridgeEnabled)
2862 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2863 "bin/foo/bar/mybin",
2864 "bin/foo/bar/mybin64",
2865 "bin/arm/foo/bar/mybin",
2866 "bin/arm64/foo/bar/mybin64",
2867 "lib/foo/bar/mylib.so",
2868 "lib/arm/foo/bar/mylib.so",
2869 "lib64/foo/bar/mylib.so",
2870 "lib64/arm64/foo/bar/mylib.so",
2871 })
2872}
2873
Jooyung Han85d61762020-06-24 23:50:26 +09002874func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002875 result := android.GroupFixturePreparers(
2876 prepareForApexTest,
2877 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2878 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002879 apex {
2880 name: "myapex",
2881 key: "myapex.key",
2882 binaries: ["mybin"],
2883 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002884 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002885 }
2886 apex_key {
2887 name: "myapex.key",
2888 public_key: "testkey.avbpubkey",
2889 private_key: "testkey.pem",
2890 }
2891 cc_binary {
2892 name: "mybin",
2893 vendor: true,
2894 shared_libs: ["libfoo"],
2895 }
2896 cc_library {
2897 name: "libfoo",
2898 proprietary: true,
2899 }
2900 `)
2901
Colin Crossc68db4b2021-11-11 18:59:15 -08002902 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002903 "bin/mybin",
2904 "lib64/libfoo.so",
2905 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2906 "lib64/libc++.so",
2907 })
2908
Colin Crossc68db4b2021-11-11 18:59:15 -08002909 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2910 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002911 name := apexBundle.BaseModuleName()
2912 prefix := "TARGET_"
2913 var builder strings.Builder
2914 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002915 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002916 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002917 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002918
Colin Crossc68db4b2021-11-11 18:59:15 -08002919 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002920 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2921 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002922}
2923
Jooyung Hanc5a96762022-02-04 11:54:50 +09002924func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2925 testApexError(t, `Trying to include a VNDK library`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2930 vendor: true,
2931 use_vndk_as_stable: true,
2932 updatable: false,
2933 }
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }`)
2939}
2940
Jooyung Handf78e212020-07-22 15:54:47 +09002941func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002942 // myapex myapex2
2943 // | |
2944 // mybin ------. mybin2
2945 // \ \ / |
2946 // (stable) .---\--------` |
2947 // \ / \ |
2948 // \ / \ /
2949 // libvndk libvendor
2950 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002952 apex {
2953 name: "myapex",
2954 key: "myapex.key",
2955 binaries: ["mybin"],
2956 vendor: true,
2957 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002958 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002959 }
2960 apex_key {
2961 name: "myapex.key",
2962 public_key: "testkey.avbpubkey",
2963 private_key: "testkey.pem",
2964 }
2965 cc_binary {
2966 name: "mybin",
2967 vendor: true,
2968 shared_libs: ["libvndk", "libvendor"],
2969 }
2970 cc_library {
2971 name: "libvndk",
2972 vndk: {
2973 enabled: true,
2974 },
2975 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002976 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002977 }
2978 cc_library {
2979 name: "libvendor",
2980 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002981 stl: "none",
2982 }
2983 apex {
2984 name: "myapex2",
2985 key: "myapex.key",
2986 binaries: ["mybin2"],
2987 vendor: true,
2988 use_vndk_as_stable: false,
2989 updatable: false,
2990 }
2991 cc_binary {
2992 name: "mybin2",
2993 vendor: true,
2994 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002995 }
2996 `)
2997
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002998 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002999
Jooyung Han91f92032022-02-04 12:36:33 +09003000 for _, tc := range []struct {
3001 name string
3002 apexName string
3003 moduleName string
3004 moduleVariant string
3005 libs []string
3006 contents []string
3007 requireVndkNamespace bool
3008 }{
3009 {
3010 name: "use_vndk_as_stable",
3011 apexName: "myapex",
3012 moduleName: "mybin",
3013 moduleVariant: vendorVariant + "_apex10000",
3014 libs: []string{
3015 // should link with vendor variants of VNDK libs(libvndk/libc++)
3016 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3017 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3018 // unstable Vendor libs as APEX variant
3019 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3020 },
3021 contents: []string{
3022 "bin/mybin",
3023 "lib64/libvendor.so",
3024 // VNDK libs (libvndk/libc++) are not included
3025 },
3026 requireVndkNamespace: true,
3027 },
3028 {
3029 name: "!use_vndk_as_stable",
3030 apexName: "myapex2",
3031 moduleName: "mybin2",
3032 moduleVariant: vendorVariant + "_myapex2",
3033 libs: []string{
3034 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3035 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3036 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3037 // unstable vendor libs have "merged" APEX variants
3038 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3039 },
3040 contents: []string{
3041 "bin/mybin2",
3042 "lib64/libvendor.so",
3043 // VNDK libs are included as well
3044 "lib64/libvndk.so",
3045 "lib64/libc++.so",
3046 },
3047 requireVndkNamespace: false,
3048 },
3049 } {
3050 t.Run(tc.name, func(t *testing.T) {
3051 // Check linked libs
3052 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3053 libs := names(ldRule.Args["libFlags"])
3054 for _, lib := range tc.libs {
3055 ensureListContains(t, libs, lib)
3056 }
3057 // Check apex contents
3058 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003059
Jooyung Han91f92032022-02-04 12:36:33 +09003060 // Check "requireNativeLibs"
3061 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3062 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3063 if tc.requireVndkNamespace {
3064 ensureListContains(t, requireNativeLibs, ":vndk")
3065 } else {
3066 ensureListNotContains(t, requireNativeLibs, ":vndk")
3067 }
3068 })
3069 }
Jooyung Handf78e212020-07-22 15:54:47 +09003070}
3071
Justin Yun13decfb2021-03-08 19:25:55 +09003072func TestProductVariant(t *testing.T) {
3073 ctx := testApex(t, `
3074 apex {
3075 name: "myapex",
3076 key: "myapex.key",
3077 updatable: false,
3078 product_specific: true,
3079 binaries: ["foo"],
3080 }
3081
3082 apex_key {
3083 name: "myapex.key",
3084 public_key: "testkey.avbpubkey",
3085 private_key: "testkey.pem",
3086 }
3087
3088 cc_binary {
3089 name: "foo",
3090 product_available: true,
3091 apex_available: ["myapex"],
3092 srcs: ["foo.cpp"],
3093 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003094 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3095 variables.ProductVndkVersion = proptools.StringPtr("current")
3096 }),
3097 )
Justin Yun13decfb2021-03-08 19:25:55 +09003098
3099 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003100 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003101 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3102 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3103 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3104 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3105}
3106
Jooyung Han8e5685d2020-09-21 11:02:57 +09003107func TestApex_withPrebuiltFirmware(t *testing.T) {
3108 testCases := []struct {
3109 name string
3110 additionalProp string
3111 }{
3112 {"system apex with prebuilt_firmware", ""},
3113 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3114 }
3115 for _, tc := range testCases {
3116 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003117 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003118 apex {
3119 name: "myapex",
3120 key: "myapex.key",
3121 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003122 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003123 `+tc.additionalProp+`
3124 }
3125 apex_key {
3126 name: "myapex.key",
3127 public_key: "testkey.avbpubkey",
3128 private_key: "testkey.pem",
3129 }
3130 prebuilt_firmware {
3131 name: "myfirmware",
3132 src: "myfirmware.bin",
3133 filename_from_src: true,
3134 `+tc.additionalProp+`
3135 }
3136 `)
3137 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3138 "etc/firmware/myfirmware.bin",
3139 })
3140 })
3141 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003142}
3143
Jooyung Hanefb184e2020-06-25 17:14:25 +09003144func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003145 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003146 apex {
3147 name: "myapex",
3148 key: "myapex.key",
3149 vendor: true,
3150 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003151 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003152 }
3153
3154 apex_key {
3155 name: "myapex.key",
3156 public_key: "testkey.avbpubkey",
3157 private_key: "testkey.pem",
3158 }
3159
3160 cc_library {
3161 name: "mylib",
3162 vendor_available: true,
3163 }
3164 `)
3165
3166 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003167 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003168 name := apexBundle.BaseModuleName()
3169 prefix := "TARGET_"
3170 var builder strings.Builder
3171 data.Custom(&builder, name, prefix, "", data)
3172 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003173 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003174}
3175
Jooyung Han2ed99d02020-06-24 23:26:26 +09003176func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003177 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003178 apex {
3179 name: "myapex",
3180 key: "myapex.key",
3181 vintf_fragments: ["fragment.xml"],
3182 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003183 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003184 }
3185 apex_key {
3186 name: "myapex.key",
3187 public_key: "testkey.avbpubkey",
3188 private_key: "testkey.pem",
3189 }
3190 cc_binary {
3191 name: "mybin",
3192 }
3193 `)
3194
3195 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003196 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003197 name := apexBundle.BaseModuleName()
3198 prefix := "TARGET_"
3199 var builder strings.Builder
3200 data.Custom(&builder, name, prefix, "", data)
3201 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003202 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003203 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003204}
3205
Jiyong Park16e91a02018-12-20 18:18:08 +09003206func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003207 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003208 apex {
3209 name: "myapex",
3210 key: "myapex.key",
3211 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003212 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003213 }
3214
3215 apex_key {
3216 name: "myapex.key",
3217 public_key: "testkey.avbpubkey",
3218 private_key: "testkey.pem",
3219 }
3220
3221 cc_library {
3222 name: "mylib",
3223 srcs: ["mylib.cpp"],
3224 system_shared_libs: [],
3225 stl: "none",
3226 stubs: {
3227 versions: ["1", "2", "3"],
3228 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003229 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003230 }
3231
3232 cc_binary {
3233 name: "not_in_apex",
3234 srcs: ["mylib.cpp"],
3235 static_libs: ["mylib"],
3236 static_executable: true,
3237 system_shared_libs: [],
3238 stl: "none",
3239 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003240 `)
3241
Colin Cross7113d202019-11-20 16:39:12 -08003242 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003243
3244 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003245 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003246}
Jiyong Park9335a262018-12-24 11:31:58 +09003247
3248func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003249 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003250 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003251 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003252 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003253 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003254 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003255 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003256 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003257 }
3258
3259 cc_library {
3260 name: "mylib",
3261 srcs: ["mylib.cpp"],
3262 system_shared_libs: [],
3263 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003264 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003265 }
3266
3267 apex_key {
3268 name: "myapex.key",
3269 public_key: "testkey.avbpubkey",
3270 private_key: "testkey.pem",
3271 }
3272
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003273 android_app_certificate {
3274 name: "myapex.certificate",
3275 certificate: "testkey",
3276 }
3277
3278 android_app_certificate {
3279 name: "myapex.certificate.override",
3280 certificate: "testkey.override",
3281 }
3282
Jiyong Park9335a262018-12-24 11:31:58 +09003283 `)
3284
3285 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003286 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003287
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003288 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3289 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003290 "vendor/foo/devkeys/testkey.avbpubkey")
3291 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003292 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3293 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003294 "vendor/foo/devkeys/testkey.pem")
3295 }
3296
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003297 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003298 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003299 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003300 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003301 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003302 }
3303}
Jiyong Park58e364a2019-01-19 19:24:06 +09003304
Jooyung Hanf121a652019-12-17 14:30:11 +09003305func TestCertificate(t *testing.T) {
3306 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003307 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003308 apex {
3309 name: "myapex",
3310 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003311 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003312 }
3313 apex_key {
3314 name: "myapex.key",
3315 public_key: "testkey.avbpubkey",
3316 private_key: "testkey.pem",
3317 }`)
3318 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3319 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3320 if actual := rule.Args["certificates"]; actual != expected {
3321 t.Errorf("certificates should be %q, not %q", expected, actual)
3322 }
3323 })
3324 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003325 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003326 apex {
3327 name: "myapex_keytest",
3328 key: "myapex.key",
3329 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003330 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003331 }
3332 apex_key {
3333 name: "myapex.key",
3334 public_key: "testkey.avbpubkey",
3335 private_key: "testkey.pem",
3336 }
3337 android_app_certificate {
3338 name: "myapex.certificate.override",
3339 certificate: "testkey.override",
3340 }`)
3341 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3342 expected := "testkey.override.x509.pem testkey.override.pk8"
3343 if actual := rule.Args["certificates"]; actual != expected {
3344 t.Errorf("certificates should be %q, not %q", expected, actual)
3345 }
3346 })
3347 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003348 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003349 apex {
3350 name: "myapex",
3351 key: "myapex.key",
3352 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003353 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003354 }
3355 apex_key {
3356 name: "myapex.key",
3357 public_key: "testkey.avbpubkey",
3358 private_key: "testkey.pem",
3359 }
3360 android_app_certificate {
3361 name: "myapex.certificate",
3362 certificate: "testkey",
3363 }`)
3364 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3365 expected := "testkey.x509.pem testkey.pk8"
3366 if actual := rule.Args["certificates"]; actual != expected {
3367 t.Errorf("certificates should be %q, not %q", expected, actual)
3368 }
3369 })
3370 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003372 apex {
3373 name: "myapex_keytest",
3374 key: "myapex.key",
3375 file_contexts: ":myapex-file_contexts",
3376 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003377 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003378 }
3379 apex_key {
3380 name: "myapex.key",
3381 public_key: "testkey.avbpubkey",
3382 private_key: "testkey.pem",
3383 }
3384 android_app_certificate {
3385 name: "myapex.certificate.override",
3386 certificate: "testkey.override",
3387 }`)
3388 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3389 expected := "testkey.override.x509.pem testkey.override.pk8"
3390 if actual := rule.Args["certificates"]; actual != expected {
3391 t.Errorf("certificates should be %q, not %q", expected, actual)
3392 }
3393 })
3394 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003395 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003396 apex {
3397 name: "myapex",
3398 key: "myapex.key",
3399 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003400 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003401 }
3402 apex_key {
3403 name: "myapex.key",
3404 public_key: "testkey.avbpubkey",
3405 private_key: "testkey.pem",
3406 }`)
3407 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3408 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3409 if actual := rule.Args["certificates"]; actual != expected {
3410 t.Errorf("certificates should be %q, not %q", expected, actual)
3411 }
3412 })
3413 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003414 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003415 apex {
3416 name: "myapex_keytest",
3417 key: "myapex.key",
3418 file_contexts: ":myapex-file_contexts",
3419 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003420 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003421 }
3422 apex_key {
3423 name: "myapex.key",
3424 public_key: "testkey.avbpubkey",
3425 private_key: "testkey.pem",
3426 }
3427 android_app_certificate {
3428 name: "myapex.certificate.override",
3429 certificate: "testkey.override",
3430 }`)
3431 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3432 expected := "testkey.override.x509.pem testkey.override.pk8"
3433 if actual := rule.Args["certificates"]; actual != expected {
3434 t.Errorf("certificates should be %q, not %q", expected, actual)
3435 }
3436 })
3437}
3438
Jiyong Park58e364a2019-01-19 19:24:06 +09003439func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003440 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003441 apex {
3442 name: "myapex",
3443 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003444 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003445 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003446 }
3447
3448 apex {
3449 name: "otherapex",
3450 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003451 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003452 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003453 }
3454
3455 apex_key {
3456 name: "myapex.key",
3457 public_key: "testkey.avbpubkey",
3458 private_key: "testkey.pem",
3459 }
3460
3461 cc_library {
3462 name: "mylib",
3463 srcs: ["mylib.cpp"],
3464 system_shared_libs: [],
3465 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003466 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003467 "myapex",
3468 "otherapex",
3469 ],
Jooyung Han24282772020-03-21 23:20:55 +09003470 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003471 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003472 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003473 cc_library {
3474 name: "mylib2",
3475 srcs: ["mylib.cpp"],
3476 system_shared_libs: [],
3477 stl: "none",
3478 apex_available: [
3479 "myapex",
3480 "otherapex",
3481 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003482 static_libs: ["mylib3"],
3483 recovery_available: true,
3484 min_sdk_version: "29",
3485 }
3486 cc_library {
3487 name: "mylib3",
3488 srcs: ["mylib.cpp"],
3489 system_shared_libs: [],
3490 stl: "none",
3491 apex_available: [
3492 "myapex",
3493 "otherapex",
3494 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003495 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003496 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003497 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003498 `)
3499
Jooyung Hanc87a0592020-03-02 17:44:33 +09003500 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003501 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003502 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503
Vinh Tranf9754732023-01-19 22:41:46 -05003504 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003505 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003506 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003507
Vinh Tranf9754732023-01-19 22:41:46 -05003508 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003509 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003510 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003511
Colin Crossaede88c2020-08-11 12:17:01 -07003512 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3513 // each variant defines additional macros to distinguish which apex variant it is built for
3514
3515 // non-APEX variant does not have __ANDROID_APEX__ defined
3516 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3517 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3518
Vinh Tranf9754732023-01-19 22:41:46 -05003519 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003520 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3521 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003522
Jooyung Hanc87a0592020-03-02 17:44:33 +09003523 // non-APEX variant does not have __ANDROID_APEX__ defined
3524 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3525 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3526
Vinh Tranf9754732023-01-19 22:41:46 -05003527 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003528 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003529 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003530}
Jiyong Park7e636d02019-01-28 16:16:54 +09003531
3532func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003533 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003534 apex {
3535 name: "myapex",
3536 key: "myapex.key",
3537 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003538 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003539 }
3540
3541 apex_key {
3542 name: "myapex.key",
3543 public_key: "testkey.avbpubkey",
3544 private_key: "testkey.pem",
3545 }
3546
3547 cc_library_headers {
3548 name: "mylib_headers",
3549 export_include_dirs: ["my_include"],
3550 system_shared_libs: [],
3551 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003552 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003553 }
3554
3555 cc_library {
3556 name: "mylib",
3557 srcs: ["mylib.cpp"],
3558 system_shared_libs: [],
3559 stl: "none",
3560 header_libs: ["mylib_headers"],
3561 export_header_lib_headers: ["mylib_headers"],
3562 stubs: {
3563 versions: ["1", "2", "3"],
3564 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003565 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003566 }
3567
3568 cc_library {
3569 name: "otherlib",
3570 srcs: ["mylib.cpp"],
3571 system_shared_libs: [],
3572 stl: "none",
3573 shared_libs: ["mylib"],
3574 }
3575 `)
3576
Colin Cross7113d202019-11-20 16:39:12 -08003577 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003578
3579 // Ensure that the include path of the header lib is exported to 'otherlib'
3580 ensureContains(t, cFlags, "-Imy_include")
3581}
Alex Light9670d332019-01-29 18:07:33 -08003582
Jiyong Park7cd10e32020-01-14 09:22:18 +09003583type fileInApex struct {
3584 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003585 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003586 isLink bool
3587}
3588
Jooyung Han1724d582022-12-21 10:17:44 +09003589func (f fileInApex) String() string {
3590 return f.src + ":" + f.path
3591}
3592
3593func (f fileInApex) match(expectation string) bool {
3594 parts := strings.Split(expectation, ":")
3595 if len(parts) == 1 {
3596 match, _ := path.Match(parts[0], f.path)
3597 return match
3598 }
3599 if len(parts) == 2 {
3600 matchSrc, _ := path.Match(parts[0], f.src)
3601 matchDst, _ := path.Match(parts[1], f.path)
3602 return matchSrc && matchDst
3603 }
3604 panic("invalid expected file specification: " + expectation)
3605}
3606
Jooyung Hana57af4a2020-01-23 05:36:59 +00003607func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003609 module := ctx.ModuleForTests(moduleName, variant)
3610 apexRule := module.MaybeRule("apexRule")
3611 apexDir := "/image.apex/"
3612 if apexRule.Rule == nil {
3613 apexRule = module.Rule("zipApexRule")
3614 apexDir = "/image.zipapex/"
3615 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003616 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 for _, cmd := range strings.Split(copyCmds, "&&") {
3619 cmd = strings.TrimSpace(cmd)
3620 if cmd == "" {
3621 continue
3622 }
3623 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003624 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003626 switch terms[0] {
3627 case "mkdir":
3628 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003629 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003630 t.Fatal("copyCmds contains invalid cp command", cmd)
3631 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003632 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003633 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003634 isLink = false
3635 case "ln":
3636 if len(terms) != 3 && len(terms) != 4 {
3637 // ln LINK TARGET or ln -s LINK TARGET
3638 t.Fatal("copyCmds contains invalid ln command", cmd)
3639 }
3640 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003641 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003642 isLink = true
3643 default:
3644 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3645 }
3646 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003647 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003648 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003649 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 }
Jooyung Han1724d582022-12-21 10:17:44 +09003651 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003652 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003653 }
3654 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003655 return ret
3656}
3657
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003659 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 var failed bool
3661 var surplus []string
3662 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003663 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003664 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003665 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003666 if file.match(expected) {
3667 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003668 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003669 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 }
3671 }
Jooyung Han1724d582022-12-21 10:17:44 +09003672 if !matchFound {
3673 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003674 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003675 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003676
Jooyung Han31c470b2019-10-18 16:26:59 +09003677 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003679 t.Log("surplus files", surplus)
3680 failed = true
3681 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003682
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003683 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003684 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003685 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003686 if !filesMatched[expected] {
3687 missing = append(missing, expected)
3688 }
3689 }
3690 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 t.Log("missing files", missing)
3692 failed = true
3693 }
3694 if failed {
3695 t.Fail()
3696 }
3697}
3698
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003699func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3700 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3701}
3702
3703func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3704 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3705 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3706 if deapexer.Output != nil {
3707 outputs = append(outputs, deapexer.Output.String())
3708 }
3709 for _, output := range deapexer.ImplicitOutputs {
3710 outputs = append(outputs, output.String())
3711 }
3712 actualFiles := make([]fileInApex, 0, len(outputs))
3713 for _, output := range outputs {
3714 dir := "/deapexer/"
3715 pos := strings.LastIndex(output, dir)
3716 if pos == -1 {
3717 t.Fatal("Unknown deapexer output ", output)
3718 }
3719 path := output[pos+len(dir):]
3720 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3721 }
3722 assertFileListEquals(t, files, actualFiles)
3723}
3724
Jooyung Han344d5432019-08-23 11:17:39 +09003725func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003726 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003727 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003728 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003729 "etc/llndk.libraries.29.txt",
3730 "etc/vndkcore.libraries.29.txt",
3731 "etc/vndksp.libraries.29.txt",
3732 "etc/vndkprivate.libraries.29.txt",
3733 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003734 }
3735 testCases := []struct {
3736 vndkVersion string
3737 expectedFiles []string
3738 }{
3739 {
3740 vndkVersion: "current",
3741 expectedFiles: append(commonFiles,
3742 "lib/libvndk.so",
3743 "lib/libvndksp.so",
3744 "lib64/libvndk.so",
3745 "lib64/libvndksp.so"),
3746 },
3747 {
3748 vndkVersion: "",
3749 expectedFiles: append(commonFiles,
3750 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3751 "lib/libvndksp.so",
3752 "lib64/libvndksp.so"),
3753 },
3754 }
3755 for _, tc := range testCases {
3756 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3757 ctx := testApex(t, `
3758 apex_vndk {
3759 name: "com.android.vndk.current",
3760 key: "com.android.vndk.current.key",
3761 updatable: false,
3762 }
3763
3764 apex_key {
3765 name: "com.android.vndk.current.key",
3766 public_key: "testkey.avbpubkey",
3767 private_key: "testkey.pem",
3768 }
3769
3770 cc_library {
3771 name: "libvndk",
3772 srcs: ["mylib.cpp"],
3773 vendor_available: true,
3774 product_available: true,
3775 vndk: {
3776 enabled: true,
3777 },
3778 system_shared_libs: [],
3779 stl: "none",
3780 apex_available: [ "com.android.vndk.current" ],
3781 }
3782
3783 cc_library {
3784 name: "libvndksp",
3785 srcs: ["mylib.cpp"],
3786 vendor_available: true,
3787 product_available: true,
3788 vndk: {
3789 enabled: true,
3790 support_system_process: true,
3791 },
3792 system_shared_libs: [],
3793 stl: "none",
3794 apex_available: [ "com.android.vndk.current" ],
3795 }
3796
3797 // VNDK-Ext should not cause any problems
3798
3799 cc_library {
3800 name: "libvndk.ext",
3801 srcs: ["mylib2.cpp"],
3802 vendor: true,
3803 vndk: {
3804 enabled: true,
3805 extends: "libvndk",
3806 },
3807 system_shared_libs: [],
3808 stl: "none",
3809 }
3810
3811 cc_library {
3812 name: "libvndksp.ext",
3813 srcs: ["mylib2.cpp"],
3814 vendor: true,
3815 vndk: {
3816 enabled: true,
3817 support_system_process: true,
3818 extends: "libvndksp",
3819 },
3820 system_shared_libs: [],
3821 stl: "none",
3822 }
3823 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3824 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3825 }))
3826 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3827 })
3828 }
Jooyung Han344d5432019-08-23 11:17:39 +09003829}
3830
3831func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003832 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003833 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003834 name: "com.android.vndk.current",
3835 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003836 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003837 }
3838
3839 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003840 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003841 public_key: "testkey.avbpubkey",
3842 private_key: "testkey.pem",
3843 }
3844
3845 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003846 name: "libvndk",
3847 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003848 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003849 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003850 vndk: {
3851 enabled: true,
3852 },
3853 system_shared_libs: [],
3854 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003855 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003856 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003857
3858 cc_prebuilt_library_shared {
3859 name: "libvndk.arm",
3860 srcs: ["libvndk.arm.so"],
3861 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003862 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003863 vndk: {
3864 enabled: true,
3865 },
3866 enabled: false,
3867 arch: {
3868 arm: {
3869 enabled: true,
3870 },
3871 },
3872 system_shared_libs: [],
3873 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003874 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003876 `+vndkLibrariesTxtFiles("current"),
3877 withFiles(map[string][]byte{
3878 "libvndk.so": nil,
3879 "libvndk.arm.so": nil,
3880 }))
Colin Cross2807f002021-03-02 10:15:29 -08003881 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003882 "lib/libvndk.so",
3883 "lib/libvndk.arm.so",
3884 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003885 "lib/libc++.so",
3886 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003888 })
Jooyung Han344d5432019-08-23 11:17:39 +09003889}
3890
Jooyung Han39edb6c2019-11-06 16:53:07 +09003891func vndkLibrariesTxtFiles(vers ...string) (result string) {
3892 for _, v := range vers {
3893 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003894 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003895 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003896 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 name: "` + txt + `.libraries.txt",
3898 }
3899 `
3900 }
3901 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003902 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003903 result += `
3904 prebuilt_etc {
3905 name: "` + txt + `.libraries.` + v + `.txt",
3906 src: "dummy.txt",
3907 }
3908 `
3909 }
3910 }
3911 }
3912 return
3913}
3914
Jooyung Han344d5432019-08-23 11:17:39 +09003915func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003916 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003917 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003918 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003919 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003920 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003921 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003922 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003923 }
3924
3925 apex_key {
3926 name: "myapex.key",
3927 public_key: "testkey.avbpubkey",
3928 private_key: "testkey.pem",
3929 }
3930
Jooyung Han31c470b2019-10-18 16:26:59 +09003931 vndk_prebuilt_shared {
3932 name: "libvndk27",
3933 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003934 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003935 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003936 vndk: {
3937 enabled: true,
3938 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003939 target_arch: "arm64",
3940 arch: {
3941 arm: {
3942 srcs: ["libvndk27_arm.so"],
3943 },
3944 arm64: {
3945 srcs: ["libvndk27_arm64.so"],
3946 },
3947 },
Colin Cross2807f002021-03-02 10:15:29 -08003948 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003949 }
3950
3951 vndk_prebuilt_shared {
3952 name: "libvndk27",
3953 version: "27",
3954 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003955 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003956 vndk: {
3957 enabled: true,
3958 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003959 target_arch: "x86_64",
3960 arch: {
3961 x86: {
3962 srcs: ["libvndk27_x86.so"],
3963 },
3964 x86_64: {
3965 srcs: ["libvndk27_x86_64.so"],
3966 },
3967 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003968 }
3969 `+vndkLibrariesTxtFiles("27"),
3970 withFiles(map[string][]byte{
3971 "libvndk27_arm.so": nil,
3972 "libvndk27_arm64.so": nil,
3973 "libvndk27_x86.so": nil,
3974 "libvndk27_x86_64.so": nil,
3975 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003976
Colin Cross2807f002021-03-02 10:15:29 -08003977 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003978 "lib/libvndk27_arm.so",
3979 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003980 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003981 })
Jooyung Han344d5432019-08-23 11:17:39 +09003982}
3983
Jooyung Han90eee022019-10-01 20:02:42 +09003984func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003985 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003986 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003987 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003988 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003989 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003990 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003991 }
3992 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003993 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003994 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003995 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003996 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003997 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003998 }
3999 apex_key {
4000 name: "myapex.key",
4001 public_key: "testkey.avbpubkey",
4002 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004003 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004004
4005 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004006 module := ctx.ModuleForTests(moduleName, "android_common_image")
4007 apexManifestRule := module.Rule("apexManifestRule")
4008 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004009 }
4010
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004011 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004012 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004013}
4014
Jooyung Han344d5432019-08-23 11:17:39 +09004015func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004016 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004017 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004018 name: "com.android.vndk.current",
4019 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004020 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004021 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004022 }
4023
4024 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004025 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004026 public_key: "testkey.avbpubkey",
4027 private_key: "testkey.pem",
4028 }
4029
4030 cc_library {
4031 name: "libvndk",
4032 srcs: ["mylib.cpp"],
4033 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004034 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004035 native_bridge_supported: true,
4036 host_supported: true,
4037 vndk: {
4038 enabled: true,
4039 },
4040 system_shared_libs: [],
4041 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004042 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004043 }
Colin Cross2807f002021-03-02 10:15:29 -08004044 `+vndkLibrariesTxtFiles("current"),
4045 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004046
Colin Cross2807f002021-03-02 10:15:29 -08004047 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004048 "lib/libvndk.so",
4049 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004050 "lib/libc++.so",
4051 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004052 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004053 })
Jooyung Han344d5432019-08-23 11:17:39 +09004054}
4055
4056func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004057 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004058 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004059 name: "com.android.vndk.current",
4060 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004061 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004062 native_bridge_supported: true,
4063 }
4064
4065 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004066 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 cc_library {
4072 name: "libvndk",
4073 srcs: ["mylib.cpp"],
4074 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004075 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004076 native_bridge_supported: true,
4077 host_supported: true,
4078 vndk: {
4079 enabled: true,
4080 },
4081 system_shared_libs: [],
4082 stl: "none",
4083 }
4084 `)
4085}
4086
Jooyung Han31c470b2019-10-18 16:26:59 +09004087func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004088 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004090 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004091 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004092 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004094 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004095 }
4096
4097 apex_key {
4098 name: "myapex.key",
4099 public_key: "testkey.avbpubkey",
4100 private_key: "testkey.pem",
4101 }
4102
4103 vndk_prebuilt_shared {
4104 name: "libvndk27",
4105 version: "27",
4106 target_arch: "arm",
4107 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004108 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 vndk: {
4110 enabled: true,
4111 },
4112 arch: {
4113 arm: {
4114 srcs: ["libvndk27.so"],
4115 }
4116 },
4117 }
4118
4119 vndk_prebuilt_shared {
4120 name: "libvndk27",
4121 version: "27",
4122 target_arch: "arm",
4123 binder32bit: true,
4124 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004125 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004126 vndk: {
4127 enabled: true,
4128 },
4129 arch: {
4130 arm: {
4131 srcs: ["libvndk27binder32.so"],
4132 }
4133 },
Colin Cross2807f002021-03-02 10:15:29 -08004134 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004135 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004136 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004137 withFiles(map[string][]byte{
4138 "libvndk27.so": nil,
4139 "libvndk27binder32.so": nil,
4140 }),
4141 withBinder32bit,
4142 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004143 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004144 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4145 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004146 },
4147 }),
4148 )
4149
Colin Cross2807f002021-03-02 10:15:29 -08004150 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004151 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004152 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004153 })
4154}
4155
Jooyung Han45a96772020-06-15 14:59:42 +09004156func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004157 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004158 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004159 name: "com.android.vndk.current",
4160 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004161 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004162 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004163 }
4164
4165 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004166 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004167 public_key: "testkey.avbpubkey",
4168 private_key: "testkey.pem",
4169 }
4170
4171 cc_library {
4172 name: "libz",
4173 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004174 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004175 vndk: {
4176 enabled: true,
4177 },
4178 stubs: {
4179 symbol_file: "libz.map.txt",
4180 versions: ["30"],
4181 }
4182 }
4183 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4184 "libz.map.txt": nil,
4185 }))
4186
Colin Cross2807f002021-03-02 10:15:29 -08004187 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004188 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4189 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004190 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4191 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4192 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4193 "*/*",
4194 })
Jooyung Han45a96772020-06-15 14:59:42 +09004195}
4196
Jooyung Hane1633032019-08-01 17:41:43 +09004197func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004198 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004199 apex {
4200 name: "myapex_nodep",
4201 key: "myapex.key",
4202 native_shared_libs: ["lib_nodep"],
4203 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004204 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004205 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004206 }
4207
4208 apex {
4209 name: "myapex_dep",
4210 key: "myapex.key",
4211 native_shared_libs: ["lib_dep"],
4212 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004213 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004214 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004215 }
4216
4217 apex {
4218 name: "myapex_provider",
4219 key: "myapex.key",
4220 native_shared_libs: ["libfoo"],
4221 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004222 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004223 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004224 }
4225
4226 apex {
4227 name: "myapex_selfcontained",
4228 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004229 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004230 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004231 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004232 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004233 }
4234
4235 apex_key {
4236 name: "myapex.key",
4237 public_key: "testkey.avbpubkey",
4238 private_key: "testkey.pem",
4239 }
4240
4241 cc_library {
4242 name: "lib_nodep",
4243 srcs: ["mylib.cpp"],
4244 system_shared_libs: [],
4245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004246 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004247 }
4248
4249 cc_library {
4250 name: "lib_dep",
4251 srcs: ["mylib.cpp"],
4252 shared_libs: ["libfoo"],
4253 system_shared_libs: [],
4254 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004255 apex_available: [
4256 "myapex_dep",
4257 "myapex_provider",
4258 "myapex_selfcontained",
4259 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004260 }
4261
4262 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004263 name: "lib_dep_on_bar",
4264 srcs: ["mylib.cpp"],
4265 shared_libs: ["libbar"],
4266 system_shared_libs: [],
4267 stl: "none",
4268 apex_available: [
4269 "myapex_selfcontained",
4270 ],
4271 }
4272
4273
4274 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004275 name: "libfoo",
4276 srcs: ["mytest.cpp"],
4277 stubs: {
4278 versions: ["1"],
4279 },
4280 system_shared_libs: [],
4281 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004282 apex_available: [
4283 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004284 ],
4285 }
4286
4287 cc_library {
4288 name: "libbar",
4289 srcs: ["mytest.cpp"],
4290 stubs: {
4291 versions: ["1"],
4292 },
4293 system_shared_libs: [],
4294 stl: "none",
4295 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004296 "myapex_selfcontained",
4297 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004298 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004299
Jooyung Hane1633032019-08-01 17:41:43 +09004300 `)
4301
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004302 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004303 var provideNativeLibs, requireNativeLibs []string
4304
Sundong Ahnabb64432019-10-22 13:58:29 +09004305 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004306 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4307 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004308 ensureListEmpty(t, provideNativeLibs)
4309 ensureListEmpty(t, requireNativeLibs)
4310
Sundong Ahnabb64432019-10-22 13:58:29 +09004311 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004312 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4313 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004314 ensureListEmpty(t, provideNativeLibs)
4315 ensureListContains(t, requireNativeLibs, "libfoo.so")
4316
Sundong Ahnabb64432019-10-22 13:58:29 +09004317 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004318 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4319 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004320 ensureListContains(t, provideNativeLibs, "libfoo.so")
4321 ensureListEmpty(t, requireNativeLibs)
4322
Sundong Ahnabb64432019-10-22 13:58:29 +09004323 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004324 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4325 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004326 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004327 ensureListEmpty(t, requireNativeLibs)
4328}
4329
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004330func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4331 ctx := testApex(t, `
4332 apex {
4333 name: "myapex",
4334 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004335 native_shared_libs: ["mylib"],
4336 updatable: false,
4337 }
4338
4339 apex_key {
4340 name: "myapex.key",
4341 public_key: "testkey.avbpubkey",
4342 private_key: "testkey.pem",
4343 }
4344
4345 cc_library {
4346 name: "mylib",
4347 srcs: ["mylib.cpp"],
4348 system_shared_libs: [],
4349 stl: "none",
4350 apex_available: [
4351 "//apex_available:platform",
4352 "myapex",
4353 ],
4354 }
4355 `, android.FixtureMergeEnv(map[string]string{
4356 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4357 }))
4358
Jooyung Han63dff462023-02-09 00:11:27 +00004359 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004360 apexManifestRule := module.Rule("apexManifestRule")
4361 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4362}
4363
Vinh Tran8f5310f2022-10-07 18:16:47 -04004364func TestCompileMultilibProp(t *testing.T) {
4365 testCases := []struct {
4366 compileMultiLibProp string
4367 containedLibs []string
4368 notContainedLibs []string
4369 }{
4370 {
4371 containedLibs: []string{
4372 "image.apex/lib64/mylib.so",
4373 "image.apex/lib/mylib.so",
4374 },
4375 compileMultiLibProp: `compile_multilib: "both",`,
4376 },
4377 {
4378 containedLibs: []string{"image.apex/lib64/mylib.so"},
4379 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4380 compileMultiLibProp: `compile_multilib: "first",`,
4381 },
4382 {
4383 containedLibs: []string{"image.apex/lib64/mylib.so"},
4384 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4385 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4386 },
4387 {
4388 containedLibs: []string{"image.apex/lib64/mylib.so"},
4389 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4390 compileMultiLibProp: `compile_multilib: "64",`,
4391 },
4392 {
4393 containedLibs: []string{"image.apex/lib/mylib.so"},
4394 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4395 compileMultiLibProp: `compile_multilib: "32",`,
4396 },
4397 }
4398 for _, testCase := range testCases {
4399 ctx := testApex(t, fmt.Sprintf(`
4400 apex {
4401 name: "myapex",
4402 key: "myapex.key",
4403 %s
4404 native_shared_libs: ["mylib"],
4405 updatable: false,
4406 }
4407 apex_key {
4408 name: "myapex.key",
4409 public_key: "testkey.avbpubkey",
4410 private_key: "testkey.pem",
4411 }
4412 cc_library {
4413 name: "mylib",
4414 srcs: ["mylib.cpp"],
4415 apex_available: [
4416 "//apex_available:platform",
4417 "myapex",
4418 ],
4419 }
4420 `, testCase.compileMultiLibProp),
4421 )
4422 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4423 apexRule := module.Rule("apexRule")
4424 copyCmds := apexRule.Args["copy_commands"]
4425 for _, containedLib := range testCase.containedLibs {
4426 ensureContains(t, copyCmds, containedLib)
4427 }
4428 for _, notContainedLib := range testCase.notContainedLibs {
4429 ensureNotContains(t, copyCmds, notContainedLib)
4430 }
4431 }
4432}
4433
Alex Light0851b882019-02-07 13:20:53 -08004434func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004435 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004436 apex {
4437 name: "myapex",
4438 key: "myapex.key",
4439 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004440 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004441 }
4442
4443 apex_key {
4444 name: "myapex.key",
4445 public_key: "testkey.avbpubkey",
4446 private_key: "testkey.pem",
4447 }
4448
4449 cc_library {
4450 name: "mylib_common",
4451 srcs: ["mylib.cpp"],
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [
4455 "//apex_available:platform",
4456 "myapex",
4457 ],
Alex Light0851b882019-02-07 13:20:53 -08004458 }
4459 `)
4460
Sundong Ahnabb64432019-10-22 13:58:29 +09004461 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004462 apexRule := module.Rule("apexRule")
4463 copyCmds := apexRule.Args["copy_commands"]
4464
4465 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4466 t.Log("Apex was a test apex!")
4467 t.Fail()
4468 }
4469 // Ensure that main rule creates an output
4470 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4471
4472 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004473 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004474
4475 // Ensure that both direct and indirect deps are copied into apex
4476 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4477
Colin Cross7113d202019-11-20 16:39:12 -08004478 // Ensure that the platform variant ends with _shared
4479 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004480
Colin Cross56a83212020-09-15 18:30:11 -07004481 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004482 t.Log("Found mylib_common not in any apex!")
4483 t.Fail()
4484 }
4485}
4486
4487func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004488 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004489 apex_test {
4490 name: "myapex",
4491 key: "myapex.key",
4492 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004493 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004494 }
4495
4496 apex_key {
4497 name: "myapex.key",
4498 public_key: "testkey.avbpubkey",
4499 private_key: "testkey.pem",
4500 }
4501
4502 cc_library {
4503 name: "mylib_common_test",
4504 srcs: ["mylib.cpp"],
4505 system_shared_libs: [],
4506 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004507 // TODO: remove //apex_available:platform
4508 apex_available: [
4509 "//apex_available:platform",
4510 "myapex",
4511 ],
Alex Light0851b882019-02-07 13:20:53 -08004512 }
4513 `)
4514
Sundong Ahnabb64432019-10-22 13:58:29 +09004515 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004516 apexRule := module.Rule("apexRule")
4517 copyCmds := apexRule.Args["copy_commands"]
4518
4519 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4520 t.Log("Apex was not a test apex!")
4521 t.Fail()
4522 }
4523 // Ensure that main rule creates an output
4524 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4525
4526 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004527 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004528
4529 // Ensure that both direct and indirect deps are copied into apex
4530 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4531
Colin Cross7113d202019-11-20 16:39:12 -08004532 // Ensure that the platform variant ends with _shared
4533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004534}
4535
Alex Light9670d332019-01-29 18:07:33 -08004536func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004537 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004538 apex {
4539 name: "myapex",
4540 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004541 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004542 multilib: {
4543 first: {
4544 native_shared_libs: ["mylib_common"],
4545 }
4546 },
4547 target: {
4548 android: {
4549 multilib: {
4550 first: {
4551 native_shared_libs: ["mylib"],
4552 }
4553 }
4554 },
4555 host: {
4556 multilib: {
4557 first: {
4558 native_shared_libs: ["mylib2"],
4559 }
4560 }
4561 }
4562 }
4563 }
4564
4565 apex_key {
4566 name: "myapex.key",
4567 public_key: "testkey.avbpubkey",
4568 private_key: "testkey.pem",
4569 }
4570
4571 cc_library {
4572 name: "mylib",
4573 srcs: ["mylib.cpp"],
4574 system_shared_libs: [],
4575 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004576 // TODO: remove //apex_available:platform
4577 apex_available: [
4578 "//apex_available:platform",
4579 "myapex",
4580 ],
Alex Light9670d332019-01-29 18:07:33 -08004581 }
4582
4583 cc_library {
4584 name: "mylib_common",
4585 srcs: ["mylib.cpp"],
4586 system_shared_libs: [],
4587 stl: "none",
4588 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004589 // TODO: remove //apex_available:platform
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
Alex Light9670d332019-01-29 18:07:33 -08004594 }
4595
4596 cc_library {
4597 name: "mylib2",
4598 srcs: ["mylib.cpp"],
4599 system_shared_libs: [],
4600 stl: "none",
4601 compile_multilib: "first",
4602 }
4603 `)
4604
Sundong Ahnabb64432019-10-22 13:58:29 +09004605 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004606 copyCmds := apexRule.Args["copy_commands"]
4607
4608 // Ensure that main rule creates an output
4609 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4610
4611 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004612 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4613 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4614 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004615
4616 // Ensure that both direct and indirect deps are copied into apex
4617 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4618 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4619 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4620
Colin Cross7113d202019-11-20 16:39:12 -08004621 // Ensure that the platform variant ends with _shared
4622 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4623 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4624 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004625}
Jiyong Park04480cf2019-02-06 00:16:29 +09004626
Jiyong Park59140302020-12-14 18:44:04 +09004627func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004628 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004629 apex {
4630 name: "myapex",
4631 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004632 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004633 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004634 arch: {
4635 arm64: {
4636 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004637 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004638 },
4639 x86_64: {
4640 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004641 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004642 },
4643 }
4644 }
4645
4646 apex_key {
4647 name: "myapex.key",
4648 public_key: "testkey.avbpubkey",
4649 private_key: "testkey.pem",
4650 }
4651
4652 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004653 name: "mylib.generic",
4654 srcs: ["mylib.cpp"],
4655 system_shared_libs: [],
4656 stl: "none",
4657 // TODO: remove //apex_available:platform
4658 apex_available: [
4659 "//apex_available:platform",
4660 "myapex",
4661 ],
4662 }
4663
4664 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004665 name: "mylib.arm64",
4666 srcs: ["mylib.cpp"],
4667 system_shared_libs: [],
4668 stl: "none",
4669 // TODO: remove //apex_available:platform
4670 apex_available: [
4671 "//apex_available:platform",
4672 "myapex",
4673 ],
4674 }
4675
4676 cc_library {
4677 name: "mylib.x64",
4678 srcs: ["mylib.cpp"],
4679 system_shared_libs: [],
4680 stl: "none",
4681 // TODO: remove //apex_available:platform
4682 apex_available: [
4683 "//apex_available:platform",
4684 "myapex",
4685 ],
4686 }
4687 `)
4688
4689 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4690 copyCmds := apexRule.Args["copy_commands"]
4691
4692 // Ensure that apex variant is created for the direct dep
4693 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004694 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004695 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4696
4697 // Ensure that both direct and indirect deps are copied into apex
4698 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4699 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4700}
4701
Jiyong Park04480cf2019-02-06 00:16:29 +09004702func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004703 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004704 apex {
4705 name: "myapex",
4706 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004707 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004708 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004709 }
4710
4711 apex_key {
4712 name: "myapex.key",
4713 public_key: "testkey.avbpubkey",
4714 private_key: "testkey.pem",
4715 }
4716
4717 sh_binary {
4718 name: "myscript",
4719 src: "mylib.cpp",
4720 filename: "myscript.sh",
4721 sub_dir: "script",
4722 }
4723 `)
4724
Sundong Ahnabb64432019-10-22 13:58:29 +09004725 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004726 copyCmds := apexRule.Args["copy_commands"]
4727
4728 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4729}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004730
Jooyung Han91df2082019-11-20 01:49:42 +09004731func TestApexInVariousPartition(t *testing.T) {
4732 testcases := []struct {
4733 propName, parition, flattenedPartition string
4734 }{
4735 {"", "system", "system_ext"},
4736 {"product_specific: true", "product", "product"},
4737 {"soc_specific: true", "vendor", "vendor"},
4738 {"proprietary: true", "vendor", "vendor"},
4739 {"vendor: true", "vendor", "vendor"},
4740 {"system_ext_specific: true", "system_ext", "system_ext"},
4741 }
4742 for _, tc := range testcases {
4743 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004744 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004745 apex {
4746 name: "myapex",
4747 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004748 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004749 `+tc.propName+`
4750 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004751
Jooyung Han91df2082019-11-20 01:49:42 +09004752 apex_key {
4753 name: "myapex.key",
4754 public_key: "testkey.avbpubkey",
4755 private_key: "testkey.pem",
4756 }
4757 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004758
Jooyung Han91df2082019-11-20 01:49:42 +09004759 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004760 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4761 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004762 if actual != expected {
4763 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4764 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004765
Jooyung Han91df2082019-11-20 01:49:42 +09004766 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004767 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4768 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004769 if actual != expected {
4770 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4771 }
4772 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004773 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004774}
Jiyong Park67882562019-03-21 01:11:21 +09004775
Jooyung Han580eb4f2020-06-24 19:33:06 +09004776func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004777 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004778 apex {
4779 name: "myapex",
4780 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004781 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004782 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004783
Jooyung Han580eb4f2020-06-24 19:33:06 +09004784 apex_key {
4785 name: "myapex.key",
4786 public_key: "testkey.avbpubkey",
4787 private_key: "testkey.pem",
4788 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004789 `)
4790 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004791 rule := module.Output("file_contexts")
4792 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4793}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004794
Jooyung Han580eb4f2020-06-24 19:33:06 +09004795func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004796 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004797 apex {
4798 name: "myapex",
4799 key: "myapex.key",
4800 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004801 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004802 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004803
Jooyung Han580eb4f2020-06-24 19:33:06 +09004804 apex_key {
4805 name: "myapex.key",
4806 public_key: "testkey.avbpubkey",
4807 private_key: "testkey.pem",
4808 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004809 `, withFiles(map[string][]byte{
4810 "my_own_file_contexts": nil,
4811 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004812}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004813
Jooyung Han580eb4f2020-06-24 19:33:06 +09004814func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004815 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816 apex {
4817 name: "myapex",
4818 key: "myapex.key",
4819 product_specific: true,
4820 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004821 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004822 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004823
Jooyung Han580eb4f2020-06-24 19:33:06 +09004824 apex_key {
4825 name: "myapex.key",
4826 public_key: "testkey.avbpubkey",
4827 private_key: "testkey.pem",
4828 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004829 `)
4830
Colin Cross1c460562021-02-16 17:55:47 -08004831 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832 apex {
4833 name: "myapex",
4834 key: "myapex.key",
4835 product_specific: true,
4836 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004837 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004838 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004839
Jooyung Han580eb4f2020-06-24 19:33:06 +09004840 apex_key {
4841 name: "myapex.key",
4842 public_key: "testkey.avbpubkey",
4843 private_key: "testkey.pem",
4844 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004845 `, withFiles(map[string][]byte{
4846 "product_specific_file_contexts": nil,
4847 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004848 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4849 rule := module.Output("file_contexts")
4850 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4851}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004852
Jooyung Han580eb4f2020-06-24 19:33:06 +09004853func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004854 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004855 apex {
4856 name: "myapex",
4857 key: "myapex.key",
4858 product_specific: true,
4859 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004860 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004861 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004862
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863 apex_key {
4864 name: "myapex.key",
4865 public_key: "testkey.avbpubkey",
4866 private_key: "testkey.pem",
4867 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004868
Jooyung Han580eb4f2020-06-24 19:33:06 +09004869 filegroup {
4870 name: "my-file-contexts",
4871 srcs: ["product_specific_file_contexts"],
4872 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004873 `, withFiles(map[string][]byte{
4874 "product_specific_file_contexts": nil,
4875 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004876 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4877 rule := module.Output("file_contexts")
4878 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004879}
4880
Jiyong Park67882562019-03-21 01:11:21 +09004881func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004882 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004883 apex_key {
4884 name: "myapex.key",
4885 public_key: ":my.avbpubkey",
4886 private_key: ":my.pem",
4887 product_specific: true,
4888 }
4889
4890 filegroup {
4891 name: "my.avbpubkey",
4892 srcs: ["testkey2.avbpubkey"],
4893 }
4894
4895 filegroup {
4896 name: "my.pem",
4897 srcs: ["testkey2.pem"],
4898 }
4899 `)
4900
4901 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4902 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004903 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004904 if actual_pubkey != expected_pubkey {
4905 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4906 }
4907 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004908 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004909 if actual_privkey != expected_privkey {
4910 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4911 }
4912}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004913
4914func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004915 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004916 prebuilt_apex {
4917 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004918 arch: {
4919 arm64: {
4920 src: "myapex-arm64.apex",
4921 },
4922 arm: {
4923 src: "myapex-arm.apex",
4924 },
4925 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004926 }
4927 `)
4928
Wei Li340ee8e2022-03-18 17:33:24 -07004929 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4930 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004931
Jiyong Parkc95714e2019-03-29 14:23:10 +09004932 expectedInput := "myapex-arm64.apex"
4933 if prebuilt.inputApex.String() != expectedInput {
4934 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4935 }
Wei Li340ee8e2022-03-18 17:33:24 -07004936 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4937 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4938 rule := testingModule.Rule("genProvenanceMetaData")
4939 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4940 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4941 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4942 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004943
4944 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4945 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004946}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004947
Paul Duffinc0609c62021-03-01 17:27:16 +00004948func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004949 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004950 prebuilt_apex {
4951 name: "myapex",
4952 }
4953 `)
4954}
4955
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004956func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004957 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004958 prebuilt_apex {
4959 name: "myapex",
4960 src: "myapex-arm.apex",
4961 filename: "notmyapex.apex",
4962 }
4963 `)
4964
Wei Li340ee8e2022-03-18 17:33:24 -07004965 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4966 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004967
4968 expected := "notmyapex.apex"
4969 if p.installFilename != expected {
4970 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4971 }
Wei Li340ee8e2022-03-18 17:33:24 -07004972 rule := testingModule.Rule("genProvenanceMetaData")
4973 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4974 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4975 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4976 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004977}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004978
Samiul Islam7c02e262021-09-08 17:48:28 +01004979func TestApexSetFilenameOverride(t *testing.T) {
4980 testApex(t, `
4981 apex_set {
4982 name: "com.company.android.myapex",
4983 apex_name: "com.android.myapex",
4984 set: "company-myapex.apks",
4985 filename: "com.company.android.myapex.apex"
4986 }
4987 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4988
4989 testApex(t, `
4990 apex_set {
4991 name: "com.company.android.myapex",
4992 apex_name: "com.android.myapex",
4993 set: "company-myapex.apks",
4994 filename: "com.company.android.myapex.capex"
4995 }
4996 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4997
4998 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4999 apex_set {
5000 name: "com.company.android.myapex",
5001 apex_name: "com.android.myapex",
5002 set: "company-myapex.apks",
5003 filename: "some-random-suffix"
5004 }
5005 `)
5006}
5007
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005008func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005009 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005010 prebuilt_apex {
5011 name: "myapex.prebuilt",
5012 src: "myapex-arm.apex",
5013 overrides: [
5014 "myapex",
5015 ],
5016 }
5017 `)
5018
Wei Li340ee8e2022-03-18 17:33:24 -07005019 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5020 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005021
5022 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005023 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005024 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005025 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005026 }
Wei Li340ee8e2022-03-18 17:33:24 -07005027 rule := testingModule.Rule("genProvenanceMetaData")
5028 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5029 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5030 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5031 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005032}
5033
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005034func TestPrebuiltApexName(t *testing.T) {
5035 testApex(t, `
5036 prebuilt_apex {
5037 name: "com.company.android.myapex",
5038 apex_name: "com.android.myapex",
5039 src: "company-myapex-arm.apex",
5040 }
5041 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5042
5043 testApex(t, `
5044 apex_set {
5045 name: "com.company.android.myapex",
5046 apex_name: "com.android.myapex",
5047 set: "company-myapex.apks",
5048 }
5049 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5050}
5051
5052func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5053 _ = android.GroupFixturePreparers(
5054 java.PrepareForTestWithJavaDefaultModules,
5055 PrepareForTestWithApexBuildComponents,
5056 android.FixtureWithRootAndroidBp(`
5057 platform_bootclasspath {
5058 name: "platform-bootclasspath",
5059 fragments: [
5060 {
5061 apex: "com.android.art",
5062 module: "art-bootclasspath-fragment",
5063 },
5064 ],
5065 }
5066
5067 prebuilt_apex {
5068 name: "com.company.android.art",
5069 apex_name: "com.android.art",
5070 src: "com.company.android.art-arm.apex",
5071 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5072 }
5073
5074 prebuilt_bootclasspath_fragment {
5075 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005076 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005077 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005078 hidden_api: {
5079 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5080 metadata: "my-bootclasspath-fragment/metadata.csv",
5081 index: "my-bootclasspath-fragment/index.csv",
5082 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5083 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5084 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005085 }
5086
5087 java_import {
5088 name: "core-oj",
5089 jars: ["prebuilt.jar"],
5090 }
5091 `),
5092 ).RunTest(t)
5093}
5094
Paul Duffin092153d2021-01-26 11:42:39 +00005095// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5096// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005097func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005098 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005099
Paul Duffin89886cb2021-02-05 16:44:03 +00005100 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005101 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005102 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005103 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005104 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005105 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005106 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5107 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5108 android.NormalizePathForTesting(dexJarBuildPath))
5109 }
5110
5111 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005112 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005113 // Make sure the import has been given the correct path to the dex jar.
5114 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5115 dexJarBuildPath := p.DexJarInstallPath()
5116 stem := android.RemoveOptionalPrebuiltPrefix(name)
5117 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5118 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5119 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005120 }
5121
Paul Duffin39853512021-02-26 11:09:39 +00005122 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005123 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005124 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005125 android.AssertArrayString(t, "Check if there is no source variant",
5126 []string{"android_common"},
5127 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005128 }
5129
5130 t.Run("prebuilt only", func(t *testing.T) {
5131 bp := `
5132 prebuilt_apex {
5133 name: "myapex",
5134 arch: {
5135 arm64: {
5136 src: "myapex-arm64.apex",
5137 },
5138 arm: {
5139 src: "myapex-arm.apex",
5140 },
5141 },
Paul Duffin39853512021-02-26 11:09:39 +00005142 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005143 }
5144
5145 java_import {
5146 name: "libfoo",
5147 jars: ["libfoo.jar"],
5148 }
Paul Duffin39853512021-02-26 11:09:39 +00005149
5150 java_sdk_library_import {
5151 name: "libbar",
5152 public: {
5153 jars: ["libbar.jar"],
5154 },
5155 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005156 `
5157
5158 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5159 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5160
Martin Stjernholm44825602021-09-17 01:44:12 +01005161 deapexerName := deapexerModuleName("myapex")
5162 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5163
Paul Duffinf6932af2021-02-26 18:21:56 +00005164 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005165 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005166 rule := deapexer.Rule("deapexer")
5167 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5168 t.Errorf("expected: %q, found: %q", expected, actual)
5169 }
5170
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005171 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005172 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005173 rule = prebuiltApex.Rule("android/soong/android.Cp")
5174 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5175 t.Errorf("expected: %q, found: %q", expected, actual)
5176 }
5177
Paul Duffin89886cb2021-02-05 16:44:03 +00005178 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005179 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005180
5181 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005182 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005183 })
5184
5185 t.Run("prebuilt with source preferred", func(t *testing.T) {
5186
5187 bp := `
5188 prebuilt_apex {
5189 name: "myapex",
5190 arch: {
5191 arm64: {
5192 src: "myapex-arm64.apex",
5193 },
5194 arm: {
5195 src: "myapex-arm.apex",
5196 },
5197 },
Paul Duffin39853512021-02-26 11:09:39 +00005198 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005199 }
5200
5201 java_import {
5202 name: "libfoo",
5203 jars: ["libfoo.jar"],
5204 }
5205
5206 java_library {
5207 name: "libfoo",
5208 }
Paul Duffin39853512021-02-26 11:09:39 +00005209
5210 java_sdk_library_import {
5211 name: "libbar",
5212 public: {
5213 jars: ["libbar.jar"],
5214 },
5215 }
5216
5217 java_sdk_library {
5218 name: "libbar",
5219 srcs: ["foo/bar/MyClass.java"],
5220 unsafe_ignore_missing_latest_api: true,
5221 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005222 `
5223
5224 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5225 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5226
Paul Duffin89886cb2021-02-05 16:44:03 +00005227 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005228 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005229 ensureNoSourceVariant(t, ctx, "libfoo")
5230
5231 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005232 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005233 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005234 })
5235
5236 t.Run("prebuilt preferred with source", func(t *testing.T) {
5237 bp := `
5238 prebuilt_apex {
5239 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005240 arch: {
5241 arm64: {
5242 src: "myapex-arm64.apex",
5243 },
5244 arm: {
5245 src: "myapex-arm.apex",
5246 },
5247 },
Paul Duffin39853512021-02-26 11:09:39 +00005248 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005249 }
5250
5251 java_import {
5252 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005253 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005254 jars: ["libfoo.jar"],
5255 }
5256
5257 java_library {
5258 name: "libfoo",
5259 }
Paul Duffin39853512021-02-26 11:09:39 +00005260
5261 java_sdk_library_import {
5262 name: "libbar",
5263 prefer: true,
5264 public: {
5265 jars: ["libbar.jar"],
5266 },
5267 }
5268
5269 java_sdk_library {
5270 name: "libbar",
5271 srcs: ["foo/bar/MyClass.java"],
5272 unsafe_ignore_missing_latest_api: true,
5273 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005274 `
5275
5276 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5277 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5278
Paul Duffin89886cb2021-02-05 16:44:03 +00005279 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005280 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005281 ensureNoSourceVariant(t, ctx, "libfoo")
5282
5283 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005284 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005285 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005286 })
5287}
5288
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005289func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005290 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005291 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005292 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5293 // is disabled.
5294 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5295 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005296
Paul Duffin37856732021-02-26 14:24:15 +00005297 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5298 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005299 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005300 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005301 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005302 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005303 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005304 foundLibfooJar = true
5305 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005306 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005307 }
5308 }
5309 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005310 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 +00005311 }
5312 }
5313
Paul Duffin40a3f652021-07-19 13:11:24 +01005314 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005315 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005316 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005317 var rule android.TestingBuildParams
5318
5319 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5320 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005321 }
5322
Paul Duffin40a3f652021-07-19 13:11:24 +01005323 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5324 t.Helper()
5325 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5326 var rule android.TestingBuildParams
5327
5328 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5329 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5330 }
5331
Paul Duffin89f570a2021-06-16 01:42:33 +01005332 fragment := java.ApexVariantReference{
5333 Apex: proptools.StringPtr("myapex"),
5334 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5335 }
5336
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005337 t.Run("prebuilt only", func(t *testing.T) {
5338 bp := `
5339 prebuilt_apex {
5340 name: "myapex",
5341 arch: {
5342 arm64: {
5343 src: "myapex-arm64.apex",
5344 },
5345 arm: {
5346 src: "myapex-arm.apex",
5347 },
5348 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005349 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5350 }
5351
5352 prebuilt_bootclasspath_fragment {
5353 name: "my-bootclasspath-fragment",
5354 contents: ["libfoo", "libbar"],
5355 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005356 hidden_api: {
5357 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5358 metadata: "my-bootclasspath-fragment/metadata.csv",
5359 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005360 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5361 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5362 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005363 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005364 }
5365
5366 java_import {
5367 name: "libfoo",
5368 jars: ["libfoo.jar"],
5369 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005370 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005371 }
Paul Duffin37856732021-02-26 14:24:15 +00005372
5373 java_sdk_library_import {
5374 name: "libbar",
5375 public: {
5376 jars: ["libbar.jar"],
5377 },
5378 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005379 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005380 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005381 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 `
5383
Paul Duffin89f570a2021-06-16 01:42:33 +01005384 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005385 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5386 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005387
Paul Duffin537ea3d2021-05-14 10:38:00 +01005388 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005389 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005390 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005391 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005392 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5393 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005394 })
5395
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005396 t.Run("apex_set only", func(t *testing.T) {
5397 bp := `
5398 apex_set {
5399 name: "myapex",
5400 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005401 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005403 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5404 }
5405
5406 java_import {
5407 name: "myjavalib",
5408 jars: ["myjavalib.jar"],
5409 apex_available: ["myapex"],
5410 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005411 }
5412
5413 prebuilt_bootclasspath_fragment {
5414 name: "my-bootclasspath-fragment",
5415 contents: ["libfoo", "libbar"],
5416 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005417 hidden_api: {
5418 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5419 metadata: "my-bootclasspath-fragment/metadata.csv",
5420 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005421 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5422 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5423 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005424 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005425 }
5426
Liz Kammer2dc72442023-04-20 10:10:48 -04005427 prebuilt_systemserverclasspath_fragment {
5428 name: "my-systemserverclasspath-fragment",
5429 contents: ["libbaz"],
5430 apex_available: ["myapex"],
5431 }
5432
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005433 java_import {
5434 name: "libfoo",
5435 jars: ["libfoo.jar"],
5436 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005437 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005438 }
5439
5440 java_sdk_library_import {
5441 name: "libbar",
5442 public: {
5443 jars: ["libbar.jar"],
5444 },
5445 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005446 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005447 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005448 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005449
5450 java_sdk_library_import {
5451 name: "libbaz",
5452 public: {
5453 jars: ["libbaz.jar"],
5454 },
5455 apex_available: ["myapex"],
5456 shared_library: false,
5457 permitted_packages: ["baz"],
5458 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005459 `
5460
Paul Duffin89f570a2021-06-16 01:42:33 +01005461 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005462 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5463 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5464
Paul Duffin537ea3d2021-05-14 10:38:00 +01005465 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005466 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005467 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005468 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005469 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5470 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005471
5472 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5473
5474 overrideNames := []string{
5475 "",
5476 "myjavalib.myapex",
5477 "libfoo.myapex",
5478 "libbar.myapex",
5479 "libbaz.myapex",
5480 }
5481 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5482 for i, e := range mkEntries {
5483 g := e.OverrideName
5484 if w := overrideNames[i]; w != g {
5485 t.Errorf("Expected override name %q, got %q", w, g)
5486 }
5487 }
5488
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005489 })
5490
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005491 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5492 bp := `
5493 prebuilt_apex {
5494 name: "myapex",
5495 arch: {
5496 arm64: {
5497 src: "myapex-arm64.apex",
5498 },
5499 arm: {
5500 src: "myapex-arm.apex",
5501 },
5502 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005503 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5504 }
5505
5506 prebuilt_bootclasspath_fragment {
5507 name: "my-bootclasspath-fragment",
5508 contents: ["libfoo", "libbar"],
5509 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005510 hidden_api: {
5511 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5512 metadata: "my-bootclasspath-fragment/metadata.csv",
5513 index: "my-bootclasspath-fragment/index.csv",
5514 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5515 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5516 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005517 }
5518
5519 java_import {
5520 name: "libfoo",
5521 jars: ["libfoo.jar"],
5522 apex_available: ["myapex"],
5523 }
5524
5525 java_library {
5526 name: "libfoo",
5527 srcs: ["foo/bar/MyClass.java"],
5528 apex_available: ["myapex"],
5529 }
Paul Duffin37856732021-02-26 14:24:15 +00005530
5531 java_sdk_library_import {
5532 name: "libbar",
5533 public: {
5534 jars: ["libbar.jar"],
5535 },
5536 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005537 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005538 }
5539
5540 java_sdk_library {
5541 name: "libbar",
5542 srcs: ["foo/bar/MyClass.java"],
5543 unsafe_ignore_missing_latest_api: true,
5544 apex_available: ["myapex"],
5545 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005546 `
5547
5548 // In this test the source (java_library) libfoo is active since the
5549 // prebuilt (java_import) defaults to prefer:false. However the
5550 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5551 // find the dex boot jar in it. We either need to disable the source libfoo
5552 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005553 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005554 // dexbootjar check is skipped if AllowMissingDependencies is true
5555 preparerAllowMissingDeps := android.GroupFixturePreparers(
5556 preparer,
5557 android.PrepareForTestWithAllowMissingDependencies,
5558 )
5559 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005560 })
5561
5562 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5563 bp := `
5564 prebuilt_apex {
5565 name: "myapex",
5566 arch: {
5567 arm64: {
5568 src: "myapex-arm64.apex",
5569 },
5570 arm: {
5571 src: "myapex-arm.apex",
5572 },
5573 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005574 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5575 }
5576
5577 prebuilt_bootclasspath_fragment {
5578 name: "my-bootclasspath-fragment",
5579 contents: ["libfoo", "libbar"],
5580 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005581 hidden_api: {
5582 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5583 metadata: "my-bootclasspath-fragment/metadata.csv",
5584 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005585 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5586 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5587 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005588 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 }
5590
5591 java_import {
5592 name: "libfoo",
5593 prefer: true,
5594 jars: ["libfoo.jar"],
5595 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005596 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005597 }
5598
5599 java_library {
5600 name: "libfoo",
5601 srcs: ["foo/bar/MyClass.java"],
5602 apex_available: ["myapex"],
5603 }
Paul Duffin37856732021-02-26 14:24:15 +00005604
5605 java_sdk_library_import {
5606 name: "libbar",
5607 prefer: true,
5608 public: {
5609 jars: ["libbar.jar"],
5610 },
5611 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005612 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005613 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005614 }
5615
5616 java_sdk_library {
5617 name: "libbar",
5618 srcs: ["foo/bar/MyClass.java"],
5619 unsafe_ignore_missing_latest_api: true,
5620 apex_available: ["myapex"],
5621 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005622 `
5623
Paul Duffin89f570a2021-06-16 01:42:33 +01005624 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005625 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5626 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005627
Paul Duffin537ea3d2021-05-14 10:38:00 +01005628 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005629 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005630 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005631 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005632 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5633 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 })
5635
5636 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5637 bp := `
5638 apex {
5639 name: "myapex",
5640 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005641 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005642 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643 }
5644
5645 apex_key {
5646 name: "myapex.key",
5647 public_key: "testkey.avbpubkey",
5648 private_key: "testkey.pem",
5649 }
5650
5651 prebuilt_apex {
5652 name: "myapex",
5653 arch: {
5654 arm64: {
5655 src: "myapex-arm64.apex",
5656 },
5657 arm: {
5658 src: "myapex-arm.apex",
5659 },
5660 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005661 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5662 }
5663
5664 prebuilt_bootclasspath_fragment {
5665 name: "my-bootclasspath-fragment",
5666 contents: ["libfoo", "libbar"],
5667 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005668 hidden_api: {
5669 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5670 metadata: "my-bootclasspath-fragment/metadata.csv",
5671 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005672 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5673 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5674 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005675 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005676 }
5677
5678 java_import {
5679 name: "libfoo",
5680 jars: ["libfoo.jar"],
5681 apex_available: ["myapex"],
5682 }
5683
5684 java_library {
5685 name: "libfoo",
5686 srcs: ["foo/bar/MyClass.java"],
5687 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005688 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005689 }
Paul Duffin37856732021-02-26 14:24:15 +00005690
5691 java_sdk_library_import {
5692 name: "libbar",
5693 public: {
5694 jars: ["libbar.jar"],
5695 },
5696 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005697 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005698 }
5699
5700 java_sdk_library {
5701 name: "libbar",
5702 srcs: ["foo/bar/MyClass.java"],
5703 unsafe_ignore_missing_latest_api: true,
5704 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005705 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005706 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005707 `
5708
Paul Duffin89f570a2021-06-16 01:42:33 +01005709 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005710 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5711 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005712
Paul Duffin537ea3d2021-05-14 10:38:00 +01005713 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005714 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005715 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005716 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005717 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5718 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005719 })
5720
5721 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5722 bp := `
5723 apex {
5724 name: "myapex",
5725 enabled: false,
5726 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005727 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005728 }
5729
5730 apex_key {
5731 name: "myapex.key",
5732 public_key: "testkey.avbpubkey",
5733 private_key: "testkey.pem",
5734 }
5735
5736 prebuilt_apex {
5737 name: "myapex",
5738 arch: {
5739 arm64: {
5740 src: "myapex-arm64.apex",
5741 },
5742 arm: {
5743 src: "myapex-arm.apex",
5744 },
5745 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005746 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5747 }
5748
5749 prebuilt_bootclasspath_fragment {
5750 name: "my-bootclasspath-fragment",
5751 contents: ["libfoo", "libbar"],
5752 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005753 hidden_api: {
5754 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5755 metadata: "my-bootclasspath-fragment/metadata.csv",
5756 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005757 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5758 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5759 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005760 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005761 }
5762
5763 java_import {
5764 name: "libfoo",
5765 prefer: true,
5766 jars: ["libfoo.jar"],
5767 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005768 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005769 }
5770
5771 java_library {
5772 name: "libfoo",
5773 srcs: ["foo/bar/MyClass.java"],
5774 apex_available: ["myapex"],
5775 }
Paul Duffin37856732021-02-26 14:24:15 +00005776
5777 java_sdk_library_import {
5778 name: "libbar",
5779 prefer: true,
5780 public: {
5781 jars: ["libbar.jar"],
5782 },
5783 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005784 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005785 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005786 }
5787
5788 java_sdk_library {
5789 name: "libbar",
5790 srcs: ["foo/bar/MyClass.java"],
5791 unsafe_ignore_missing_latest_api: true,
5792 apex_available: ["myapex"],
5793 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005794 `
5795
Paul Duffin89f570a2021-06-16 01:42:33 +01005796 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005797 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5798 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005799
Paul Duffin537ea3d2021-05-14 10:38:00 +01005800 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005801 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005802 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005803 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005804 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5805 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005806 })
5807}
5808
Roland Levillain630846d2019-06-26 12:48:34 +01005809func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005810 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005811 apex_test {
5812 name: "myapex",
5813 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005814 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005815 tests: [
5816 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005817 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005818 ],
5819 }
5820
5821 apex_key {
5822 name: "myapex.key",
5823 public_key: "testkey.avbpubkey",
5824 private_key: "testkey.pem",
5825 }
5826
Liz Kammer1c14a212020-05-12 15:26:55 -07005827 filegroup {
5828 name: "fg",
5829 srcs: [
5830 "baz",
5831 "bar/baz"
5832 ],
5833 }
5834
Roland Levillain630846d2019-06-26 12:48:34 +01005835 cc_test {
5836 name: "mytest",
5837 gtest: false,
5838 srcs: ["mytest.cpp"],
5839 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005840 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005841 system_shared_libs: [],
5842 static_executable: true,
5843 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005844 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005845 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005846
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005847 cc_library {
5848 name: "mylib",
5849 srcs: ["mylib.cpp"],
5850 system_shared_libs: [],
5851 stl: "none",
5852 }
5853
Liz Kammer5bd365f2020-05-27 15:15:11 -07005854 filegroup {
5855 name: "fg2",
5856 srcs: [
5857 "testdata/baz"
5858 ],
5859 }
5860
Roland Levillain9b5fde92019-06-28 15:41:19 +01005861 cc_test {
5862 name: "mytests",
5863 gtest: false,
5864 srcs: [
5865 "mytest1.cpp",
5866 "mytest2.cpp",
5867 "mytest3.cpp",
5868 ],
5869 test_per_src: true,
5870 relative_install_path: "test",
5871 system_shared_libs: [],
5872 static_executable: true,
5873 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005874 data: [
5875 ":fg",
5876 ":fg2",
5877 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005878 }
Roland Levillain630846d2019-06-26 12:48:34 +01005879 `)
5880
Sundong Ahnabb64432019-10-22 13:58:29 +09005881 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005882 copyCmds := apexRule.Args["copy_commands"]
5883
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005884 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005885 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005886 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005887
Liz Kammer1c14a212020-05-12 15:26:55 -07005888 //Ensure that test data are copied into apex.
5889 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5890 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5891
Roland Levillain9b5fde92019-06-28 15:41:19 +01005892 // Ensure that test deps built with `test_per_src` are copied into apex.
5893 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5894 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5895 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005896
5897 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005898 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005899 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005900 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005901 prefix := "TARGET_"
5902 var builder strings.Builder
5903 data.Custom(&builder, name, prefix, "", data)
5904 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005905 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5906 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5907 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5908 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5909 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5910 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005911 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005912
5913 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005914 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005915 data.Custom(&builder, name, prefix, "", data)
5916 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005917 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5918 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005919}
5920
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005921func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005922 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005923 apex {
5924 name: "myapex",
5925 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005926 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005927 }
5928 apex_key {
5929 name: "myapex.key",
5930 public_key: "testkey.avbpubkey",
5931 private_key: "testkey.pem",
5932 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005933 `,
5934 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5935 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5936 }),
5937 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005938 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005939 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005940 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005941 var builder strings.Builder
5942 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5943 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005944 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005945}
5946
Jooyung Hand48f3c32019-08-23 11:18:57 +09005947func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5948 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5949 apex {
5950 name: "myapex",
5951 key: "myapex.key",
5952 native_shared_libs: ["libfoo"],
5953 }
5954
5955 apex_key {
5956 name: "myapex.key",
5957 public_key: "testkey.avbpubkey",
5958 private_key: "testkey.pem",
5959 }
5960
5961 cc_library {
5962 name: "libfoo",
5963 stl: "none",
5964 system_shared_libs: [],
5965 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005966 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005967 }
5968 `)
5969 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5970 apex {
5971 name: "myapex",
5972 key: "myapex.key",
5973 java_libs: ["myjar"],
5974 }
5975
5976 apex_key {
5977 name: "myapex.key",
5978 public_key: "testkey.avbpubkey",
5979 private_key: "testkey.pem",
5980 }
5981
5982 java_library {
5983 name: "myjar",
5984 srcs: ["foo/bar/MyClass.java"],
5985 sdk_version: "none",
5986 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005987 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005988 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005989 }
5990 `)
5991}
5992
Bill Peckhama41a6962021-01-11 10:58:54 -08005993func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005994 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005995 apex {
5996 name: "myapex",
5997 key: "myapex.key",
5998 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005999 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006000 }
6001
6002 apex_key {
6003 name: "myapex.key",
6004 public_key: "testkey.avbpubkey",
6005 private_key: "testkey.pem",
6006 }
6007
6008 java_import {
6009 name: "myjavaimport",
6010 apex_available: ["myapex"],
6011 jars: ["my.jar"],
6012 compile_dex: true,
6013 }
6014 `)
6015
6016 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6017 apexRule := module.Rule("apexRule")
6018 copyCmds := apexRule.Args["copy_commands"]
6019 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6020}
6021
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006022func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006023 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006024 apex {
6025 name: "myapex",
6026 key: "myapex.key",
6027 apps: [
6028 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006029 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006030 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006031 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006032 }
6033
6034 apex_key {
6035 name: "myapex.key",
6036 public_key: "testkey.avbpubkey",
6037 private_key: "testkey.pem",
6038 }
6039
6040 android_app {
6041 name: "AppFoo",
6042 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006043 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006044 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006045 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006046 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006047 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006048 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006049
6050 android_app {
6051 name: "AppFooPriv",
6052 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006053 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006054 system_modules: "none",
6055 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08006056 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006057 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006058 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006059
6060 cc_library_shared {
6061 name: "libjni",
6062 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006063 shared_libs: ["libfoo"],
6064 stl: "none",
6065 system_shared_libs: [],
6066 apex_available: [ "myapex" ],
6067 sdk_version: "current",
6068 }
6069
6070 cc_library_shared {
6071 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006072 stl: "none",
6073 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006074 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006075 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006076 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006077 `)
6078
Sundong Ahnabb64432019-10-22 13:58:29 +09006079 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006080 apexRule := module.Rule("apexRule")
6081 copyCmds := apexRule.Args["copy_commands"]
6082
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006083 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6084 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006085
Colin Crossaede88c2020-08-11 12:17:01 -07006086 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006087 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006088 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006089 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006090 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006091 // JNI libraries including transitive deps are
6092 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006093 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006094 // ... embedded inside APK (jnilibs.zip)
6095 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6096 // ... and not directly inside the APEX
6097 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6098 }
Dario Frenicde2a032019-10-27 00:29:22 +01006099}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006100
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006101func TestApexWithAppImportBuildId(t *testing.T) {
6102 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6103 for _, id := range invalidBuildIds {
6104 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6105 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6106 variables.BuildId = proptools.StringPtr(id)
6107 })
6108 testApexError(t, message, `apex {
6109 name: "myapex",
6110 key: "myapex.key",
6111 apps: ["AppFooPrebuilt"],
6112 updatable: false,
6113 }
6114
6115 apex_key {
6116 name: "myapex.key",
6117 public_key: "testkey.avbpubkey",
6118 private_key: "testkey.pem",
6119 }
6120
6121 android_app_import {
6122 name: "AppFooPrebuilt",
6123 apk: "PrebuiltAppFoo.apk",
6124 presigned: true,
6125 apex_available: ["myapex"],
6126 }
6127 `, fixture)
6128 }
6129}
6130
Dario Frenicde2a032019-10-27 00:29:22 +01006131func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006132 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006133 apex {
6134 name: "myapex",
6135 key: "myapex.key",
6136 apps: [
6137 "AppFooPrebuilt",
6138 "AppFooPrivPrebuilt",
6139 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006140 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006141 }
6142
6143 apex_key {
6144 name: "myapex.key",
6145 public_key: "testkey.avbpubkey",
6146 private_key: "testkey.pem",
6147 }
6148
6149 android_app_import {
6150 name: "AppFooPrebuilt",
6151 apk: "PrebuiltAppFoo.apk",
6152 presigned: true,
6153 dex_preopt: {
6154 enabled: false,
6155 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006156 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006157 }
6158
6159 android_app_import {
6160 name: "AppFooPrivPrebuilt",
6161 apk: "PrebuiltAppFooPriv.apk",
6162 privileged: true,
6163 presigned: true,
6164 dex_preopt: {
6165 enabled: false,
6166 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006167 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006168 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006169 }
6170 `)
6171
Sundong Ahnabb64432019-10-22 13:58:29 +09006172 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006173 apexRule := module.Rule("apexRule")
6174 copyCmds := apexRule.Args["copy_commands"]
6175
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006176 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6177 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006178}
6179
6180func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006181 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006182 apex {
6183 name: "myapex",
6184 key: "myapex.key",
6185 apps: [
6186 "AppFoo",
6187 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006188 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006189 }
6190
6191 apex_key {
6192 name: "myapex.key",
6193 public_key: "testkey.avbpubkey",
6194 private_key: "testkey.pem",
6195 }
6196
6197 android_app {
6198 name: "AppFoo",
6199 srcs: ["foo/bar/MyClass.java"],
6200 sdk_version: "none",
6201 system_modules: "none",
6202 apex_available: [ "myapex" ],
6203 }
6204
6205 android_app_import {
6206 name: "AppFoo",
6207 apk: "AppFooPrebuilt.apk",
6208 filename: "AppFooPrebuilt.apk",
6209 presigned: true,
6210 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006211 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006212 }
6213 `, withFiles(map[string][]byte{
6214 "AppFooPrebuilt.apk": nil,
6215 }))
6216
6217 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006218 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006219 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006220}
6221
Dario Freni6f3937c2019-12-20 22:58:03 +00006222func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006223 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006224 apex {
6225 name: "myapex",
6226 key: "myapex.key",
6227 apps: [
6228 "TesterHelpAppFoo",
6229 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006230 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006231 }
6232
6233 apex_key {
6234 name: "myapex.key",
6235 public_key: "testkey.avbpubkey",
6236 private_key: "testkey.pem",
6237 }
6238
6239 android_test_helper_app {
6240 name: "TesterHelpAppFoo",
6241 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006242 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006243 }
6244
6245 `)
6246
6247 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6248 apexRule := module.Rule("apexRule")
6249 copyCmds := apexRule.Args["copy_commands"]
6250
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006251 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006252}
6253
Jooyung Han18020ea2019-11-13 10:50:48 +09006254func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6255 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006256 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006257 apex {
6258 name: "myapex",
6259 key: "myapex.key",
6260 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006261 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006262 }
6263
6264 apex_key {
6265 name: "myapex.key",
6266 public_key: "testkey.avbpubkey",
6267 private_key: "testkey.pem",
6268 }
6269
6270 apex {
6271 name: "otherapex",
6272 key: "myapex.key",
6273 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006274 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006275 }
6276
6277 cc_defaults {
6278 name: "libfoo-defaults",
6279 apex_available: ["otherapex"],
6280 }
6281
6282 cc_library {
6283 name: "libfoo",
6284 defaults: ["libfoo-defaults"],
6285 stl: "none",
6286 system_shared_libs: [],
6287 }`)
6288}
6289
Paul Duffine52e66f2020-03-30 17:54:29 +01006290func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006291 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006292 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006293 apex {
6294 name: "myapex",
6295 key: "myapex.key",
6296 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006297 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006298 }
6299
6300 apex_key {
6301 name: "myapex.key",
6302 public_key: "testkey.avbpubkey",
6303 private_key: "testkey.pem",
6304 }
6305
6306 apex {
6307 name: "otherapex",
6308 key: "otherapex.key",
6309 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006310 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006311 }
6312
6313 apex_key {
6314 name: "otherapex.key",
6315 public_key: "testkey.avbpubkey",
6316 private_key: "testkey.pem",
6317 }
6318
6319 cc_library {
6320 name: "libfoo",
6321 stl: "none",
6322 system_shared_libs: [],
6323 apex_available: ["otherapex"],
6324 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006325}
Jiyong Park127b40b2019-09-30 16:04:35 +09006326
Paul Duffine52e66f2020-03-30 17:54:29 +01006327func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006328 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006329 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006330.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006331.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006332.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006333.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006334.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006335.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006336 apex {
6337 name: "myapex",
6338 key: "myapex.key",
6339 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006340 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006341 }
6342
6343 apex_key {
6344 name: "myapex.key",
6345 public_key: "testkey.avbpubkey",
6346 private_key: "testkey.pem",
6347 }
6348
Jiyong Park127b40b2019-09-30 16:04:35 +09006349 cc_library {
6350 name: "libfoo",
6351 stl: "none",
6352 shared_libs: ["libbar"],
6353 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006354 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006355 }
6356
6357 cc_library {
6358 name: "libbar",
6359 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006360 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006361 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006362 apex_available: ["myapex"],
6363 }
6364
6365 cc_library {
6366 name: "libbaz",
6367 stl: "none",
6368 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006369 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006370}
Jiyong Park127b40b2019-09-30 16:04:35 +09006371
Paul Duffine52e66f2020-03-30 17:54:29 +01006372func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006373 testApexError(t, "\"otherapex\" is not a valid module name", `
6374 apex {
6375 name: "myapex",
6376 key: "myapex.key",
6377 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006378 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006379 }
6380
6381 apex_key {
6382 name: "myapex.key",
6383 public_key: "testkey.avbpubkey",
6384 private_key: "testkey.pem",
6385 }
6386
6387 cc_library {
6388 name: "libfoo",
6389 stl: "none",
6390 system_shared_libs: [],
6391 apex_available: ["otherapex"],
6392 }`)
6393
Paul Duffine52e66f2020-03-30 17:54:29 +01006394 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006395 apex {
6396 name: "myapex",
6397 key: "myapex.key",
6398 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006399 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006400 }
6401
6402 apex_key {
6403 name: "myapex.key",
6404 public_key: "testkey.avbpubkey",
6405 private_key: "testkey.pem",
6406 }
6407
6408 cc_library {
6409 name: "libfoo",
6410 stl: "none",
6411 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006412 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006413 apex_available: ["myapex"],
6414 }
6415
6416 cc_library {
6417 name: "libbar",
6418 stl: "none",
6419 system_shared_libs: [],
6420 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006421 }
6422
6423 cc_library {
6424 name: "libbaz",
6425 stl: "none",
6426 system_shared_libs: [],
6427 stubs: {
6428 versions: ["10", "20", "30"],
6429 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006430 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006431}
Jiyong Park127b40b2019-09-30 16:04:35 +09006432
Jiyong Park89e850a2020-04-07 16:37:39 +09006433func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006434 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006435 apex {
6436 name: "myapex",
6437 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006438 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006439 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006440 }
6441
6442 apex_key {
6443 name: "myapex.key",
6444 public_key: "testkey.avbpubkey",
6445 private_key: "testkey.pem",
6446 }
6447
6448 cc_library {
6449 name: "libfoo",
6450 stl: "none",
6451 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006452 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006453 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006454 }
6455
6456 cc_library {
6457 name: "libfoo2",
6458 stl: "none",
6459 system_shared_libs: [],
6460 shared_libs: ["libbaz"],
6461 apex_available: ["//apex_available:platform"],
6462 }
6463
6464 cc_library {
6465 name: "libbar",
6466 stl: "none",
6467 system_shared_libs: [],
6468 apex_available: ["myapex"],
6469 }
6470
6471 cc_library {
6472 name: "libbaz",
6473 stl: "none",
6474 system_shared_libs: [],
6475 apex_available: ["myapex"],
6476 stubs: {
6477 versions: ["1"],
6478 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006479 }`)
6480
Jiyong Park89e850a2020-04-07 16:37:39 +09006481 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6482 // because it depends on libbar which isn't available to platform
6483 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6484 if libfoo.NotAvailableForPlatform() != true {
6485 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6486 }
6487
6488 // libfoo2 however can be available to platform because it depends on libbaz which provides
6489 // stubs
6490 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6491 if libfoo2.NotAvailableForPlatform() == true {
6492 t.Errorf("%q should be available to platform", libfoo2.String())
6493 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006494}
Jiyong Parka90ca002019-10-07 15:47:24 +09006495
Paul Duffine52e66f2020-03-30 17:54:29 +01006496func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006497 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006498 apex {
6499 name: "myapex",
6500 key: "myapex.key",
6501 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006502 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006503 }
6504
6505 apex_key {
6506 name: "myapex.key",
6507 public_key: "testkey.avbpubkey",
6508 private_key: "testkey.pem",
6509 }
6510
6511 cc_library {
6512 name: "libfoo",
6513 stl: "none",
6514 system_shared_libs: [],
6515 apex_available: ["myapex"],
6516 static: {
6517 apex_available: ["//apex_available:platform"],
6518 },
6519 }`)
6520
Jiyong Park89e850a2020-04-07 16:37:39 +09006521 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6522 if libfooShared.NotAvailableForPlatform() != true {
6523 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6524 }
6525 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6526 if libfooStatic.NotAvailableForPlatform() != false {
6527 t.Errorf("%q should be available to platform", libfooStatic.String())
6528 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006529}
6530
Jiyong Park5d790c32019-11-15 18:40:32 +09006531func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006532 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006533 apex {
6534 name: "myapex",
6535 key: "myapex.key",
6536 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006537 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006538 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006539 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006540 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006541 }
6542
6543 override_apex {
6544 name: "override_myapex",
6545 base: "myapex",
6546 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006547 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006548 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006549 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006550 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006551 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006552 key: "mynewapex.key",
6553 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006554 }
6555
6556 apex_key {
6557 name: "myapex.key",
6558 public_key: "testkey.avbpubkey",
6559 private_key: "testkey.pem",
6560 }
6561
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006562 apex_key {
6563 name: "mynewapex.key",
6564 public_key: "testkey2.avbpubkey",
6565 private_key: "testkey2.pem",
6566 }
6567
6568 android_app_certificate {
6569 name: "myapex.certificate",
6570 certificate: "testkey",
6571 }
6572
Jiyong Park5d790c32019-11-15 18:40:32 +09006573 android_app {
6574 name: "app",
6575 srcs: ["foo/bar/MyClass.java"],
6576 package_name: "foo",
6577 sdk_version: "none",
6578 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006579 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006580 }
6581
6582 override_android_app {
6583 name: "override_app",
6584 base: "app",
6585 package_name: "bar",
6586 }
markchien7c803b82021-08-26 22:10:06 +08006587
6588 bpf {
6589 name: "bpf",
6590 srcs: ["bpf.c"],
6591 }
6592
6593 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006594 name: "overrideBpf",
6595 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006596 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006597
6598 prebuilt_etc {
6599 name: "myetc",
6600 src: "myprebuilt",
6601 }
6602
6603 prebuilt_etc {
6604 name: "override_myetc",
6605 src: "override_myprebuilt",
6606 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006607 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006608
Jiyong Park317645e2019-12-05 13:20:58 +09006609 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6610 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6611 if originalVariant.GetOverriddenBy() != "" {
6612 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6613 }
6614 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6615 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6616 }
6617
Jiyong Park5d790c32019-11-15 18:40:32 +09006618 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6619 apexRule := module.Rule("apexRule")
6620 copyCmds := apexRule.Args["copy_commands"]
6621
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006622 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6623 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006624
markchien7c803b82021-08-26 22:10:06 +08006625 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006626 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006627
Daniel Norman5a3ce132021-08-26 15:44:43 -07006628 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6629 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6630
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006631 apexBundle := module.Module().(*apexBundle)
6632 name := apexBundle.Name()
6633 if name != "override_myapex" {
6634 t.Errorf("name should be \"override_myapex\", but was %q", name)
6635 }
6636
Baligh Uddin004d7172020-02-19 21:29:28 -08006637 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6638 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6639 }
6640
Jiyong Park20bacab2020-03-03 11:45:41 +09006641 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006642 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006643 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6644
6645 signApkRule := module.Rule("signapk")
6646 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006647
Colin Crossaa255532020-07-03 13:18:24 -07006648 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006649 var builder strings.Builder
6650 data.Custom(&builder, name, "TARGET_", "", data)
6651 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006652 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6653 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6654 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006655 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006656 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006657 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006658 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006659 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006660 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6661 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006662}
6663
Albert Martineefabcf2022-03-21 20:11:16 +00006664func TestMinSdkVersionOverride(t *testing.T) {
6665 // Override from 29 to 31
6666 minSdkOverride31 := "31"
6667 ctx := testApex(t, `
6668 apex {
6669 name: "myapex",
6670 key: "myapex.key",
6671 native_shared_libs: ["mylib"],
6672 updatable: true,
6673 min_sdk_version: "29"
6674 }
6675
6676 override_apex {
6677 name: "override_myapex",
6678 base: "myapex",
6679 logging_parent: "com.foo.bar",
6680 package_name: "test.overridden.package"
6681 }
6682
6683 apex_key {
6684 name: "myapex.key",
6685 public_key: "testkey.avbpubkey",
6686 private_key: "testkey.pem",
6687 }
6688
6689 cc_library {
6690 name: "mylib",
6691 srcs: ["mylib.cpp"],
6692 runtime_libs: ["libbar"],
6693 system_shared_libs: [],
6694 stl: "none",
6695 apex_available: [ "myapex" ],
6696 min_sdk_version: "apex_inherit"
6697 }
6698
6699 cc_library {
6700 name: "libbar",
6701 srcs: ["mylib.cpp"],
6702 system_shared_libs: [],
6703 stl: "none",
6704 apex_available: [ "myapex" ],
6705 min_sdk_version: "apex_inherit"
6706 }
6707
6708 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6709
6710 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6711 copyCmds := apexRule.Args["copy_commands"]
6712
6713 // Ensure that direct non-stubs dep is always included
6714 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6715
6716 // Ensure that runtime_libs dep in included
6717 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6718
6719 // Ensure libraries target overridden min_sdk_version value
6720 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6721}
6722
6723func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6724 // Attempt to override from 31 to 29, should be a NOOP
6725 minSdkOverride29 := "29"
6726 ctx := testApex(t, `
6727 apex {
6728 name: "myapex",
6729 key: "myapex.key",
6730 native_shared_libs: ["mylib"],
6731 updatable: true,
6732 min_sdk_version: "31"
6733 }
6734
6735 override_apex {
6736 name: "override_myapex",
6737 base: "myapex",
6738 logging_parent: "com.foo.bar",
6739 package_name: "test.overridden.package"
6740 }
6741
6742 apex_key {
6743 name: "myapex.key",
6744 public_key: "testkey.avbpubkey",
6745 private_key: "testkey.pem",
6746 }
6747
6748 cc_library {
6749 name: "mylib",
6750 srcs: ["mylib.cpp"],
6751 runtime_libs: ["libbar"],
6752 system_shared_libs: [],
6753 stl: "none",
6754 apex_available: [ "myapex" ],
6755 min_sdk_version: "apex_inherit"
6756 }
6757
6758 cc_library {
6759 name: "libbar",
6760 srcs: ["mylib.cpp"],
6761 system_shared_libs: [],
6762 stl: "none",
6763 apex_available: [ "myapex" ],
6764 min_sdk_version: "apex_inherit"
6765 }
6766
6767 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6768
6769 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6770 copyCmds := apexRule.Args["copy_commands"]
6771
6772 // Ensure that direct non-stubs dep is always included
6773 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6774
6775 // Ensure that runtime_libs dep in included
6776 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6777
6778 // Ensure libraries target the original min_sdk_version value rather than the overridden
6779 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6780}
6781
Jooyung Han214bf372019-11-12 13:03:50 +09006782func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006783 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006784 apex {
6785 name: "myapex",
6786 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006787 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006788 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006789 }
6790
6791 apex_key {
6792 name: "myapex.key",
6793 public_key: "testkey.avbpubkey",
6794 private_key: "testkey.pem",
6795 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006796
6797 cc_library {
6798 name: "mylib",
6799 srcs: ["mylib.cpp"],
6800 stl: "libc++",
6801 system_shared_libs: [],
6802 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006803 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006804 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006805 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006806
6807 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6808 args := module.Rule("apexRule").Args
6809 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006810 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006811
6812 // The copies of the libraries in the apex should have one more dependency than
6813 // the ones outside the apex, namely the unwinder. Ideally we should check
6814 // the dependency names directly here but for some reason the names are blank in
6815 // this test.
6816 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006817 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006818 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6819 if len(apexImplicits) != len(nonApexImplicits)+1 {
6820 t.Errorf("%q missing unwinder dep", lib)
6821 }
6822 }
Jooyung Han214bf372019-11-12 13:03:50 +09006823}
6824
Paul Duffine05480a2021-03-08 15:07:14 +00006825var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006826 "api/current.txt": nil,
6827 "api/removed.txt": nil,
6828 "api/system-current.txt": nil,
6829 "api/system-removed.txt": nil,
6830 "api/test-current.txt": nil,
6831 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006832
Anton Hanssondff2c782020-12-21 17:10:01 +00006833 "100/public/api/foo.txt": nil,
6834 "100/public/api/foo-removed.txt": nil,
6835 "100/system/api/foo.txt": nil,
6836 "100/system/api/foo-removed.txt": nil,
6837
Paul Duffineedc5d52020-06-12 17:46:39 +01006838 // For java_sdk_library_import
6839 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006840}
6841
Jooyung Han58f26ab2019-12-18 15:34:32 +09006842func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006843 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006844 apex {
6845 name: "myapex",
6846 key: "myapex.key",
6847 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006848 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006849 }
6850
6851 apex_key {
6852 name: "myapex.key",
6853 public_key: "testkey.avbpubkey",
6854 private_key: "testkey.pem",
6855 }
6856
6857 java_sdk_library {
6858 name: "foo",
6859 srcs: ["a.java"],
6860 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006861 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006862 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006863
6864 prebuilt_apis {
6865 name: "sdk",
6866 api_dirs: ["100"],
6867 }
Paul Duffin9b879592020-05-26 13:21:35 +01006868 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006869
6870 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006871 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006872 "javalib/foo.jar",
6873 "etc/permissions/foo.xml",
6874 })
6875 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006876 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006877 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 +09006878}
6879
Paul Duffin9b879592020-05-26 13:21:35 +01006880func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006881 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006882 apex {
6883 name: "myapex",
6884 key: "myapex.key",
6885 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006886 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006887 }
6888
6889 apex_key {
6890 name: "myapex.key",
6891 public_key: "testkey.avbpubkey",
6892 private_key: "testkey.pem",
6893 }
6894
6895 java_sdk_library {
6896 name: "foo",
6897 srcs: ["a.java"],
6898 api_packages: ["foo"],
6899 apex_available: ["myapex"],
6900 sdk_version: "none",
6901 system_modules: "none",
6902 }
6903
6904 java_library {
6905 name: "bar",
6906 srcs: ["a.java"],
6907 libs: ["foo"],
6908 apex_available: ["myapex"],
6909 sdk_version: "none",
6910 system_modules: "none",
6911 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006912
6913 prebuilt_apis {
6914 name: "sdk",
6915 api_dirs: ["100"],
6916 }
Paul Duffin9b879592020-05-26 13:21:35 +01006917 `, withFiles(filesForSdkLibrary))
6918
6919 // java_sdk_library installs both impl jar and permission XML
6920 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6921 "javalib/bar.jar",
6922 "javalib/foo.jar",
6923 "etc/permissions/foo.xml",
6924 })
6925
6926 // The bar library should depend on the implementation jar.
6927 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006928 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006929 t.Errorf("expected %q, found %#q", expected, actual)
6930 }
6931}
6932
6933func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006934 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006935 apex {
6936 name: "myapex",
6937 key: "myapex.key",
6938 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006939 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006940 }
6941
6942 apex_key {
6943 name: "myapex.key",
6944 public_key: "testkey.avbpubkey",
6945 private_key: "testkey.pem",
6946 }
6947
6948 java_sdk_library {
6949 name: "foo",
6950 srcs: ["a.java"],
6951 api_packages: ["foo"],
6952 apex_available: ["myapex"],
6953 sdk_version: "none",
6954 system_modules: "none",
6955 }
6956
6957 java_library {
6958 name: "bar",
6959 srcs: ["a.java"],
6960 libs: ["foo"],
6961 sdk_version: "none",
6962 system_modules: "none",
6963 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006964
6965 prebuilt_apis {
6966 name: "sdk",
6967 api_dirs: ["100"],
6968 }
Paul Duffin9b879592020-05-26 13:21:35 +01006969 `, withFiles(filesForSdkLibrary))
6970
6971 // java_sdk_library installs both impl jar and permission XML
6972 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6973 "javalib/foo.jar",
6974 "etc/permissions/foo.xml",
6975 })
6976
6977 // The bar library should depend on the stubs jar.
6978 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006979 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006980 t.Errorf("expected %q, found %#q", expected, actual)
6981 }
6982}
6983
Paul Duffineedc5d52020-06-12 17:46:39 +01006984func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006985 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006986 prebuilt_apis {
6987 name: "sdk",
6988 api_dirs: ["100"],
6989 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006990 withFiles(map[string][]byte{
6991 "apex/a.java": nil,
6992 "apex/apex_manifest.json": nil,
6993 "apex/Android.bp": []byte(`
6994 package {
6995 default_visibility: ["//visibility:private"],
6996 }
6997
6998 apex {
6999 name: "myapex",
7000 key: "myapex.key",
7001 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007002 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007003 }
7004
7005 apex_key {
7006 name: "myapex.key",
7007 public_key: "testkey.avbpubkey",
7008 private_key: "testkey.pem",
7009 }
7010
7011 java_library {
7012 name: "bar",
7013 srcs: ["a.java"],
7014 libs: ["foo"],
7015 apex_available: ["myapex"],
7016 sdk_version: "none",
7017 system_modules: "none",
7018 }
7019`),
7020 "source/a.java": nil,
7021 "source/api/current.txt": nil,
7022 "source/api/removed.txt": nil,
7023 "source/Android.bp": []byte(`
7024 package {
7025 default_visibility: ["//visibility:private"],
7026 }
7027
7028 java_sdk_library {
7029 name: "foo",
7030 visibility: ["//apex"],
7031 srcs: ["a.java"],
7032 api_packages: ["foo"],
7033 apex_available: ["myapex"],
7034 sdk_version: "none",
7035 system_modules: "none",
7036 public: {
7037 enabled: true,
7038 },
7039 }
7040`),
7041 "prebuilt/a.jar": nil,
7042 "prebuilt/Android.bp": []byte(`
7043 package {
7044 default_visibility: ["//visibility:private"],
7045 }
7046
7047 java_sdk_library_import {
7048 name: "foo",
7049 visibility: ["//apex", "//source"],
7050 apex_available: ["myapex"],
7051 prefer: true,
7052 public: {
7053 jars: ["a.jar"],
7054 },
7055 }
7056`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007057 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007058 )
7059
7060 // java_sdk_library installs both impl jar and permission XML
7061 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7062 "javalib/bar.jar",
7063 "javalib/foo.jar",
7064 "etc/permissions/foo.xml",
7065 })
7066
7067 // The bar library should depend on the implementation jar.
7068 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007069 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007070 t.Errorf("expected %q, found %#q", expected, actual)
7071 }
7072}
7073
7074func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7075 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7076 apex {
7077 name: "myapex",
7078 key: "myapex.key",
7079 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007080 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007081 }
7082
7083 apex_key {
7084 name: "myapex.key",
7085 public_key: "testkey.avbpubkey",
7086 private_key: "testkey.pem",
7087 }
7088
7089 java_sdk_library_import {
7090 name: "foo",
7091 apex_available: ["myapex"],
7092 prefer: true,
7093 public: {
7094 jars: ["a.jar"],
7095 },
7096 }
7097
7098 `, withFiles(filesForSdkLibrary))
7099}
7100
atrost6e126252020-01-27 17:01:16 +00007101func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007102 result := android.GroupFixturePreparers(
7103 prepareForApexTest,
7104 java.PrepareForTestWithPlatformCompatConfig,
7105 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007106 apex {
7107 name: "myapex",
7108 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007109 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007110 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007111 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007112 }
7113
7114 apex_key {
7115 name: "myapex.key",
7116 public_key: "testkey.avbpubkey",
7117 private_key: "testkey.pem",
7118 }
7119
7120 platform_compat_config {
7121 name: "myjar-platform-compat-config",
7122 src: ":myjar",
7123 }
7124
7125 java_library {
7126 name: "myjar",
7127 srcs: ["foo/bar/MyClass.java"],
7128 sdk_version: "none",
7129 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007130 apex_available: [ "myapex" ],
7131 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007132
7133 // Make sure that a preferred prebuilt does not affect the apex contents.
7134 prebuilt_platform_compat_config {
7135 name: "myjar-platform-compat-config",
7136 metadata: "compat-config/metadata.xml",
7137 prefer: true,
7138 }
atrost6e126252020-01-27 17:01:16 +00007139 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007140 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007141 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7142 "etc/compatconfig/myjar-platform-compat-config.xml",
7143 "javalib/myjar.jar",
7144 })
7145}
7146
Jooyung Han862c0d62022-12-21 10:15:37 +09007147func TestNoDupeApexFiles(t *testing.T) {
7148 android.GroupFixturePreparers(
7149 android.PrepareForTestWithAndroidBuildComponents,
7150 PrepareForTestWithApexBuildComponents,
7151 prepareForTestWithMyapex,
7152 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7153 ).
7154 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7155 RunTestWithBp(t, `
7156 apex {
7157 name: "myapex",
7158 key: "myapex.key",
7159 prebuilts: ["foo", "bar"],
7160 updatable: false,
7161 }
7162
7163 apex_key {
7164 name: "myapex.key",
7165 public_key: "testkey.avbpubkey",
7166 private_key: "testkey.pem",
7167 }
7168
7169 prebuilt_etc {
7170 name: "foo",
7171 src: "myprebuilt",
7172 filename_from_src: true,
7173 }
7174
7175 prebuilt_etc {
7176 name: "bar",
7177 src: "myprebuilt",
7178 filename_from_src: true,
7179 }
7180 `)
7181}
7182
Jiyong Park479321d2019-12-16 11:47:12 +09007183func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7184 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7185 apex {
7186 name: "myapex",
7187 key: "myapex.key",
7188 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007189 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007190 }
7191
7192 apex_key {
7193 name: "myapex.key",
7194 public_key: "testkey.avbpubkey",
7195 private_key: "testkey.pem",
7196 }
7197
7198 java_library {
7199 name: "myjar",
7200 srcs: ["foo/bar/MyClass.java"],
7201 sdk_version: "none",
7202 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007203 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007204 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007205 }
7206 `)
7207}
7208
Jiyong Park7afd1072019-12-30 16:56:33 +09007209func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007210 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007211 apex {
7212 name: "myapex",
7213 key: "myapex.key",
7214 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007215 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007216 }
7217
7218 apex_key {
7219 name: "myapex.key",
7220 public_key: "testkey.avbpubkey",
7221 private_key: "testkey.pem",
7222 }
7223
7224 cc_library {
7225 name: "mylib",
7226 srcs: ["mylib.cpp"],
7227 system_shared_libs: [],
7228 stl: "none",
7229 required: ["a", "b"],
7230 host_required: ["c", "d"],
7231 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007232 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007233 }
7234 `)
7235
7236 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007237 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007238 name := apexBundle.BaseModuleName()
7239 prefix := "TARGET_"
7240 var builder strings.Builder
7241 data.Custom(&builder, name, prefix, "", data)
7242 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007243 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007244 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7245 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007246}
7247
Jiyong Park7cd10e32020-01-14 09:22:18 +09007248func TestSymlinksFromApexToSystem(t *testing.T) {
7249 bp := `
7250 apex {
7251 name: "myapex",
7252 key: "myapex.key",
7253 native_shared_libs: ["mylib"],
7254 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007255 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007256 }
7257
Jiyong Park9d677202020-02-19 16:29:35 +09007258 apex {
7259 name: "myapex.updatable",
7260 key: "myapex.key",
7261 native_shared_libs: ["mylib"],
7262 java_libs: ["myjar"],
7263 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007264 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007265 }
7266
Jiyong Park7cd10e32020-01-14 09:22:18 +09007267 apex_key {
7268 name: "myapex.key",
7269 public_key: "testkey.avbpubkey",
7270 private_key: "testkey.pem",
7271 }
7272
7273 cc_library {
7274 name: "mylib",
7275 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007276 shared_libs: [
7277 "myotherlib",
7278 "myotherlib_ext",
7279 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007280 system_shared_libs: [],
7281 stl: "none",
7282 apex_available: [
7283 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007284 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007285 "//apex_available:platform",
7286 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007287 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007288 }
7289
7290 cc_library {
7291 name: "myotherlib",
7292 srcs: ["mylib.cpp"],
7293 system_shared_libs: [],
7294 stl: "none",
7295 apex_available: [
7296 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007297 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007298 "//apex_available:platform",
7299 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007300 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007301 }
7302
Jiyong Parkce243632023-02-17 18:22:25 +09007303 cc_library {
7304 name: "myotherlib_ext",
7305 srcs: ["mylib.cpp"],
7306 system_shared_libs: [],
7307 system_ext_specific: true,
7308 stl: "none",
7309 apex_available: [
7310 "myapex",
7311 "myapex.updatable",
7312 "//apex_available:platform",
7313 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007314 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007315 }
7316
Jiyong Park7cd10e32020-01-14 09:22:18 +09007317 java_library {
7318 name: "myjar",
7319 srcs: ["foo/bar/MyClass.java"],
7320 sdk_version: "none",
7321 system_modules: "none",
7322 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007323 apex_available: [
7324 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007325 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007326 "//apex_available:platform",
7327 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007328 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007329 }
7330
7331 java_library {
7332 name: "myotherjar",
7333 srcs: ["foo/bar/MyClass.java"],
7334 sdk_version: "none",
7335 system_modules: "none",
7336 apex_available: [
7337 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007338 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007339 "//apex_available:platform",
7340 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007341 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007342 }
7343 `
7344
7345 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7346 for _, f := range files {
7347 if f.path == file {
7348 if f.isLink {
7349 t.Errorf("%q is not a real file", file)
7350 }
7351 return
7352 }
7353 }
7354 t.Errorf("%q is not found", file)
7355 }
7356
Jiyong Parkce243632023-02-17 18:22:25 +09007357 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007358 for _, f := range files {
7359 if f.path == file {
7360 if !f.isLink {
7361 t.Errorf("%q is not a symlink", file)
7362 }
Jiyong Parkce243632023-02-17 18:22:25 +09007363 if f.src != target {
7364 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7365 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007366 return
7367 }
7368 }
7369 t.Errorf("%q is not found", file)
7370 }
7371
Jiyong Park9d677202020-02-19 16:29:35 +09007372 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7373 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007374 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007375 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007376 ensureRealfileExists(t, files, "javalib/myjar.jar")
7377 ensureRealfileExists(t, files, "lib64/mylib.so")
7378 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007379 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007380
Jiyong Park9d677202020-02-19 16:29:35 +09007381 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7382 ensureRealfileExists(t, files, "javalib/myjar.jar")
7383 ensureRealfileExists(t, files, "lib64/mylib.so")
7384 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007385 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007386
7387 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007388 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007389 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007390 ensureRealfileExists(t, files, "javalib/myjar.jar")
7391 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007392 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7393 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007394
7395 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7396 ensureRealfileExists(t, files, "javalib/myjar.jar")
7397 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007398 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7399 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007400}
7401
Yo Chiange8128052020-07-23 20:09:18 +08007402func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007403 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007404 apex {
7405 name: "myapex",
7406 key: "myapex.key",
7407 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007408 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007409 }
7410
7411 apex_key {
7412 name: "myapex.key",
7413 public_key: "testkey.avbpubkey",
7414 private_key: "testkey.pem",
7415 }
7416
7417 cc_library_shared {
7418 name: "mylib",
7419 srcs: ["mylib.cpp"],
7420 shared_libs: ["myotherlib"],
7421 system_shared_libs: [],
7422 stl: "none",
7423 apex_available: [
7424 "myapex",
7425 "//apex_available:platform",
7426 ],
7427 }
7428
7429 cc_prebuilt_library_shared {
7430 name: "myotherlib",
7431 srcs: ["prebuilt.so"],
7432 system_shared_libs: [],
7433 stl: "none",
7434 apex_available: [
7435 "myapex",
7436 "//apex_available:platform",
7437 ],
7438 }
7439 `)
7440
Prerana Patilb1896c82022-11-09 18:14:34 +00007441 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007442 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007443 var builder strings.Builder
7444 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7445 androidMk := builder.String()
7446 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007447 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007448 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7449 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7450 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007451 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007452}
7453
Jooyung Han643adc42020-02-27 13:50:06 +09007454func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007455 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007456 apex {
7457 name: "myapex",
7458 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007459 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007460 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007461 }
7462
7463 apex_key {
7464 name: "myapex.key",
7465 public_key: "testkey.avbpubkey",
7466 private_key: "testkey.pem",
7467 }
7468
7469 cc_library {
7470 name: "mylib",
7471 srcs: ["mylib.cpp"],
7472 shared_libs: ["mylib2"],
7473 system_shared_libs: [],
7474 stl: "none",
7475 apex_available: [ "myapex" ],
7476 }
7477
7478 cc_library {
7479 name: "mylib2",
7480 srcs: ["mylib.cpp"],
7481 system_shared_libs: [],
7482 stl: "none",
7483 apex_available: [ "myapex" ],
7484 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007485
7486 rust_ffi_shared {
7487 name: "libfoo.rust",
7488 crate_name: "foo",
7489 srcs: ["foo.rs"],
7490 shared_libs: ["libfoo.shared_from_rust"],
7491 prefer_rlib: true,
7492 apex_available: ["myapex"],
7493 }
7494
7495 cc_library_shared {
7496 name: "libfoo.shared_from_rust",
7497 srcs: ["mylib.cpp"],
7498 system_shared_libs: [],
7499 stl: "none",
7500 stubs: {
7501 versions: ["10", "11", "12"],
7502 },
7503 }
7504
Jooyung Han643adc42020-02-27 13:50:06 +09007505 `)
7506
7507 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7508 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007509 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007510 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7511 "lib64/mylib.so",
7512 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007513 "lib64/libfoo.rust.so",
7514 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7515 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007516 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007517
7518 // b/220397949
7519 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007520}
7521
Jooyung Han49f67012020-04-17 13:43:10 +09007522func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007523 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007524 apex {
7525 name: "myapex",
7526 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007527 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007528 }
7529 apex_key {
7530 name: "myapex.key",
7531 public_key: "testkey.avbpubkey",
7532 private_key: "testkey.pem",
7533 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007534 `,
7535 android.FixtureModifyConfig(func(config android.Config) {
7536 delete(config.Targets, android.Android)
7537 config.AndroidCommonTarget = android.Target{}
7538 }),
7539 )
Jooyung Han49f67012020-04-17 13:43:10 +09007540
7541 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7542 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7543 }
7544}
7545
Jiyong Parkbd159612020-02-28 15:22:21 +09007546func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007547 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007548 apex {
7549 name: "myapex",
7550 key: "myapex.key",
7551 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007552 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007553 }
7554
7555 apex_key {
7556 name: "myapex.key",
7557 public_key: "testkey.avbpubkey",
7558 private_key: "testkey.pem",
7559 }
7560
7561 android_app {
7562 name: "AppFoo",
7563 srcs: ["foo/bar/MyClass.java"],
7564 sdk_version: "none",
7565 system_modules: "none",
7566 apex_available: [ "myapex" ],
7567 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007568 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007569
Colin Crosscf371cc2020-11-13 11:48:42 -08007570 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007571 content := bundleConfigRule.Args["content"]
7572
7573 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007574 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 +09007575}
7576
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007577func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007578 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007579 apex {
7580 name: "myapex",
7581 key: "myapex.key",
7582 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007583 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007584 }
7585
7586 apex_key {
7587 name: "myapex.key",
7588 public_key: "testkey.avbpubkey",
7589 private_key: "testkey.pem",
7590 }
7591
7592 android_app_set {
7593 name: "AppSet",
7594 set: "AppSet.apks",
7595 }`)
7596 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007597 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007598 content := bundleConfigRule.Args["content"]
7599 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7600 s := mod.Rule("apexRule").Args["copy_commands"]
7601 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007602 if len(copyCmds) != 4 {
7603 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007604 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007605 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7606 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007607 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7608 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007609
7610 // Ensure that canned_fs_config has an entry for the app set zip file
7611 generateFsRule := mod.Rule("generateFsConfig")
7612 cmd := generateFsRule.RuleParams.Command
7613 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007614}
7615
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007616func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007617 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007618 apex_set {
7619 name: "myapex",
7620 filename: "foo_v2.apex",
7621 sanitized: {
7622 none: { set: "myapex.apks", },
7623 hwaddress: { set: "myapex.hwasan.apks", },
7624 },
Paul Duffin24704672021-04-06 16:09:30 +01007625 }
7626 `
7627 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007628
Paul Duffin24704672021-04-06 16:09:30 +01007629 // Check that the extractor produces the correct output file from the correct input file.
7630 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007631
Paul Duffin24704672021-04-06 16:09:30 +01007632 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7633 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007634
Paul Duffin24704672021-04-06 16:09:30 +01007635 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7636
7637 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007638 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7639 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007640
7641 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007642}
7643
Pranav Guptaeba03b02022-09-27 00:27:08 +00007644func TestApexSetApksModuleAssignment(t *testing.T) {
7645 ctx := testApex(t, `
7646 apex_set {
7647 name: "myapex",
7648 set: ":myapex_apks_file",
7649 }
7650
7651 filegroup {
7652 name: "myapex_apks_file",
7653 srcs: ["myapex.apks"],
7654 }
7655 `)
7656
7657 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7658
7659 // Check that the extractor produces the correct apks file from the input module
7660 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7661 extractedApex := m.Output(extractorOutput)
7662
7663 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7664}
7665
Paul Duffin89f570a2021-06-16 01:42:33 +01007666func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007667 t.Helper()
7668
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007669 bp := `
7670 java_library {
7671 name: "some-updatable-apex-lib",
7672 srcs: ["a.java"],
7673 sdk_version: "current",
7674 apex_available: [
7675 "some-updatable-apex",
7676 ],
satayevabcd5972021-08-06 17:49:46 +01007677 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007678 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007679 }
7680
7681 java_library {
7682 name: "some-non-updatable-apex-lib",
7683 srcs: ["a.java"],
7684 apex_available: [
7685 "some-non-updatable-apex",
7686 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007687 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007688 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007689 }
7690
7691 bootclasspath_fragment {
7692 name: "some-non-updatable-fragment",
7693 contents: ["some-non-updatable-apex-lib"],
7694 apex_available: [
7695 "some-non-updatable-apex",
7696 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007697 hidden_api: {
7698 split_packages: ["*"],
7699 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007700 }
7701
7702 java_library {
7703 name: "some-platform-lib",
7704 srcs: ["a.java"],
7705 sdk_version: "current",
7706 installable: true,
7707 }
7708
7709 java_library {
7710 name: "some-art-lib",
7711 srcs: ["a.java"],
7712 sdk_version: "current",
7713 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007714 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007715 ],
7716 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007717 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007718 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007719 }
7720
7721 apex {
7722 name: "some-updatable-apex",
7723 key: "some-updatable-apex.key",
7724 java_libs: ["some-updatable-apex-lib"],
7725 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007726 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007727 }
7728
7729 apex {
7730 name: "some-non-updatable-apex",
7731 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007732 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007733 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007734 }
7735
7736 apex_key {
7737 name: "some-updatable-apex.key",
7738 }
7739
7740 apex_key {
7741 name: "some-non-updatable-apex.key",
7742 }
7743
7744 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007745 name: "com.android.art.debug",
7746 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007747 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007748 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007749 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007750 }
7751
Paul Duffinf23bc472021-04-27 12:42:20 +01007752 bootclasspath_fragment {
7753 name: "art-bootclasspath-fragment",
7754 image_name: "art",
7755 contents: ["some-art-lib"],
7756 apex_available: [
7757 "com.android.art.debug",
7758 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007759 hidden_api: {
7760 split_packages: ["*"],
7761 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007762 }
7763
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007764 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007765 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007766 }
7767
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007768 filegroup {
7769 name: "some-updatable-apex-file_contexts",
7770 srcs: [
7771 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7772 ],
7773 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007774
7775 filegroup {
7776 name: "some-non-updatable-apex-file_contexts",
7777 srcs: [
7778 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7779 ],
7780 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007781 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007782
Paul Duffin89f570a2021-06-16 01:42:33 +01007783 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007784}
7785
Paul Duffin89f570a2021-06-16 01:42:33 +01007786func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007787 t.Helper()
7788
Paul Duffin55607122021-03-30 23:32:51 +01007789 fs := android.MockFS{
7790 "a.java": nil,
7791 "a.jar": nil,
7792 "apex_manifest.json": nil,
7793 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007794 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007795 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7796 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7797 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007798 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007799 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007800
Paul Duffin55607122021-03-30 23:32:51 +01007801 errorHandler := android.FixtureExpectsNoErrors
7802 if errmsg != "" {
7803 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007804 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007805
Paul Duffin55607122021-03-30 23:32:51 +01007806 result := android.GroupFixturePreparers(
7807 cc.PrepareForTestWithCcDefaultModules,
7808 java.PrepareForTestWithHiddenApiBuildComponents,
7809 java.PrepareForTestWithJavaDefaultModules,
7810 java.PrepareForTestWithJavaSdkLibraryFiles,
7811 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007812 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007813 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007814 android.FixtureModifyMockFS(func(fs android.MockFS) {
7815 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7816 insert := ""
7817 for _, fragment := range fragments {
7818 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7819 }
7820 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7821 platform_bootclasspath {
7822 name: "platform-bootclasspath",
7823 fragments: [
7824 %s
7825 ],
7826 }
7827 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007828 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007829 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007830 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007831 ).
7832 ExtendWithErrorHandler(errorHandler).
7833 RunTestWithBp(t, bp)
7834
7835 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007836}
7837
Paul Duffin5556c5f2022-06-09 17:32:21 +00007838func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007839 preparers := android.GroupFixturePreparers(
7840 java.PrepareForTestWithJavaDefaultModules,
7841 PrepareForTestWithApexBuildComponents,
7842 ).
7843 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7844 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7845
7846 bpBase := `
7847 apex_set {
7848 name: "com.android.myapex",
7849 installable: true,
7850 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7851 set: "myapex.apks",
7852 }
7853
7854 apex_set {
7855 name: "com.mycompany.android.myapex",
7856 apex_name: "com.android.myapex",
7857 installable: true,
7858 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7859 set: "company-myapex.apks",
7860 }
7861
7862 prebuilt_bootclasspath_fragment {
7863 name: "my-bootclasspath-fragment",
7864 apex_available: ["com.android.myapex"],
7865 %s
7866 }
7867 `
7868
7869 t.Run("java_import", func(t *testing.T) {
7870 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7871 java_import {
7872 name: "libfoo",
7873 jars: ["libfoo.jar"],
7874 apex_available: ["com.android.myapex"],
7875 }
7876 `)
7877 })
7878
7879 t.Run("java_sdk_library_import", func(t *testing.T) {
7880 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7881 java_sdk_library_import {
7882 name: "libfoo",
7883 public: {
7884 jars: ["libbar.jar"],
7885 },
7886 apex_available: ["com.android.myapex"],
7887 }
7888 `)
7889 })
7890
7891 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7892 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7893 image_name: "art",
7894 contents: ["libfoo"],
7895 `)+`
7896 java_sdk_library_import {
7897 name: "libfoo",
7898 public: {
7899 jars: ["libbar.jar"],
7900 },
7901 apex_available: ["com.android.myapex"],
7902 }
7903 `)
7904 })
7905}
7906
Paul Duffin5556c5f2022-06-09 17:32:21 +00007907func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7908 preparers := android.GroupFixturePreparers(
7909 java.PrepareForTestWithJavaDefaultModules,
7910 PrepareForTestWithApexBuildComponents,
7911 )
7912
7913 bpBase := `
7914 apex_set {
7915 name: "com.android.myapex",
7916 installable: true,
7917 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7918 set: "myapex.apks",
7919 }
7920
7921 apex_set {
7922 name: "com.android.myapex_compressed",
7923 apex_name: "com.android.myapex",
7924 installable: true,
7925 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7926 set: "myapex_compressed.apks",
7927 }
7928
7929 prebuilt_bootclasspath_fragment {
7930 name: "my-bootclasspath-fragment",
7931 apex_available: [
7932 "com.android.myapex",
7933 "com.android.myapex_compressed",
7934 ],
7935 hidden_api: {
7936 annotation_flags: "annotation-flags.csv",
7937 metadata: "metadata.csv",
7938 index: "index.csv",
7939 signature_patterns: "signature_patterns.csv",
7940 },
7941 %s
7942 }
7943 `
7944
7945 t.Run("java_import", func(t *testing.T) {
7946 result := preparers.RunTestWithBp(t,
7947 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7948 java_import {
7949 name: "libfoo",
7950 jars: ["libfoo.jar"],
7951 apex_available: [
7952 "com.android.myapex",
7953 "com.android.myapex_compressed",
7954 ],
7955 }
7956 `)
7957
7958 module := result.Module("libfoo", "android_common_com.android.myapex")
7959 usesLibraryDep := module.(java.UsesLibraryDependency)
7960 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7961 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7962 usesLibraryDep.DexJarBuildPath().Path())
7963 })
7964
7965 t.Run("java_sdk_library_import", func(t *testing.T) {
7966 result := preparers.RunTestWithBp(t,
7967 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7968 java_sdk_library_import {
7969 name: "libfoo",
7970 public: {
7971 jars: ["libbar.jar"],
7972 },
7973 apex_available: [
7974 "com.android.myapex",
7975 "com.android.myapex_compressed",
7976 ],
7977 compile_dex: true,
7978 }
7979 `)
7980
7981 module := result.Module("libfoo", "android_common_com.android.myapex")
7982 usesLibraryDep := module.(java.UsesLibraryDependency)
7983 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7984 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7985 usesLibraryDep.DexJarBuildPath().Path())
7986 })
7987
7988 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7989 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7990 image_name: "art",
7991 contents: ["libfoo"],
7992 `)+`
7993 java_sdk_library_import {
7994 name: "libfoo",
7995 public: {
7996 jars: ["libbar.jar"],
7997 },
7998 apex_available: [
7999 "com.android.myapex",
8000 "com.android.myapex_compressed",
8001 ],
8002 compile_dex: true,
8003 }
8004 `)
8005 })
8006}
8007
Jooyung Han548640b2020-04-27 12:10:30 +09008008func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8009 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8010 apex {
8011 name: "myapex",
8012 key: "myapex.key",
8013 updatable: true,
8014 }
8015
8016 apex_key {
8017 name: "myapex.key",
8018 public_key: "testkey.avbpubkey",
8019 private_key: "testkey.pem",
8020 }
8021 `)
8022}
8023
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008024func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8025 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8026 apex {
8027 name: "myapex",
8028 key: "myapex.key",
8029 }
8030
8031 apex_key {
8032 name: "myapex.key",
8033 public_key: "testkey.avbpubkey",
8034 private_key: "testkey.pem",
8035 }
8036 `)
8037}
8038
Jooyung Handfc864c2023-03-20 18:19:07 +09008039func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8040 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008041 apex {
8042 name: "myapex",
8043 key: "myapex.key",
8044 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008045 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008046 soc_specific: true,
8047 }
8048
8049 apex_key {
8050 name: "myapex.key",
8051 public_key: "testkey.avbpubkey",
8052 private_key: "testkey.pem",
8053 }
8054 `)
8055}
8056
Jooyung Han02873da2023-03-22 17:41:03 +09008057func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8058 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8059 apex {
8060 name: "myapex",
8061 key: "myapex.key",
8062 updatable: false,
8063 min_sdk_version: "29",
8064 use_vndk_as_stable: true,
8065 vendor: true,
8066 }
8067
8068 apex_key {
8069 name: "myapex.key",
8070 public_key: "testkey.avbpubkey",
8071 private_key: "testkey.pem",
8072 }
8073 `)
8074}
8075
Jooyung Handfc864c2023-03-20 18:19:07 +09008076func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8077 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8078 apex {
8079 name: "myapex",
8080 key: "myapex.key",
8081 updatable: false,
8082 use_vndk_as_stable: true,
8083 }
8084
8085 apex_key {
8086 name: "myapex.key",
8087 public_key: "testkey.avbpubkey",
8088 private_key: "testkey.pem",
8089 }
8090 `)
8091}
8092
satayevb98371c2021-06-15 16:49:50 +01008093func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8094 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8095 apex {
8096 name: "myapex",
8097 key: "myapex.key",
8098 systemserverclasspath_fragments: [
8099 "mysystemserverclasspathfragment",
8100 ],
8101 min_sdk_version: "29",
8102 updatable: true,
8103 }
8104
8105 apex_key {
8106 name: "myapex.key",
8107 public_key: "testkey.avbpubkey",
8108 private_key: "testkey.pem",
8109 }
8110
8111 java_library {
8112 name: "foo",
8113 srcs: ["b.java"],
8114 min_sdk_version: "29",
8115 installable: true,
8116 apex_available: [
8117 "myapex",
8118 ],
8119 }
8120
8121 systemserverclasspath_fragment {
8122 name: "mysystemserverclasspathfragment",
8123 generate_classpaths_proto: false,
8124 contents: [
8125 "foo",
8126 ],
8127 apex_available: [
8128 "myapex",
8129 ],
8130 }
satayevabcd5972021-08-06 17:49:46 +01008131 `,
8132 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8133 )
satayevb98371c2021-06-15 16:49:50 +01008134}
8135
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008136func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008137 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8138 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8139 // modules to be included in the BootJars.
8140 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8141 return android.GroupFixturePreparers(
8142 dexpreopt.FixtureSetBootJars(bootJars...),
8143 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8144 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8145 }),
8146 )
8147 }
8148
8149 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8150 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8151 // specified in the ArtApexJars configuration.
8152 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8153 return android.GroupFixturePreparers(
8154 dexpreopt.FixtureSetArtBootJars(bootJars...),
8155 dexpreopt.FixtureSetBootJars(bootJars...),
8156 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8157 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8158 }),
8159 )
8160 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008161
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008162 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008163 preparer := android.GroupFixturePreparers(
8164 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8165 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8166 )
8167 fragments := []java.ApexVariantReference{
8168 {
8169 Apex: proptools.StringPtr("com.android.art.debug"),
8170 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8171 },
8172 {
8173 Apex: proptools.StringPtr("some-non-updatable-apex"),
8174 Module: proptools.StringPtr("some-non-updatable-fragment"),
8175 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008176 }
satayevabcd5972021-08-06 17:49:46 +01008177 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008178 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008179
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008180 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008181 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8182 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008183 preparer := android.GroupFixturePreparers(
8184 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8185 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8186 )
Paul Duffin60264a02021-04-12 20:02:36 +01008187 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008188 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008189
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008190 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008191 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008192 // Update the dexpreopt ArtApexJars directly.
8193 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8194 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008195 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008196
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008197 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008198 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01008199 // Update the dexpreopt ArtApexJars directly.
8200 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8201 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008202 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008203
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008204 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008205 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01008206 preparer := android.GroupFixturePreparers(
8207 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8208 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8209 )
Paul Duffin60264a02021-04-12 20:02:36 +01008210 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008211 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008212
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008213 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008214 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008215 fragment := java.ApexVariantReference{
8216 Apex: proptools.StringPtr("some-non-updatable-apex"),
8217 Module: proptools.StringPtr("some-non-updatable-fragment"),
8218 }
8219 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008220 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008221
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008222 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008223 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008224 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8225 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008226 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008227
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008228 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008229 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008230 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8231 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008232 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008233
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008234 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008235 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008236 // Update the dexpreopt ArtApexJars directly.
8237 preparer := prepareSetArtJars("platform:some-platform-lib")
8238 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008239 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008240
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008241 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008242 preparer := android.GroupFixturePreparers(
8243 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8244 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8245 )
8246 fragments := []java.ApexVariantReference{
8247 {
8248 Apex: proptools.StringPtr("some-non-updatable-apex"),
8249 Module: proptools.StringPtr("some-non-updatable-fragment"),
8250 },
8251 }
8252 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008253 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008254}
8255
8256func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008257 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008258 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008259 fragment := java.ApexVariantReference{
8260 Apex: proptools.StringPtr("myapex"),
8261 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8262 }
8263
Paul Duffin064b70c2020-11-02 17:32:38 +00008264 testDexpreoptWithApexes(t, `
8265 prebuilt_apex {
8266 name: "myapex" ,
8267 arch: {
8268 arm64: {
8269 src: "myapex-arm64.apex",
8270 },
8271 arm: {
8272 src: "myapex-arm.apex",
8273 },
8274 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008275 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8276 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008277
Paul Duffin89f570a2021-06-16 01:42:33 +01008278 prebuilt_bootclasspath_fragment {
8279 name: "my-bootclasspath-fragment",
8280 contents: ["libfoo"],
8281 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008282 hidden_api: {
8283 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8284 metadata: "my-bootclasspath-fragment/metadata.csv",
8285 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008286 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8287 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8288 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008289 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008290 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008291
Paul Duffin89f570a2021-06-16 01:42:33 +01008292 java_import {
8293 name: "libfoo",
8294 jars: ["libfoo.jar"],
8295 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008296 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008297 }
8298 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008299 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008300}
8301
Spandan Dasf14e2542021-11-12 00:01:37 +00008302func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008303 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008304 bp += `
8305 apex_key {
8306 name: "myapex.key",
8307 public_key: "testkey.avbpubkey",
8308 private_key: "testkey.pem",
8309 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008310 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008311 "lib1/src/A.java": nil,
8312 "lib2/src/B.java": nil,
8313 "system/sepolicy/apex/myapex-file_contexts": nil,
8314 }
8315
Paul Duffin45338f02021-03-30 23:07:52 +01008316 errorHandler := android.FixtureExpectsNoErrors
8317 if errmsg != "" {
8318 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008319 }
Colin Crossae8600b2020-10-29 17:09:13 -07008320
Paul Duffin45338f02021-03-30 23:07:52 +01008321 android.GroupFixturePreparers(
8322 android.PrepareForTestWithAndroidBuildComponents,
8323 java.PrepareForTestWithJavaBuildComponents,
8324 PrepareForTestWithApexBuildComponents,
8325 android.PrepareForTestWithNeverallowRules(rules),
8326 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008327 apexBootJars := make([]string, 0, len(bootJars))
8328 for _, apexBootJar := range bootJars {
8329 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008330 }
satayevd604b212021-07-21 14:23:52 +01008331 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008332 }),
8333 fs.AddToFixture(),
8334 ).
8335 ExtendWithErrorHandler(errorHandler).
8336 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008337}
8338
8339func TestApexPermittedPackagesRules(t *testing.T) {
8340 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008341 name string
8342 expectedError string
8343 bp string
8344 bootJars []string
8345 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008346 }{
8347
8348 {
8349 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8350 expectedError: "",
8351 bp: `
8352 java_library {
8353 name: "bcp_lib1",
8354 srcs: ["lib1/src/*.java"],
8355 permitted_packages: ["foo.bar"],
8356 apex_available: ["myapex"],
8357 sdk_version: "none",
8358 system_modules: "none",
8359 }
8360 java_library {
8361 name: "nonbcp_lib2",
8362 srcs: ["lib2/src/*.java"],
8363 apex_available: ["myapex"],
8364 permitted_packages: ["a.b"],
8365 sdk_version: "none",
8366 system_modules: "none",
8367 }
8368 apex {
8369 name: "myapex",
8370 key: "myapex.key",
8371 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008372 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008373 }`,
8374 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008375 bcpPermittedPackages: map[string][]string{
8376 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008377 "foo.bar",
8378 },
8379 },
8380 },
8381 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008382 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008383 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 +01008384 bp: `
8385 java_library {
8386 name: "bcp_lib1",
8387 srcs: ["lib1/src/*.java"],
8388 apex_available: ["myapex"],
8389 permitted_packages: ["foo.bar"],
8390 sdk_version: "none",
8391 system_modules: "none",
8392 }
8393 java_library {
8394 name: "bcp_lib2",
8395 srcs: ["lib2/src/*.java"],
8396 apex_available: ["myapex"],
8397 permitted_packages: ["foo.bar", "bar.baz"],
8398 sdk_version: "none",
8399 system_modules: "none",
8400 }
8401 apex {
8402 name: "myapex",
8403 key: "myapex.key",
8404 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008405 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008406 }
8407 `,
8408 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008409 bcpPermittedPackages: map[string][]string{
8410 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008411 "foo.bar",
8412 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008413 "bcp_lib2": []string{
8414 "foo.bar",
8415 },
8416 },
8417 },
8418 {
8419 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8420 expectedError: "",
8421 bp: `
8422 java_library {
8423 name: "bcp_lib_restricted",
8424 srcs: ["lib1/src/*.java"],
8425 apex_available: ["myapex"],
8426 permitted_packages: ["foo.bar"],
8427 sdk_version: "none",
8428 min_sdk_version: "29",
8429 system_modules: "none",
8430 }
8431 java_library {
8432 name: "bcp_lib_unrestricted",
8433 srcs: ["lib2/src/*.java"],
8434 apex_available: ["myapex"],
8435 permitted_packages: ["foo.bar", "bar.baz"],
8436 sdk_version: "none",
8437 min_sdk_version: "29",
8438 system_modules: "none",
8439 }
8440 apex {
8441 name: "myapex",
8442 key: "myapex.key",
8443 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8444 updatable: true,
8445 min_sdk_version: "29",
8446 }
8447 `,
8448 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8449 bcpPermittedPackages: map[string][]string{
8450 "bcp_lib1_non_updateable": []string{
8451 "foo.bar",
8452 },
8453 // 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 +01008454 },
8455 },
8456 }
8457 for _, tc := range testcases {
8458 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008459 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8460 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008461 })
8462 }
8463}
8464
Jiyong Park62304bb2020-04-13 16:19:48 +09008465func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008466 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008467 apex {
8468 name: "myapex",
8469 key: "myapex.key",
8470 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008471 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008472 }
8473
8474 apex_key {
8475 name: "myapex.key",
8476 public_key: "testkey.avbpubkey",
8477 private_key: "testkey.pem",
8478 }
8479
8480 cc_library {
8481 name: "mylib",
8482 srcs: ["mylib.cpp"],
8483 system_shared_libs: [],
8484 stl: "none",
8485 stubs: {
8486 versions: ["1"],
8487 },
8488 apex_available: ["myapex"],
8489 }
8490
8491 cc_library {
8492 name: "myprivlib",
8493 srcs: ["mylib.cpp"],
8494 system_shared_libs: [],
8495 stl: "none",
8496 apex_available: ["myapex"],
8497 }
8498
8499
8500 cc_test {
8501 name: "mytest",
8502 gtest: false,
8503 srcs: ["mylib.cpp"],
8504 system_shared_libs: [],
8505 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008506 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008507 test_for: ["myapex"]
8508 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008509
8510 cc_library {
8511 name: "mytestlib",
8512 srcs: ["mylib.cpp"],
8513 system_shared_libs: [],
8514 shared_libs: ["mylib", "myprivlib"],
8515 stl: "none",
8516 test_for: ["myapex"],
8517 }
8518
8519 cc_benchmark {
8520 name: "mybench",
8521 srcs: ["mylib.cpp"],
8522 system_shared_libs: [],
8523 shared_libs: ["mylib", "myprivlib"],
8524 stl: "none",
8525 test_for: ["myapex"],
8526 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008527 `)
8528
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008529 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008530 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008531 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8532 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8533 }
8534
8535 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008536 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008537 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8538 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8539 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8540}
Jiyong Park46a512f2020-12-04 18:02:13 +09008541
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008542func TestIndirectTestFor(t *testing.T) {
8543 ctx := testApex(t, `
8544 apex {
8545 name: "myapex",
8546 key: "myapex.key",
8547 native_shared_libs: ["mylib", "myprivlib"],
8548 updatable: false,
8549 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008550
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008551 apex_key {
8552 name: "myapex.key",
8553 public_key: "testkey.avbpubkey",
8554 private_key: "testkey.pem",
8555 }
8556
8557 cc_library {
8558 name: "mylib",
8559 srcs: ["mylib.cpp"],
8560 system_shared_libs: [],
8561 stl: "none",
8562 stubs: {
8563 versions: ["1"],
8564 },
8565 apex_available: ["myapex"],
8566 }
8567
8568 cc_library {
8569 name: "myprivlib",
8570 srcs: ["mylib.cpp"],
8571 system_shared_libs: [],
8572 stl: "none",
8573 shared_libs: ["mylib"],
8574 apex_available: ["myapex"],
8575 }
8576
8577 cc_library {
8578 name: "mytestlib",
8579 srcs: ["mylib.cpp"],
8580 system_shared_libs: [],
8581 shared_libs: ["myprivlib"],
8582 stl: "none",
8583 test_for: ["myapex"],
8584 }
8585 `)
8586
8587 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008588 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008589 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8590 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8591 }
8592
8593 // The platform variant of mytestlib links to the platform variant of the
8594 // internal myprivlib.
8595 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8596
8597 // The platform variant of myprivlib links to the platform variant of mylib
8598 // and bypasses its stubs.
8599 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 +09008600}
8601
Martin Stjernholmec009002021-03-27 15:18:31 +00008602func TestTestForForLibInOtherApex(t *testing.T) {
8603 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8604 _ = testApex(t, `
8605 apex {
8606 name: "com.android.art",
8607 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008608 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008609 updatable: false,
8610 }
8611
8612 apex {
8613 name: "com.android.art.debug",
8614 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008615 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008616 updatable: false,
8617 }
8618
8619 apex_key {
8620 name: "myapex.key",
8621 public_key: "testkey.avbpubkey",
8622 private_key: "testkey.pem",
8623 }
8624
8625 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008626 name: "libnativebridge",
8627 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008628 system_shared_libs: [],
8629 stl: "none",
8630 stubs: {
8631 versions: ["1"],
8632 },
8633 apex_available: ["com.android.art", "com.android.art.debug"],
8634 }
8635
8636 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008637 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008638 srcs: ["mylib.cpp"],
8639 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008640 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008641 stl: "none",
8642 apex_available: ["com.android.art.debug"],
8643 test_for: ["com.android.art"],
8644 }
8645 `,
8646 android.MockFS{
8647 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8648 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8649 }.AddToFixture())
8650}
8651
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008652// TODO(jungjw): Move this to proptools
8653func intPtr(i int) *int {
8654 return &i
8655}
8656
8657func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008658 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008659 apex_set {
8660 name: "myapex",
8661 set: "myapex.apks",
8662 filename: "foo_v2.apex",
8663 overrides: ["foo"],
8664 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008665 `,
8666 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8667 variables.Platform_sdk_version = intPtr(30)
8668 }),
8669 android.FixtureModifyConfig(func(config android.Config) {
8670 config.Targets[android.Android] = []android.Target{
8671 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8672 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8673 }
8674 }),
8675 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008676
Paul Duffin24704672021-04-06 16:09:30 +01008677 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008678
8679 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008680 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008681 actual := extractedApex.Args["abis"]
8682 expected := "ARMEABI_V7A,ARM64_V8A"
8683 if actual != expected {
8684 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8685 }
8686 actual = extractedApex.Args["sdk-version"]
8687 expected = "30"
8688 if actual != expected {
8689 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8690 }
8691
Paul Duffin6717d882021-06-15 19:09:41 +01008692 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008693 a := m.Module().(*ApexSet)
8694 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008695 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008696 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8697 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8698 }
8699}
8700
Anton Hansson805e0a52022-11-25 14:06:46 +00008701func TestApexSet_NativeBridge(t *testing.T) {
8702 ctx := testApex(t, `
8703 apex_set {
8704 name: "myapex",
8705 set: "myapex.apks",
8706 filename: "foo_v2.apex",
8707 overrides: ["foo"],
8708 }
8709 `,
8710 android.FixtureModifyConfig(func(config android.Config) {
8711 config.Targets[android.Android] = []android.Target{
8712 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8713 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8714 }
8715 }),
8716 )
8717
8718 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8719
8720 // Check extract_apks tool parameters. No native bridge arch expected
8721 extractedApex := m.Output("extracted/myapex.apks")
8722 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8723}
8724
Jiyong Park7d95a512020-05-10 15:16:24 +09008725func TestNoStaticLinkingToStubsLib(t *testing.T) {
8726 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008731 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008732 }
8733
8734 apex_key {
8735 name: "myapex.key",
8736 public_key: "testkey.avbpubkey",
8737 private_key: "testkey.pem",
8738 }
8739
8740 cc_library {
8741 name: "mylib",
8742 srcs: ["mylib.cpp"],
8743 static_libs: ["otherlib"],
8744 system_shared_libs: [],
8745 stl: "none",
8746 apex_available: [ "myapex" ],
8747 }
8748
8749 cc_library {
8750 name: "otherlib",
8751 srcs: ["mylib.cpp"],
8752 system_shared_libs: [],
8753 stl: "none",
8754 stubs: {
8755 versions: ["1", "2", "3"],
8756 },
8757 apex_available: [ "myapex" ],
8758 }
8759 `)
8760}
8761
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008762func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008763 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008764 apex {
8765 name: "myapex",
8766 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008767 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008768 custom_sign_tool: "sign_myapex",
8769 }
8770
8771 apex_key {
8772 name: "myapex.key",
8773 public_key: "testkey.avbpubkey",
8774 private_key: "testkey.pem",
8775 }
8776 `)
8777
8778 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8779 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8780 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_ext" sign_tool="sign_myapex"`)
8781}
8782
8783func TestApexKeysTxtOverrides(t *testing.T) {
8784 ctx := testApex(t, `
8785 apex {
8786 name: "myapex",
8787 key: "myapex.key",
8788 updatable: false,
8789 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008790 }
8791
8792 apex_key {
8793 name: "myapex.key",
8794 public_key: "testkey.avbpubkey",
8795 private_key: "testkey.pem",
8796 }
8797
8798 prebuilt_apex {
8799 name: "myapex",
8800 prefer: true,
8801 arch: {
8802 arm64: {
8803 src: "myapex-arm64.apex",
8804 },
8805 arm: {
8806 src: "myapex-arm.apex",
8807 },
8808 },
8809 }
8810
8811 apex_set {
8812 name: "myapex_set",
8813 set: "myapex.apks",
8814 filename: "myapex_set.apex",
8815 overrides: ["myapex"],
8816 }
8817 `)
8818
8819 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8820 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8821 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park03a7f3e2020-06-18 19:34:42 +09008822 ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008823}
8824
Jooyung Han938b5932020-06-20 12:47:47 +09008825func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008826 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008827 apex {
8828 name: "myapex",
8829 key: "myapex.key",
8830 apps: ["app"],
8831 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008832 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008833 }
8834
8835 apex_key {
8836 name: "myapex.key",
8837 public_key: "testkey.avbpubkey",
8838 private_key: "testkey.pem",
8839 }
8840
8841 android_app {
8842 name: "app",
8843 srcs: ["foo/bar/MyClass.java"],
8844 package_name: "foo",
8845 sdk_version: "none",
8846 system_modules: "none",
8847 apex_available: [ "myapex" ],
8848 }
8849 `, withFiles(map[string][]byte{
8850 "sub/Android.bp": []byte(`
8851 override_apex {
8852 name: "override_myapex",
8853 base: "myapex",
8854 apps: ["override_app"],
8855 allowed_files: ":allowed",
8856 }
8857 // Overridable "path" property should be referenced indirectly
8858 filegroup {
8859 name: "allowed",
8860 srcs: ["allowed.txt"],
8861 }
8862 override_android_app {
8863 name: "override_app",
8864 base: "app",
8865 package_name: "bar",
8866 }
8867 `),
8868 }))
8869
8870 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8871 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8872 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8873 }
8874
8875 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8876 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8877 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8878 }
8879}
8880
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008881func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008882 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008883 apex {
8884 name: "myapex",
8885 key: "myapex.key",
8886 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008887 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008888 }
8889
8890 apex_key {
8891 name: "myapex.key",
8892 public_key: "testkey.avbpubkey",
8893 private_key: "testkey.pem",
8894 }
8895
8896 cc_library {
8897 name: "mylib",
8898 srcs: ["mylib.cpp"],
8899 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008900 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008901 },
8902 apex_available: ["myapex"],
8903 }
8904
8905 cc_prebuilt_library_shared {
8906 name: "mylib",
8907 prefer: false,
8908 srcs: ["prebuilt.so"],
8909 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008910 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008911 },
8912 apex_available: ["myapex"],
8913 }
8914 `)
8915}
8916
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008917func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008918 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008919 apex {
8920 name: "myapex",
8921 key: "myapex.key",
8922 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008923 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008924 }
8925 apex_key {
8926 name: "myapex.key",
8927 public_key: "testkey.avbpubkey",
8928 private_key: "testkey.pem",
8929 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008930 `,
8931 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8932 variables.CompressedApex = proptools.BoolPtr(true)
8933 }),
8934 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008935
8936 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8937 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8938
8939 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8940 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8941
8942 // Make sure output of bundle is .capex
8943 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8944 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8945
8946 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008947 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008948 var builder strings.Builder
8949 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8950 androidMk := builder.String()
8951 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8952}
8953
Martin Stjernholm2856c662020-12-02 15:03:42 +00008954func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008955 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008956 apex {
8957 name: "myapex",
8958 key: "myapex.key",
8959 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008960 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008961 }
8962
8963 apex_key {
8964 name: "myapex.key",
8965 public_key: "testkey.avbpubkey",
8966 private_key: "testkey.pem",
8967 }
8968
8969 cc_library {
8970 name: "mylib",
8971 srcs: ["mylib.cpp"],
8972 apex_available: ["myapex"],
8973 shared_libs: ["otherlib"],
8974 system_shared_libs: [],
8975 }
8976
8977 cc_library {
8978 name: "otherlib",
8979 srcs: ["mylib.cpp"],
8980 stubs: {
8981 versions: ["current"],
8982 },
8983 }
8984
8985 cc_prebuilt_library_shared {
8986 name: "otherlib",
8987 prefer: true,
8988 srcs: ["prebuilt.so"],
8989 stubs: {
8990 versions: ["current"],
8991 },
8992 }
8993 `)
8994
8995 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008996 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008997 var builder strings.Builder
8998 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8999 androidMk := builder.String()
9000
9001 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9002 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009003 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009004}
9005
Jiyong Parke3867542020-12-03 17:28:25 +09009006func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009007 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009008 apex {
9009 name: "myapex",
9010 key: "myapex.key",
9011 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009012 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009013 }
9014
9015 apex_key {
9016 name: "myapex.key",
9017 public_key: "testkey.avbpubkey",
9018 private_key: "testkey.pem",
9019 }
9020
9021 cc_library {
9022 name: "mylib",
9023 srcs: ["mylib.cpp"],
9024 system_shared_libs: [],
9025 stl: "none",
9026 apex_available: ["myapex"],
9027 shared_libs: ["mylib2"],
9028 target: {
9029 apex: {
9030 exclude_shared_libs: ["mylib2"],
9031 },
9032 },
9033 }
9034
9035 cc_library {
9036 name: "mylib2",
9037 srcs: ["mylib.cpp"],
9038 system_shared_libs: [],
9039 stl: "none",
9040 }
9041 `)
9042
9043 // Check if mylib is linked to mylib2 for the non-apex target
9044 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9045 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9046
9047 // Make sure that the link doesn't occur for the apex target
9048 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9049 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9050
9051 // It shouldn't appear in the copy cmd as well.
9052 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9053 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9054}
9055
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009056func TestPrebuiltStubLibDep(t *testing.T) {
9057 bpBase := `
9058 apex {
9059 name: "myapex",
9060 key: "myapex.key",
9061 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009062 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009063 }
9064 apex_key {
9065 name: "myapex.key",
9066 public_key: "testkey.avbpubkey",
9067 private_key: "testkey.pem",
9068 }
9069 cc_library {
9070 name: "mylib",
9071 srcs: ["mylib.cpp"],
9072 apex_available: ["myapex"],
9073 shared_libs: ["stublib"],
9074 system_shared_libs: [],
9075 }
9076 apex {
9077 name: "otherapex",
9078 enabled: %s,
9079 key: "myapex.key",
9080 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009081 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009082 }
9083 `
9084
9085 stublibSourceBp := `
9086 cc_library {
9087 name: "stublib",
9088 srcs: ["mylib.cpp"],
9089 apex_available: ["otherapex"],
9090 system_shared_libs: [],
9091 stl: "none",
9092 stubs: {
9093 versions: ["1"],
9094 },
9095 }
9096 `
9097
9098 stublibPrebuiltBp := `
9099 cc_prebuilt_library_shared {
9100 name: "stublib",
9101 srcs: ["prebuilt.so"],
9102 apex_available: ["otherapex"],
9103 stubs: {
9104 versions: ["1"],
9105 },
9106 %s
9107 }
9108 `
9109
9110 tests := []struct {
9111 name string
9112 stublibBp string
9113 usePrebuilt bool
9114 modNames []string // Modules to collect AndroidMkEntries for
9115 otherApexEnabled []string
9116 }{
9117 {
9118 name: "only_source",
9119 stublibBp: stublibSourceBp,
9120 usePrebuilt: false,
9121 modNames: []string{"stublib"},
9122 otherApexEnabled: []string{"true", "false"},
9123 },
9124 {
9125 name: "source_preferred",
9126 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9127 usePrebuilt: false,
9128 modNames: []string{"stublib", "prebuilt_stublib"},
9129 otherApexEnabled: []string{"true", "false"},
9130 },
9131 {
9132 name: "prebuilt_preferred",
9133 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9134 usePrebuilt: true,
9135 modNames: []string{"stublib", "prebuilt_stublib"},
9136 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9137 },
9138 {
9139 name: "only_prebuilt",
9140 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9141 usePrebuilt: true,
9142 modNames: []string{"stublib"},
9143 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9144 },
9145 }
9146
9147 for _, test := range tests {
9148 t.Run(test.name, func(t *testing.T) {
9149 for _, otherApexEnabled := range test.otherApexEnabled {
9150 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009151 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009152
9153 type modAndMkEntries struct {
9154 mod *cc.Module
9155 mkEntries android.AndroidMkEntries
9156 }
9157 entries := []*modAndMkEntries{}
9158
9159 // Gather shared lib modules that are installable
9160 for _, modName := range test.modNames {
9161 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9162 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9163 continue
9164 }
9165 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009166 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009167 continue
9168 }
Colin Crossaa255532020-07-03 13:18:24 -07009169 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009170 if ent.Disabled {
9171 continue
9172 }
9173 entries = append(entries, &modAndMkEntries{
9174 mod: mod,
9175 mkEntries: ent,
9176 })
9177 }
9178 }
9179 }
9180
9181 var entry *modAndMkEntries = nil
9182 for _, ent := range entries {
9183 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9184 if entry != nil {
9185 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9186 } else {
9187 entry = ent
9188 }
9189 }
9190 }
9191
9192 if entry == nil {
9193 t.Errorf("AndroidMk entry for \"stublib\" missing")
9194 } else {
9195 isPrebuilt := entry.mod.Prebuilt() != nil
9196 if isPrebuilt != test.usePrebuilt {
9197 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9198 }
9199 if !entry.mod.IsStubs() {
9200 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9201 }
9202 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9203 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9204 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009205 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009206 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009207 if !android.InList(expected, cflags) {
9208 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9209 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009210 }
9211 })
9212 }
9213 })
9214 }
9215}
9216
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009217func TestHostApexInHostOnlyBuild(t *testing.T) {
9218 testApex(t, `
9219 apex {
9220 name: "myapex",
9221 host_supported: true,
9222 key: "myapex.key",
9223 updatable: false,
9224 payload_type: "zip",
9225 }
9226 apex_key {
9227 name: "myapex.key",
9228 public_key: "testkey.avbpubkey",
9229 private_key: "testkey.pem",
9230 }
9231 `,
9232 android.FixtureModifyConfig(func(config android.Config) {
9233 // We may not have device targets in all builds, e.g. in
9234 // prebuilts/build-tools/build-prebuilts.sh
9235 config.Targets[android.Android] = []android.Target{}
9236 }))
9237}
9238
Colin Crossc33e5212021-05-25 18:16:02 -07009239func TestApexJavaCoverage(t *testing.T) {
9240 bp := `
9241 apex {
9242 name: "myapex",
9243 key: "myapex.key",
9244 java_libs: ["mylib"],
9245 bootclasspath_fragments: ["mybootclasspathfragment"],
9246 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9247 updatable: false,
9248 }
9249
9250 apex_key {
9251 name: "myapex.key",
9252 public_key: "testkey.avbpubkey",
9253 private_key: "testkey.pem",
9254 }
9255
9256 java_library {
9257 name: "mylib",
9258 srcs: ["mylib.java"],
9259 apex_available: ["myapex"],
9260 compile_dex: true,
9261 }
9262
9263 bootclasspath_fragment {
9264 name: "mybootclasspathfragment",
9265 contents: ["mybootclasspathlib"],
9266 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009267 hidden_api: {
9268 split_packages: ["*"],
9269 },
Colin Crossc33e5212021-05-25 18:16:02 -07009270 }
9271
9272 java_library {
9273 name: "mybootclasspathlib",
9274 srcs: ["mybootclasspathlib.java"],
9275 apex_available: ["myapex"],
9276 compile_dex: true,
9277 }
9278
9279 systemserverclasspath_fragment {
9280 name: "mysystemserverclasspathfragment",
9281 contents: ["mysystemserverclasspathlib"],
9282 apex_available: ["myapex"],
9283 }
9284
9285 java_library {
9286 name: "mysystemserverclasspathlib",
9287 srcs: ["mysystemserverclasspathlib.java"],
9288 apex_available: ["myapex"],
9289 compile_dex: true,
9290 }
9291 `
9292
9293 result := android.GroupFixturePreparers(
9294 PrepareForTestWithApexBuildComponents,
9295 prepareForTestWithMyapex,
9296 java.PrepareForTestWithJavaDefaultModules,
9297 android.PrepareForTestWithAndroidBuildComponents,
9298 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009299 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9300 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009301 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009302 ).RunTest(t)
9303
9304 // Make sure jacoco ran on both mylib and mybootclasspathlib
9305 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9306 t.Errorf("Failed to find jacoco rule for mylib")
9307 }
9308 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9309 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9310 }
9311 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9312 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9313 }
9314}
9315
Jiyong Park192600a2021-08-03 07:52:17 +00009316func TestProhibitStaticExecutable(t *testing.T) {
9317 testApexError(t, `executable mybin is static`, `
9318 apex {
9319 name: "myapex",
9320 key: "myapex.key",
9321 binaries: ["mybin"],
9322 min_sdk_version: "29",
9323 }
9324
9325 apex_key {
9326 name: "myapex.key",
9327 public_key: "testkey.avbpubkey",
9328 private_key: "testkey.pem",
9329 }
9330
9331 cc_binary {
9332 name: "mybin",
9333 srcs: ["mylib.cpp"],
9334 relative_install_path: "foo/bar",
9335 static_executable: true,
9336 system_shared_libs: [],
9337 stl: "none",
9338 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009339 min_sdk_version: "29",
9340 }
9341 `)
9342
9343 testApexError(t, `executable mybin.rust is static`, `
9344 apex {
9345 name: "myapex",
9346 key: "myapex.key",
9347 binaries: ["mybin.rust"],
9348 min_sdk_version: "29",
9349 }
9350
9351 apex_key {
9352 name: "myapex.key",
9353 public_key: "testkey.avbpubkey",
9354 private_key: "testkey.pem",
9355 }
9356
9357 rust_binary {
9358 name: "mybin.rust",
9359 srcs: ["foo.rs"],
9360 static_executable: true,
9361 apex_available: ["myapex"],
9362 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009363 }
9364 `)
9365}
9366
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009367func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9368 ctx := testApex(t, `
9369 apex {
9370 name: "myapex",
9371 key: "myapex.key",
9372 updatable: false,
9373 java_libs: ["foo"],
9374 }
9375
9376 apex_key {
9377 name: "myapex.key",
9378 public_key: "testkey.avbpubkey",
9379 private_key: "testkey.pem",
9380 }
9381
9382 java_library {
9383 name: "foo",
9384 srcs: ["foo.java"],
9385 apex_available: ["myapex"],
9386 installable: true,
9387 }
9388 `,
9389 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9390 )
9391
9392 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9393 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9394 var builder strings.Builder
9395 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9396 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009397 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.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 +00009398}
9399
9400func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9401 ctx := testApex(t, `
9402 prebuilt_apex {
9403 name: "myapex",
9404 arch: {
9405 arm64: {
9406 src: "myapex-arm64.apex",
9407 },
9408 arm: {
9409 src: "myapex-arm.apex",
9410 },
9411 },
9412 exported_java_libs: ["foo"],
9413 }
9414
9415 java_import {
9416 name: "foo",
9417 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009418 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009419 }
9420 `,
9421 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9422 )
9423
9424 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9425 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9426 mainModuleEntries := entriesList[0]
9427 android.AssertArrayString(t,
9428 "LOCAL_REQUIRED_MODULES",
9429 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9430 []string{
9431 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9432 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9433 })
9434}
9435
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009436func TestAndroidMk_RequiredModules(t *testing.T) {
9437 ctx := testApex(t, `
9438 apex {
9439 name: "myapex",
9440 key: "myapex.key",
9441 updatable: false,
9442 java_libs: ["foo"],
9443 required: ["otherapex"],
9444 }
9445
9446 apex {
9447 name: "otherapex",
9448 key: "myapex.key",
9449 updatable: false,
9450 java_libs: ["foo"],
9451 required: ["otherapex"],
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: "foo",
9462 srcs: ["foo.java"],
9463 apex_available: ["myapex", "otherapex"],
9464 installable: true,
9465 }
9466 `)
9467
9468 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9469 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9470 var builder strings.Builder
9471 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9472 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009473 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009474}
9475
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009476func TestAndroidMk_RequiredDeps(t *testing.T) {
9477 ctx := testApex(t, `
9478 apex {
9479 name: "myapex",
9480 key: "myapex.key",
9481 updatable: false,
9482 }
9483
9484 apex_key {
9485 name: "myapex.key",
9486 public_key: "testkey.avbpubkey",
9487 private_key: "testkey.pem",
9488 }
9489 `)
9490
9491 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009492 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009493 data := android.AndroidMkDataForTest(t, ctx, bundle)
9494 var builder strings.Builder
9495 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9496 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009497 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009498
9499 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009500 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009501 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9502 var flattenedBuilder strings.Builder
9503 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9504 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009505 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009506}
9507
Jooyung Hana6d36672022-02-24 13:58:07 +09009508func TestApexOutputFileProducer(t *testing.T) {
9509 for _, tc := range []struct {
9510 name string
9511 ref string
9512 expected_data []string
9513 }{
9514 {
9515 name: "test_using_output",
9516 ref: ":myapex",
9517 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9518 },
9519 {
9520 name: "test_using_apex",
9521 ref: ":myapex{.apex}",
9522 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9523 },
9524 } {
9525 t.Run(tc.name, func(t *testing.T) {
9526 ctx := testApex(t, `
9527 apex {
9528 name: "myapex",
9529 key: "myapex.key",
9530 compressible: true,
9531 updatable: false,
9532 }
9533
9534 apex_key {
9535 name: "myapex.key",
9536 public_key: "testkey.avbpubkey",
9537 private_key: "testkey.pem",
9538 }
9539
9540 java_test {
9541 name: "`+tc.name+`",
9542 srcs: ["a.java"],
9543 data: ["`+tc.ref+`"],
9544 }
9545 `,
9546 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9547 variables.CompressedApex = proptools.BoolPtr(true)
9548 }))
9549 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9550 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9551 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9552 })
9553 }
9554}
9555
satayev758968a2021-12-06 11:42:40 +00009556func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9557 preparer := android.GroupFixturePreparers(
9558 PrepareForTestWithApexBuildComponents,
9559 prepareForTestWithMyapex,
9560 java.PrepareForTestWithJavaSdkLibraryFiles,
9561 java.PrepareForTestWithJavaDefaultModules,
9562 android.PrepareForTestWithAndroidBuildComponents,
9563 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9564 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9565 )
9566
9567 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9568 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9569 preparer.RunTestWithBp(t, `
9570 apex {
9571 name: "myapex",
9572 key: "myapex.key",
9573 bootclasspath_fragments: ["mybootclasspathfragment"],
9574 min_sdk_version: "30",
9575 updatable: false,
9576 }
9577
9578 apex_key {
9579 name: "myapex.key",
9580 public_key: "testkey.avbpubkey",
9581 private_key: "testkey.pem",
9582 }
9583
9584 bootclasspath_fragment {
9585 name: "mybootclasspathfragment",
9586 contents: ["mybootclasspathlib"],
9587 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009588 hidden_api: {
9589 split_packages: ["*"],
9590 },
satayev758968a2021-12-06 11:42:40 +00009591 }
9592
9593 java_sdk_library {
9594 name: "mybootclasspathlib",
9595 srcs: ["mybootclasspathlib.java"],
9596 apex_available: ["myapex"],
9597 compile_dex: true,
9598 unsafe_ignore_missing_latest_api: true,
9599 min_sdk_version: "31",
9600 static_libs: ["util"],
9601 }
9602
9603 java_library {
9604 name: "util",
9605 srcs: ["a.java"],
9606 apex_available: ["myapex"],
9607 min_sdk_version: "31",
9608 static_libs: ["another_util"],
9609 }
9610
9611 java_library {
9612 name: "another_util",
9613 srcs: ["a.java"],
9614 min_sdk_version: "31",
9615 apex_available: ["myapex"],
9616 }
9617 `)
9618 })
9619
9620 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9621 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9622 preparer.RunTestWithBp(t, `
9623 apex {
9624 name: "myapex",
9625 key: "myapex.key",
9626 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9627 min_sdk_version: "30",
9628 updatable: false,
9629 }
9630
9631 apex_key {
9632 name: "myapex.key",
9633 public_key: "testkey.avbpubkey",
9634 private_key: "testkey.pem",
9635 }
9636
9637 systemserverclasspath_fragment {
9638 name: "mysystemserverclasspathfragment",
9639 contents: ["mysystemserverclasspathlib"],
9640 apex_available: ["myapex"],
9641 }
9642
9643 java_sdk_library {
9644 name: "mysystemserverclasspathlib",
9645 srcs: ["mysystemserverclasspathlib.java"],
9646 apex_available: ["myapex"],
9647 compile_dex: true,
9648 min_sdk_version: "32",
9649 unsafe_ignore_missing_latest_api: true,
9650 static_libs: ["util"],
9651 }
9652
9653 java_library {
9654 name: "util",
9655 srcs: ["a.java"],
9656 apex_available: ["myapex"],
9657 min_sdk_version: "31",
9658 static_libs: ["another_util"],
9659 }
9660
9661 java_library {
9662 name: "another_util",
9663 srcs: ["a.java"],
9664 min_sdk_version: "31",
9665 apex_available: ["myapex"],
9666 }
9667 `)
9668 })
9669
9670 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9671 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9672 RunTestWithBp(t, `
9673 apex {
9674 name: "myapex",
9675 key: "myapex.key",
9676 bootclasspath_fragments: ["mybootclasspathfragment"],
9677 min_sdk_version: "30",
9678 updatable: false,
9679 }
9680
9681 apex_key {
9682 name: "myapex.key",
9683 public_key: "testkey.avbpubkey",
9684 private_key: "testkey.pem",
9685 }
9686
9687 bootclasspath_fragment {
9688 name: "mybootclasspathfragment",
9689 contents: ["mybootclasspathlib"],
9690 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009691 hidden_api: {
9692 split_packages: ["*"],
9693 },
satayev758968a2021-12-06 11:42:40 +00009694 }
9695
9696 java_sdk_library {
9697 name: "mybootclasspathlib",
9698 srcs: ["mybootclasspathlib.java"],
9699 apex_available: ["myapex"],
9700 compile_dex: true,
9701 unsafe_ignore_missing_latest_api: true,
9702 }
9703 `)
9704 })
9705
9706 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9707 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9708 RunTestWithBp(t, `
9709 apex {
9710 name: "myapex",
9711 key: "myapex.key",
9712 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9713 min_sdk_version: "30",
9714 updatable: false,
9715 }
9716
9717 apex_key {
9718 name: "myapex.key",
9719 public_key: "testkey.avbpubkey",
9720 private_key: "testkey.pem",
9721 }
9722
9723 systemserverclasspath_fragment {
9724 name: "mysystemserverclasspathfragment",
9725 contents: ["mysystemserverclasspathlib"],
9726 apex_available: ["myapex"],
9727 }
9728
9729 java_sdk_library {
9730 name: "mysystemserverclasspathlib",
9731 srcs: ["mysystemserverclasspathlib.java"],
9732 apex_available: ["myapex"],
9733 compile_dex: true,
9734 unsafe_ignore_missing_latest_api: true,
9735 }
9736 `)
9737 })
9738}
9739
Jiakai Zhang6decef92022-01-12 17:56:19 +00009740// Verifies that the APEX depends on all the Make modules in the list.
9741func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9742 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9743 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009744 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009745 }
9746}
9747
9748// Verifies that the APEX does not depend on any of the Make modules in the list.
9749func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9750 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9751 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009752 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009753 }
9754}
9755
Cole Faust1021ccd2023-02-26 21:15:25 -08009756// TODO(b/193460475): Re-enable this test
9757//func TestApexStrictUpdtabilityLint(t *testing.T) {
9758// bpTemplate := `
9759// apex {
9760// name: "myapex",
9761// key: "myapex.key",
9762// java_libs: ["myjavalib"],
9763// updatable: %v,
9764// min_sdk_version: "29",
9765// }
9766// apex_key {
9767// name: "myapex.key",
9768// }
9769// java_library {
9770// name: "myjavalib",
9771// srcs: ["MyClass.java"],
9772// apex_available: [ "myapex" ],
9773// lint: {
9774// strict_updatability_linting: %v,
9775// },
9776// sdk_version: "current",
9777// min_sdk_version: "29",
9778// }
9779// `
9780// fs := android.MockFS{
9781// "lint-baseline.xml": nil,
9782// }
9783//
9784// testCases := []struct {
9785// testCaseName string
9786// apexUpdatable bool
9787// javaStrictUpdtabilityLint bool
9788// lintFileExists bool
9789// disallowedFlagExpected bool
9790// }{
9791// {
9792// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9793// apexUpdatable: true,
9794// javaStrictUpdtabilityLint: true,
9795// lintFileExists: false,
9796// disallowedFlagExpected: false,
9797// },
9798// {
9799// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9800// apexUpdatable: false,
9801// javaStrictUpdtabilityLint: false,
9802// lintFileExists: true,
9803// disallowedFlagExpected: false,
9804// },
9805// {
9806// testCaseName: "non-updatable apex respects strict updatability of javalib",
9807// apexUpdatable: false,
9808// javaStrictUpdtabilityLint: true,
9809// lintFileExists: true,
9810// disallowedFlagExpected: true,
9811// },
9812// {
9813// testCaseName: "updatable apex sets strict updatability of javalib to true",
9814// apexUpdatable: true,
9815// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9816// lintFileExists: true,
9817// disallowedFlagExpected: true,
9818// },
9819// }
9820//
9821// for _, testCase := range testCases {
9822// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9823// fixtures := []android.FixturePreparer{}
9824// if testCase.lintFileExists {
9825// fixtures = append(fixtures, fs.AddToFixture())
9826// }
9827//
9828// result := testApex(t, bp, fixtures...)
9829// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9830// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9831// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9832//
9833// if disallowedFlagActual != testCase.disallowedFlagExpected {
9834// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9835// }
9836// }
9837//}
9838//
9839//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9840// bp := `
9841// apex {
9842// name: "myapex",
9843// key: "myapex.key",
9844// java_libs: ["myjavalib"],
9845// updatable: true,
9846// min_sdk_version: "29",
9847// }
9848// apex_key {
9849// name: "myapex.key",
9850// }
9851// java_library {
9852// name: "myjavalib",
9853// srcs: ["MyClass.java"],
9854// apex_available: [ "myapex" ],
9855// sdk_version: "current",
9856// min_sdk_version: "29",
9857// }
9858// `
9859//
9860// testCases := []struct {
9861// testCaseName string
9862// moduleDirectory string
9863// disallowedFlagExpected bool
9864// }{
9865// {
9866// testCaseName: "lintable module defined outside libcore",
9867// moduleDirectory: "",
9868// disallowedFlagExpected: true,
9869// },
9870// {
9871// testCaseName: "lintable module defined in libcore root directory",
9872// moduleDirectory: "libcore/",
9873// disallowedFlagExpected: false,
9874// },
9875// {
9876// testCaseName: "lintable module defined in libcore child directory",
9877// moduleDirectory: "libcore/childdir/",
9878// disallowedFlagExpected: true,
9879// },
9880// }
9881//
9882// for _, testCase := range testCases {
9883// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9884// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9885// result := testApex(t, "", lintFileCreator, bpFileCreator)
9886// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9887// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9888// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9889// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9890//
9891// if disallowedFlagActual != testCase.disallowedFlagExpected {
9892// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9893// }
9894// }
9895//}
9896//
9897//// checks transtive deps of an apex coming from bootclasspath_fragment
9898//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9899// bp := `
9900// apex {
9901// name: "myapex",
9902// key: "myapex.key",
9903// bootclasspath_fragments: ["mybootclasspathfragment"],
9904// updatable: true,
9905// min_sdk_version: "29",
9906// }
9907// apex_key {
9908// name: "myapex.key",
9909// }
9910// bootclasspath_fragment {
9911// name: "mybootclasspathfragment",
9912// contents: ["myjavalib"],
9913// apex_available: ["myapex"],
9914// hidden_api: {
9915// split_packages: ["*"],
9916// },
9917// }
9918// java_library {
9919// name: "myjavalib",
9920// srcs: ["MyClass.java"],
9921// apex_available: [ "myapex" ],
9922// sdk_version: "current",
9923// min_sdk_version: "29",
9924// compile_dex: true,
9925// }
9926// `
9927// fs := android.MockFS{
9928// "lint-baseline.xml": nil,
9929// }
9930//
9931// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9932// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9933// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9934// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9935// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9936// }
9937//}
Spandan Das66773252022-01-15 00:23:18 +00009938
Spandan Das42e89502022-05-06 22:12:55 +00009939// updatable apexes should propagate updatable=true to its apps
9940func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9941 bp := `
9942 apex {
9943 name: "myapex",
9944 key: "myapex.key",
9945 updatable: %v,
9946 apps: [
9947 "myapp",
9948 ],
9949 min_sdk_version: "30",
9950 }
9951 apex_key {
9952 name: "myapex.key",
9953 }
9954 android_app {
9955 name: "myapp",
9956 updatable: %v,
9957 apex_available: [
9958 "myapex",
9959 ],
9960 sdk_version: "current",
9961 min_sdk_version: "30",
9962 }
9963 `
9964 testCases := []struct {
9965 name string
9966 apex_is_updatable_bp bool
9967 app_is_updatable_bp bool
9968 app_is_updatable_expected bool
9969 }{
9970 {
9971 name: "Non-updatable apex respects updatable property of non-updatable app",
9972 apex_is_updatable_bp: false,
9973 app_is_updatable_bp: false,
9974 app_is_updatable_expected: false,
9975 },
9976 {
9977 name: "Non-updatable apex respects updatable property of updatable app",
9978 apex_is_updatable_bp: false,
9979 app_is_updatable_bp: true,
9980 app_is_updatable_expected: true,
9981 },
9982 {
9983 name: "Updatable apex respects updatable property of updatable app",
9984 apex_is_updatable_bp: true,
9985 app_is_updatable_bp: true,
9986 app_is_updatable_expected: true,
9987 },
9988 {
9989 name: "Updatable apex sets updatable=true on non-updatable app",
9990 apex_is_updatable_bp: true,
9991 app_is_updatable_bp: false,
9992 app_is_updatable_expected: true,
9993 },
9994 }
9995 for _, testCase := range testCases {
9996 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9997 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9998 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9999 }
10000}
10001
Kiyoung Kim487689e2022-07-26 09:48:22 +090010002func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10003 bp := `
10004 apex {
10005 name: "myapex",
10006 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010007 native_shared_libs: ["libbaz"],
10008 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010009 min_sdk_version: "29",
10010 }
10011 apex_key {
10012 name: "myapex.key",
10013 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010014 cc_binary {
10015 name: "binfoo",
10016 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010017 apex_available: ["myapex"],
10018 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010019 recovery_available: false,
10020 }
10021 cc_library {
10022 name: "libbar",
10023 srcs: ["libbar.cc"],
10024 stubs: {
10025 symbol_file: "libbar.map.txt",
10026 versions: [
10027 "29",
10028 ],
10029 },
10030 }
10031 cc_library {
10032 name: "libbaz",
10033 srcs: ["libbaz.cc"],
10034 apex_available: ["myapex"],
10035 min_sdk_version: "29",
10036 stubs: {
10037 symbol_file: "libbaz.map.txt",
10038 versions: [
10039 "29",
10040 ],
10041 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010042 }
10043 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010044 name: "libbar",
10045 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010046 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010047 variants: ["apex.29"],
10048 }
10049 cc_api_variant {
10050 name: "libbar",
10051 variant: "apex",
10052 version: "29",
10053 src: "libbar_apex_29.so",
10054 }
10055 cc_api_library {
10056 name: "libbaz",
10057 src: "libbaz_stub.so",
10058 min_sdk_version: "29",
10059 variants: ["apex.29"],
10060 }
10061 cc_api_variant {
10062 name: "libbaz",
10063 variant: "apex",
10064 version: "29",
10065 src: "libbaz_apex_29.so",
10066 }
10067 cc_api_library {
10068 name: "libqux",
10069 src: "libqux_stub.so",
10070 min_sdk_version: "29",
10071 variants: ["apex.29"],
10072 }
10073 cc_api_variant {
10074 name: "libqux",
10075 variant: "apex",
10076 version: "29",
10077 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010078 }
10079 api_imports {
10080 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010081 apex_shared_libs: [
10082 "libbar",
10083 "libbaz",
10084 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010085 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010086 }
10087 `
10088 result := testApex(t, bp)
10089
10090 hasDep := func(m android.Module, wantDep android.Module) bool {
10091 t.Helper()
10092 var found bool
10093 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10094 if dep == wantDep {
10095 found = true
10096 }
10097 })
10098 return found
10099 }
10100
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010101 // Library defines stubs and cc_api_library should be used with cc_api_library
10102 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10103 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10104 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010105
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010106 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10107 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010108
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010109 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10110 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10111 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10112 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10113
10114 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10115 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10116 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10117 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10118 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10119
10120 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10121 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10122 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10123
10124 // cc_api_library defined without original library should be linked with cc_api_library
10125 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10126 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10127 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10128}
10129
10130func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10131 bp := `
10132 apex {
10133 name: "myapex",
10134 key: "myapex.key",
10135 native_shared_libs: ["libbar"],
10136 min_sdk_version: "29",
10137 }
10138 apex_key {
10139 name: "myapex.key",
10140 }
10141 cc_binary {
10142 name: "binfoo",
10143 shared_libs: ["libbar"],
10144 recovery_available: false,
10145 }
10146 cc_library {
10147 name: "libbar",
10148 srcs: ["libbar.cc"],
10149 apex_available: ["myapex"],
10150 min_sdk_version: "29",
10151 stubs: {
10152 symbol_file: "libbar.map.txt",
10153 versions: [
10154 "29",
10155 ],
10156 },
10157 }
10158 cc_api_library {
10159 name: "libbar",
10160 src: "libbar_stub.so",
10161 variants: ["apex.29"],
10162 }
10163 cc_api_variant {
10164 name: "libbar",
10165 variant: "apex",
10166 version: "29",
10167 src: "libbar_apex_29.so",
10168 }
10169 api_imports {
10170 name: "api_imports",
10171 apex_shared_libs: [
10172 "libbar",
10173 ],
10174 }
10175 `
10176
10177 result := testApex(t, bp)
10178
10179 hasDep := func(m android.Module, wantDep android.Module) bool {
10180 t.Helper()
10181 var found bool
10182 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10183 if dep == wantDep {
10184 found = true
10185 }
10186 })
10187 return found
10188 }
10189
10190 // Library defines stubs and cc_api_library should be used with cc_api_library
10191 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10192 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10193 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10194
10195 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10196 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10197
10198 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10199 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10200 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10201 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010202}
Dennis Shend4f5d932023-01-31 20:27:21 +000010203
10204func TestTrimmedApex(t *testing.T) {
10205 bp := `
10206 apex {
10207 name: "myapex",
10208 key: "myapex.key",
10209 native_shared_libs: ["libfoo","libbaz"],
10210 min_sdk_version: "29",
10211 trim_against: "mydcla",
10212 }
10213 apex {
10214 name: "mydcla",
10215 key: "myapex.key",
10216 native_shared_libs: ["libfoo","libbar"],
10217 min_sdk_version: "29",
10218 file_contexts: ":myapex-file_contexts",
10219 dynamic_common_lib_apex: true,
10220 }
10221 apex_key {
10222 name: "myapex.key",
10223 }
10224 cc_library {
10225 name: "libfoo",
10226 shared_libs: ["libc"],
10227 apex_available: ["myapex","mydcla"],
10228 min_sdk_version: "29",
10229 }
10230 cc_library {
10231 name: "libbar",
10232 shared_libs: ["libc"],
10233 apex_available: ["myapex","mydcla"],
10234 min_sdk_version: "29",
10235 }
10236 cc_library {
10237 name: "libbaz",
10238 shared_libs: ["libc"],
10239 apex_available: ["myapex","mydcla"],
10240 min_sdk_version: "29",
10241 }
10242 cc_api_library {
10243 name: "libc",
10244 src: "libc.so",
10245 min_sdk_version: "29",
10246 recovery_available: true,
10247 }
10248 api_imports {
10249 name: "api_imports",
10250 shared_libs: [
10251 "libc",
10252 ],
10253 header_libs: [],
10254 }
10255 `
10256 ctx := testApex(t, bp)
10257 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10258 apexRule := module.MaybeRule("apexRule")
10259 if apexRule.Rule == nil {
10260 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10261 }
10262
10263 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10264 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10265 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10266 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10267 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10268 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10269}
Jingwen Chendea7a642023-03-28 11:30:50 +000010270
10271func TestCannedFsConfig(t *testing.T) {
10272 ctx := testApex(t, `
10273 apex {
10274 name: "myapex",
10275 key: "myapex.key",
10276 updatable: false,
10277 }
10278
10279 apex_key {
10280 name: "myapex.key",
10281 public_key: "testkey.avbpubkey",
10282 private_key: "testkey.pem",
10283 }`)
10284 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10285 generateFsRule := mod.Rule("generateFsConfig")
10286 cmd := generateFsRule.RuleParams.Command
10287
10288 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10289}
10290
10291func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10292 ctx := testApex(t, `
10293 apex {
10294 name: "myapex",
10295 key: "myapex.key",
10296 canned_fs_config: "my_config",
10297 updatable: false,
10298 }
10299
10300 apex_key {
10301 name: "myapex.key",
10302 public_key: "testkey.avbpubkey",
10303 private_key: "testkey.pem",
10304 }`)
10305 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10306 generateFsRule := mod.Rule("generateFsConfig")
10307 cmd := generateFsRule.RuleParams.Command
10308
10309 // Ensure that canned_fs_config has "cat my_config" at the end
10310 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10311}
Spandan Das20fce2d2023-04-12 17:21:39 +000010312
10313func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10314 testCases := []struct {
10315 desc string
10316 hasStubs bool
10317 apexAvailable string
10318 expectedError string
10319 }{
10320 {
10321 desc: "non-stub library can have multiple apex_available",
10322 hasStubs: false,
10323 apexAvailable: `["myapex", "otherapex"]`,
10324 },
10325 {
10326 desc: "stub library should not be available to anyapex",
10327 hasStubs: true,
10328 apexAvailable: `["//apex_available:anyapex"]`,
10329 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10330 },
10331 {
10332 desc: "stub library should not be available to multiple apexes",
10333 hasStubs: true,
10334 apexAvailable: `["myapex", "otherapex"]`,
10335 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10336 },
10337 {
10338 desc: "stub library can be available to a core apex and a test apex",
10339 hasStubs: true,
10340 apexAvailable: `["myapex", "test_myapex"]`,
10341 },
10342 }
10343 bpTemplate := `
10344 cc_library {
10345 name: "libfoo",
10346 %v
10347 apex_available: %v,
10348 }
10349 apex {
10350 name: "myapex",
10351 key: "apex.key",
10352 updatable: false,
10353 native_shared_libs: ["libfoo"],
10354 }
10355 apex {
10356 name: "otherapex",
10357 key: "apex.key",
10358 updatable: false,
10359 }
10360 apex_test {
10361 name: "test_myapex",
10362 key: "apex.key",
10363 updatable: false,
10364 native_shared_libs: ["libfoo"],
10365 }
10366 apex_key {
10367 name: "apex.key",
10368 }
10369 `
10370 for _, tc := range testCases {
10371 stubs := ""
10372 if tc.hasStubs {
10373 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10374 }
10375 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10376 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10377 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10378 })
10379 if tc.expectedError == "" {
10380 testApex(t, bp, mockFsFixturePreparer)
10381 } else {
10382 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10383 }
10384 }
10385}