blob: 4a4ee4408a09e7c22aeb81aed178aeadd2c839a6 [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 },
Paul Duffina02cae32021-03-09 01:44:06 +00001463 } `)
1464 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001465
1466 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1467 "lib64/bionic/libc.so",
1468 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1469 })
1470
Colin Cross4c4c1be2022-02-10 11:41:18 -08001471 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001472
1473 installed := hwasan.Description("install libclang_rt.hwasan")
1474 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1475
1476 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1477 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1478 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1479}
1480
1481func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001482 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001483 prepareForTestOfRuntimeApexWithHwasan,
1484 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1485 variables.SanitizeDevice = []string{"hwaddress"}
1486 }),
1487 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001488 cc_library {
1489 name: "libc",
1490 no_libcrt: true,
1491 nocrt: true,
1492 stl: "none",
1493 system_shared_libs: [],
1494 stubs: { versions: ["1"] },
1495 apex_available: ["com.android.runtime"],
1496 }
1497
1498 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001499 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001500 no_libcrt: true,
1501 nocrt: true,
1502 stl: "none",
1503 system_shared_libs: [],
1504 srcs: [""],
1505 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001506 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001507
1508 sanitize: {
1509 never: true,
1510 },
1511 }
Paul Duffina02cae32021-03-09 01:44:06 +00001512 `)
1513 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001514
1515 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1516 "lib64/bionic/libc.so",
1517 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1518 })
1519
Colin Cross4c4c1be2022-02-10 11:41:18 -08001520 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001521
1522 installed := hwasan.Description("install libclang_rt.hwasan")
1523 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1524
1525 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1526 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1527 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1528}
1529
Jooyung Han61b66e92020-03-21 14:21:46 +00001530func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1531 testcases := []struct {
1532 name string
1533 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001534 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001535 shouldLink string
1536 shouldNotLink []string
1537 }{
1538 {
Jiyong Park55549df2021-02-26 23:57:23 +09001539 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001540 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001541 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001542 shouldLink: "current",
1543 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001544 },
1545 {
Jiyong Park55549df2021-02-26 23:57:23 +09001546 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001547 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001548 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001549 shouldLink: "current",
1550 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001551 },
1552 }
1553 for _, tc := range testcases {
1554 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001555 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001556 apex {
1557 name: "myapex",
1558 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001560 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001561 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001562 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001563
Jooyung Han61b66e92020-03-21 14:21:46 +00001564 apex_key {
1565 name: "myapex.key",
1566 public_key: "testkey.avbpubkey",
1567 private_key: "testkey.pem",
1568 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001569
Jooyung Han61b66e92020-03-21 14:21:46 +00001570 cc_library {
1571 name: "mylib",
1572 srcs: ["mylib.cpp"],
1573 vendor_available: true,
1574 shared_libs: ["libbar"],
1575 system_shared_libs: [],
1576 stl: "none",
1577 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001578 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001579 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001580
Jooyung Han61b66e92020-03-21 14:21:46 +00001581 cc_library {
1582 name: "libbar",
1583 srcs: ["mylib.cpp"],
1584 system_shared_libs: [],
1585 stl: "none",
1586 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001587 llndk: {
1588 symbol_file: "libbar.map.txt",
1589 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001591 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001592 withUnbundledBuild,
1593 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001594
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 // Ensure that LLNDK dep is not included
1596 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1597 "lib64/mylib.so",
1598 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Jooyung Han61b66e92020-03-21 14:21:46 +00001600 // Ensure that LLNDK dep is required
1601 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1602 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1603 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001604
Steven Moreland2c4000c2021-04-27 02:08:49 +00001605 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1606 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001607 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001608 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001609 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001610
Steven Moreland2c4000c2021-04-27 02:08:49 +00001611 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001612 ver := tc.shouldLink
1613 if tc.shouldLink == "current" {
1614 ver = strconv.Itoa(android.FutureApiLevelInt)
1615 }
1616 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001617 })
1618 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001619}
1620
Jiyong Park25fc6a92018-11-18 18:02:45 +09001621func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001622 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 apex {
1624 name: "myapex",
1625 key: "myapex.key",
1626 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001627 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001628 }
1629
1630 apex_key {
1631 name: "myapex.key",
1632 public_key: "testkey.avbpubkey",
1633 private_key: "testkey.pem",
1634 }
1635
1636 cc_library {
1637 name: "mylib",
1638 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001639 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001640 shared_libs: ["libdl#27"],
1641 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001642 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001643 }
1644
1645 cc_library_shared {
1646 name: "mylib_shared",
1647 srcs: ["mylib.cpp"],
1648 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 {
Jiyong Parkb0788572018-12-20 22:10:17 +09001654 name: "libBootstrap",
1655 srcs: ["mylib.cpp"],
1656 stl: "none",
1657 bootstrap: true,
1658 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001659 `)
1660
Sundong Ahnabb64432019-10-22 13:58:29 +09001661 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 copyCmds := apexRule.Args["copy_commands"]
1663
1664 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001665 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001666 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1667 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001668
1669 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001670 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001671
Colin Crossaede88c2020-08-11 12:17:01 -07001672 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1673 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1674 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001675
1676 // For dependency to libc
1677 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001678 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001680 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001681 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001682 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1683 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001684
1685 // For dependency to libm
1686 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001687 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001688 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001689 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001690 // ... and is not compiling with the stub
1691 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1692 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1693
1694 // For dependency to libdl
1695 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001696 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1699 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001700 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001701 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001702 // ... Cflags from stub is correctly exported to mylib
1703 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1704 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001705
1706 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001707 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1708 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1709 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1710 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001711}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001712
Jooyung Han749dc692020-04-15 11:03:39 +09001713func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001714 // there are three links between liba --> libz.
1715 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001716 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001717 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001718 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001719 apex {
1720 name: "myapex",
1721 key: "myapex.key",
1722 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001724 }
1725
1726 apex {
1727 name: "otherapex",
1728 key: "myapex.key",
1729 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001730 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001731 }
1732
1733 apex_key {
1734 name: "myapex.key",
1735 public_key: "testkey.avbpubkey",
1736 private_key: "testkey.pem",
1737 }
1738
1739 cc_library {
1740 name: "libx",
1741 shared_libs: ["liba"],
1742 system_shared_libs: [],
1743 stl: "none",
1744 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001745 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001746 }
1747
1748 cc_library {
1749 name: "liby",
1750 shared_libs: ["liba"],
1751 system_shared_libs: [],
1752 stl: "none",
1753 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001754 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001755 }
1756
1757 cc_library {
1758 name: "liba",
1759 shared_libs: ["libz"],
1760 system_shared_libs: [],
1761 stl: "none",
1762 apex_available: [
1763 "//apex_available:anyapex",
1764 "//apex_available:platform",
1765 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001766 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001767 }
1768
1769 cc_library {
1770 name: "libz",
1771 system_shared_libs: [],
1772 stl: "none",
1773 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001774 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001775 },
1776 }
Jooyung Han749dc692020-04-15 11:03:39 +09001777 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001778
1779 expectLink := func(from, from_variant, to, to_variant string) {
1780 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1781 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1782 }
1783 expectNoLink := func(from, from_variant, to, to_variant string) {
1784 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1785 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1786 }
1787 // platform liba is linked to non-stub version
1788 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001789 // liba in myapex is linked to current
1790 expectLink("liba", "shared_apex29", "libz", "shared_current")
1791 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001792 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001793 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001794 // liba in otherapex is linked to current
1795 expectLink("liba", "shared_apex30", "libz", "shared_current")
1796 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001797 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1798 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001799}
1800
Jooyung Hanaed150d2020-04-02 01:41:41 +09001801func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001802 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001803 apex {
1804 name: "myapex",
1805 key: "myapex.key",
1806 native_shared_libs: ["libx"],
1807 min_sdk_version: "R",
1808 }
1809
1810 apex_key {
1811 name: "myapex.key",
1812 public_key: "testkey.avbpubkey",
1813 private_key: "testkey.pem",
1814 }
1815
1816 cc_library {
1817 name: "libx",
1818 shared_libs: ["libz"],
1819 system_shared_libs: [],
1820 stl: "none",
1821 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001822 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001823 }
1824
1825 cc_library {
1826 name: "libz",
1827 system_shared_libs: [],
1828 stl: "none",
1829 stubs: {
1830 versions: ["29", "R"],
1831 },
1832 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001833 `,
1834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1835 variables.Platform_version_active_codenames = []string{"R"}
1836 }),
1837 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001838
1839 expectLink := func(from, from_variant, to, to_variant string) {
1840 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1841 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1842 }
1843 expectNoLink := func(from, from_variant, to, to_variant string) {
1844 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1845 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1846 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001847 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1848 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001849 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1850 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001851}
1852
Jooyung Han4c4da062021-06-23 10:23:16 +09001853func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1854 testApex(t, `
1855 apex {
1856 name: "myapex",
1857 key: "myapex.key",
1858 java_libs: ["libx"],
1859 min_sdk_version: "S",
1860 }
1861
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867
1868 java_library {
1869 name: "libx",
1870 srcs: ["a.java"],
1871 apex_available: [ "myapex" ],
1872 sdk_version: "current",
1873 min_sdk_version: "S", // should be okay
1874 }
1875 `,
1876 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1877 variables.Platform_version_active_codenames = []string{"S"}
1878 variables.Platform_sdk_codename = proptools.StringPtr("S")
1879 }),
1880 )
1881}
1882
Jooyung Han749dc692020-04-15 11:03:39 +09001883func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001884 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001885 apex {
1886 name: "myapex",
1887 key: "myapex.key",
1888 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001889 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 apex_key {
1893 name: "myapex.key",
1894 public_key: "testkey.avbpubkey",
1895 private_key: "testkey.pem",
1896 }
1897
1898 cc_library {
1899 name: "libx",
1900 shared_libs: ["libz"],
1901 system_shared_libs: [],
1902 stl: "none",
1903 apex_available: [ "myapex" ],
1904 }
1905
1906 cc_library {
1907 name: "libz",
1908 system_shared_libs: [],
1909 stl: "none",
1910 stubs: {
1911 versions: ["1", "2"],
1912 },
1913 }
1914 `)
1915
1916 expectLink := func(from, from_variant, to, to_variant string) {
1917 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1918 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1919 }
1920 expectNoLink := func(from, from_variant, to, to_variant string) {
1921 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1922 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1923 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001924 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001925 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001926 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001927 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001928}
1929
Jooyung Handfc864c2023-03-20 18:19:07 +09001930func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001931 ctx := testApex(t, `
1932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001936 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001937 vendor: true,
1938 min_sdk_version: "29",
1939 }
1940
1941 apex_key {
1942 name: "myapex.key",
1943 public_key: "testkey.avbpubkey",
1944 private_key: "testkey.pem",
1945 }
1946
1947 cc_library {
1948 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001949 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001950 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001951 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001952 shared_libs: ["libbar"],
1953 }
1954
1955 cc_library {
1956 name: "libbar",
1957 stubs: { versions: ["29", "30"] },
1958 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001959 }
1960 `)
1961
1962 vendorVariant := "android_vendor.29_arm64_armv8-a"
1963
Jooyung Handfc864c2023-03-20 18:19:07 +09001964 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1965
1966 // Ensure that mylib links with "current" LLNDK
1967 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1968 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1969
1970 // Ensure that mylib is targeting 29
1971 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1972 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1973
1974 // Ensure that the correct variant of crtbegin_so is used.
1975 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1976 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001977
1978 // Ensure that the crtbegin_so used by the APEX is targeting 29
1979 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1980 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1981}
1982
Jooyung Han4495f842023-04-25 16:39:59 +09001983func TestTrackAllowedDeps(t *testing.T) {
1984 ctx := testApex(t, `
1985 apex {
1986 name: "myapex",
1987 key: "myapex.key",
1988 updatable: true,
1989 native_shared_libs: [
1990 "mylib",
1991 "yourlib",
1992 ],
1993 min_sdk_version: "29",
1994 }
1995
1996 apex {
1997 name: "myapex2",
1998 key: "myapex.key",
1999 updatable: false,
2000 native_shared_libs: ["yourlib"],
2001 }
2002
2003 apex_key {
2004 name: "myapex.key",
2005 public_key: "testkey.avbpubkey",
2006 private_key: "testkey.pem",
2007 }
2008
2009 cc_library {
2010 name: "mylib",
2011 srcs: ["mylib.cpp"],
2012 shared_libs: ["libbar"],
2013 min_sdk_version: "29",
2014 apex_available: ["myapex"],
2015 }
2016
2017 cc_library {
2018 name: "libbar",
2019 stubs: { versions: ["29", "30"] },
2020 }
2021
2022 cc_library {
2023 name: "yourlib",
2024 srcs: ["mylib.cpp"],
2025 min_sdk_version: "29",
2026 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2027 }
2028 `, withFiles(android.MockFS{
2029 "packages/modules/common/build/allowed_deps.txt": nil,
2030 }))
2031
2032 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2033 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2034 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2035 "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
2036 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2037 "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
2038
2039 myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
2040 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2041 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2042 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2043 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2044 flatlist, "mylib:(minSdkVersion:29)")
2045 android.AssertStringListContains(t, "track platform-available lib",
2046 flatlist, "yourlib(minSdkVersion:29)")
2047}
2048
2049func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2050 ctx := testApex(t, `
2051 apex {
2052 name: "myapex",
2053 key: "myapex.key",
2054 updatable: true,
2055 min_sdk_version: "29",
2056 }
2057
2058 apex_key {
2059 name: "myapex.key",
2060 public_key: "testkey.avbpubkey",
2061 private_key: "testkey.pem",
2062 }
2063 `)
2064 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2065 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2066 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2067 }
2068}
2069
Jooyung Han03b51852020-02-26 22:45:42 +09002070func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002071 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002072 apex {
2073 name: "myapex",
2074 key: "myapex.key",
2075 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002076 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002077 }
2078
2079 apex_key {
2080 name: "myapex.key",
2081 public_key: "testkey.avbpubkey",
2082 private_key: "testkey.pem",
2083 }
2084
2085 cc_library {
2086 name: "libx",
2087 system_shared_libs: [],
2088 stl: "none",
2089 apex_available: [ "myapex" ],
2090 stubs: {
2091 versions: ["1", "2"],
2092 },
2093 }
2094
2095 cc_library {
2096 name: "libz",
2097 shared_libs: ["libx"],
2098 system_shared_libs: [],
2099 stl: "none",
2100 }
2101 `)
2102
2103 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002104 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002105 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2106 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2107 }
2108 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002109 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002110 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2111 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2112 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002113 expectLink("libz", "shared", "libx", "shared_current")
2114 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002115 expectNoLink("libz", "shared", "libz", "shared_1")
2116 expectNoLink("libz", "shared", "libz", "shared")
2117}
2118
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002119var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2120 func(variables android.FixtureProductVariables) {
2121 variables.SanitizeDevice = []string{"hwaddress"}
2122 },
2123)
2124
Jooyung Han75568392020-03-20 04:29:24 +09002125func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002126 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 native_shared_libs: ["libx"],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex_key {
2135 name: "myapex.key",
2136 public_key: "testkey.avbpubkey",
2137 private_key: "testkey.pem",
2138 }
2139
2140 cc_library {
2141 name: "libx",
2142 shared_libs: ["libbar"],
2143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002144 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002145 }
2146
2147 cc_library {
2148 name: "libbar",
2149 stubs: {
2150 versions: ["29", "30"],
2151 },
2152 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002153 `,
2154 prepareForTestWithSantitizeHwaddress,
2155 )
Jooyung Han03b51852020-02-26 22:45:42 +09002156 expectLink := func(from, from_variant, to, to_variant string) {
2157 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2158 libFlags := ld.Args["libFlags"]
2159 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2160 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002161 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002162}
2163
Jooyung Han75568392020-03-20 04:29:24 +09002164func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
2170 min_sdk_version: "29",
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002182 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002183 }
Jooyung Han75568392020-03-20 04:29:24 +09002184 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002185
2186 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002187 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002188 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002189 // note that platform variant is not.
2190 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002191 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002192}
2193
Jooyung Han749dc692020-04-15 11:03:39 +09002194func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2195 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002196 apex {
2197 name: "myapex",
2198 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002199 native_shared_libs: ["mylib"],
2200 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002201 }
2202
2203 apex_key {
2204 name: "myapex.key",
2205 public_key: "testkey.avbpubkey",
2206 private_key: "testkey.pem",
2207 }
Jooyung Han749dc692020-04-15 11:03:39 +09002208
2209 cc_library {
2210 name: "mylib",
2211 srcs: ["mylib.cpp"],
2212 system_shared_libs: [],
2213 stl: "none",
2214 apex_available: [
2215 "myapex",
2216 ],
2217 min_sdk_version: "30",
2218 }
2219 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002220
2221 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2222 apex {
2223 name: "myapex",
2224 key: "myapex.key",
2225 native_shared_libs: ["libfoo.ffi"],
2226 min_sdk_version: "29",
2227 }
2228
2229 apex_key {
2230 name: "myapex.key",
2231 public_key: "testkey.avbpubkey",
2232 private_key: "testkey.pem",
2233 }
2234
2235 rust_ffi_shared {
2236 name: "libfoo.ffi",
2237 srcs: ["foo.rs"],
2238 crate_name: "foo",
2239 apex_available: [
2240 "myapex",
2241 ],
2242 min_sdk_version: "30",
2243 }
2244 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002245
2246 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2247 apex {
2248 name: "myapex",
2249 key: "myapex.key",
2250 java_libs: ["libfoo"],
2251 min_sdk_version: "29",
2252 }
2253
2254 apex_key {
2255 name: "myapex.key",
2256 public_key: "testkey.avbpubkey",
2257 private_key: "testkey.pem",
2258 }
2259
2260 java_import {
2261 name: "libfoo",
2262 jars: ["libfoo.jar"],
2263 apex_available: [
2264 "myapex",
2265 ],
2266 min_sdk_version: "30",
2267 }
2268 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002269
2270 // Skip check for modules compiling against core API surface
2271 testApex(t, `
2272 apex {
2273 name: "myapex",
2274 key: "myapex.key",
2275 java_libs: ["libfoo"],
2276 min_sdk_version: "29",
2277 }
2278
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284
2285 java_library {
2286 name: "libfoo",
2287 srcs: ["Foo.java"],
2288 apex_available: [
2289 "myapex",
2290 ],
2291 // Compile against core API surface
2292 sdk_version: "core_current",
2293 min_sdk_version: "30",
2294 }
2295 `)
2296
Jooyung Han749dc692020-04-15 11:03:39 +09002297}
2298
2299func TestApexMinSdkVersion_Okay(t *testing.T) {
2300 testApex(t, `
2301 apex {
2302 name: "myapex",
2303 key: "myapex.key",
2304 native_shared_libs: ["libfoo"],
2305 java_libs: ["libbar"],
2306 min_sdk_version: "29",
2307 }
2308
2309 apex_key {
2310 name: "myapex.key",
2311 public_key: "testkey.avbpubkey",
2312 private_key: "testkey.pem",
2313 }
2314
2315 cc_library {
2316 name: "libfoo",
2317 srcs: ["mylib.cpp"],
2318 shared_libs: ["libfoo_dep"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 cc_library {
2324 name: "libfoo_dep",
2325 srcs: ["mylib.cpp"],
2326 apex_available: ["myapex"],
2327 min_sdk_version: "29",
2328 }
2329
2330 java_library {
2331 name: "libbar",
2332 sdk_version: "current",
2333 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002334 static_libs: [
2335 "libbar_dep",
2336 "libbar_import_dep",
2337 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002338 apex_available: ["myapex"],
2339 min_sdk_version: "29",
2340 }
2341
2342 java_library {
2343 name: "libbar_dep",
2344 sdk_version: "current",
2345 srcs: ["a.java"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002349
2350 java_import {
2351 name: "libbar_import_dep",
2352 jars: ["libbar.jar"],
2353 apex_available: ["myapex"],
2354 min_sdk_version: "29",
2355 }
Jooyung Han03b51852020-02-26 22:45:42 +09002356 `)
2357}
2358
Colin Cross8ca61c12022-10-06 21:00:14 -07002359func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2360 // Tests that an apex dependency with min_sdk_version higher than the
2361 // min_sdk_version of the apex is allowed as long as the dependency's
2362 // min_sdk_version is less than or equal to the api level that the
2363 // architecture was introduced in. In this case, arm64 didn't exist
2364 // until api level 21, so the arm64 code will never need to run on
2365 // an api level 20 device, even if other architectures of the apex
2366 // will.
2367 testApex(t, `
2368 apex {
2369 name: "myapex",
2370 key: "myapex.key",
2371 native_shared_libs: ["libfoo"],
2372 min_sdk_version: "20",
2373 }
2374
2375 apex_key {
2376 name: "myapex.key",
2377 public_key: "testkey.avbpubkey",
2378 private_key: "testkey.pem",
2379 }
2380
2381 cc_library {
2382 name: "libfoo",
2383 srcs: ["mylib.cpp"],
2384 apex_available: ["myapex"],
2385 min_sdk_version: "21",
2386 stl: "none",
2387 }
2388 `)
2389}
2390
Artur Satayev8cf899a2020-04-15 17:29:42 +01002391func TestJavaStableSdkVersion(t *testing.T) {
2392 testCases := []struct {
2393 name string
2394 expectedError string
2395 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002396 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002397 }{
2398 {
2399 name: "Non-updatable apex with non-stable dep",
2400 bp: `
2401 apex {
2402 name: "myapex",
2403 java_libs: ["myjar"],
2404 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002405 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002406 }
2407 apex_key {
2408 name: "myapex.key",
2409 public_key: "testkey.avbpubkey",
2410 private_key: "testkey.pem",
2411 }
2412 java_library {
2413 name: "myjar",
2414 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002415 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002416 apex_available: ["myapex"],
2417 }
2418 `,
2419 },
2420 {
2421 name: "Updatable apex with stable dep",
2422 bp: `
2423 apex {
2424 name: "myapex",
2425 java_libs: ["myjar"],
2426 key: "myapex.key",
2427 updatable: true,
2428 min_sdk_version: "29",
2429 }
2430 apex_key {
2431 name: "myapex.key",
2432 public_key: "testkey.avbpubkey",
2433 private_key: "testkey.pem",
2434 }
2435 java_library {
2436 name: "myjar",
2437 srcs: ["foo/bar/MyClass.java"],
2438 sdk_version: "current",
2439 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002440 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }
2442 `,
2443 },
2444 {
2445 name: "Updatable apex with non-stable dep",
2446 expectedError: "cannot depend on \"myjar\"",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
2452 updatable: true,
2453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002468 name: "Updatable apex with non-stable legacy core platform dep",
2469 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2470 bp: `
2471 apex {
2472 name: "myapex",
2473 java_libs: ["myjar-uses-legacy"],
2474 key: "myapex.key",
2475 updatable: true,
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar-uses-legacy",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "core_platform",
2486 apex_available: ["myapex"],
2487 }
2488 `,
2489 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2490 },
2491 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002492 name: "Updatable apex with non-stable transitive dep",
2493 // This is not actually detecting that the transitive dependency is unstable, rather it is
2494 // detecting that the transitive dependency is building against a wider API surface than the
2495 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002496 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002497 bp: `
2498 apex {
2499 name: "myapex",
2500 java_libs: ["myjar"],
2501 key: "myapex.key",
2502 updatable: true,
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 java_library {
2510 name: "myjar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "current",
2513 apex_available: ["myapex"],
2514 static_libs: ["transitive-jar"],
2515 }
2516 java_library {
2517 name: "transitive-jar",
2518 srcs: ["foo/bar/MyClass.java"],
2519 sdk_version: "core_platform",
2520 apex_available: ["myapex"],
2521 }
2522 `,
2523 },
2524 }
2525
2526 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002527 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2528 continue
2529 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002530 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002531 errorHandler := android.FixtureExpectsNoErrors
2532 if test.expectedError != "" {
2533 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002534 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 android.GroupFixturePreparers(
2536 java.PrepareForTestWithJavaDefaultModules,
2537 PrepareForTestWithApexBuildComponents,
2538 prepareForTestWithMyapex,
2539 android.OptionalFixturePreparer(test.preparer),
2540 ).
2541 ExtendWithErrorHandler(errorHandler).
2542 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002543 })
2544 }
2545}
2546
Jooyung Han749dc692020-04-15 11:03:39 +09002547func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2548 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["mylib"],
2553 min_sdk_version: "29",
2554 }
2555
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561
2562 cc_library {
2563 name: "mylib",
2564 srcs: ["mylib.cpp"],
2565 shared_libs: ["mylib2"],
2566 system_shared_libs: [],
2567 stl: "none",
2568 apex_available: [
2569 "myapex",
2570 ],
2571 min_sdk_version: "29",
2572 }
2573
2574 // indirect part of the apex
2575 cc_library {
2576 name: "mylib2",
2577 srcs: ["mylib.cpp"],
2578 system_shared_libs: [],
2579 stl: "none",
2580 apex_available: [
2581 "myapex",
2582 ],
2583 min_sdk_version: "30",
2584 }
2585 `)
2586}
2587
2588func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2589 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2590 apex {
2591 name: "myapex",
2592 key: "myapex.key",
2593 apps: ["AppFoo"],
2594 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002595 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002596 }
2597
2598 apex_key {
2599 name: "myapex.key",
2600 public_key: "testkey.avbpubkey",
2601 private_key: "testkey.pem",
2602 }
2603
2604 android_app {
2605 name: "AppFoo",
2606 srcs: ["foo/bar/MyClass.java"],
2607 sdk_version: "current",
2608 min_sdk_version: "29",
2609 system_modules: "none",
2610 stl: "none",
2611 static_libs: ["bar"],
2612 apex_available: [ "myapex" ],
2613 }
2614
2615 java_library {
2616 name: "bar",
2617 sdk_version: "current",
2618 srcs: ["a.java"],
2619 apex_available: [ "myapex" ],
2620 }
2621 `)
2622}
2623
2624func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002625 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002626 apex {
2627 name: "myapex",
2628 key: "myapex.key",
2629 native_shared_libs: ["mylib"],
2630 min_sdk_version: "29",
2631 }
2632
2633 apex_key {
2634 name: "myapex.key",
2635 public_key: "testkey.avbpubkey",
2636 private_key: "testkey.pem",
2637 }
2638
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002639 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002640 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2641 cc_library {
2642 name: "mylib",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["mylib2"],
2645 system_shared_libs: [],
2646 stl: "none",
2647 apex_available: ["myapex", "otherapex"],
2648 min_sdk_version: "29",
2649 }
2650
2651 cc_library {
2652 name: "mylib2",
2653 srcs: ["mylib.cpp"],
2654 system_shared_libs: [],
2655 stl: "none",
2656 apex_available: ["otherapex"],
2657 stubs: { versions: ["29", "30"] },
2658 min_sdk_version: "30",
2659 }
2660
2661 apex {
2662 name: "otherapex",
2663 key: "myapex.key",
2664 native_shared_libs: ["mylib", "mylib2"],
2665 min_sdk_version: "30",
2666 }
2667 `)
2668 expectLink := func(from, from_variant, to, to_variant string) {
2669 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2670 libFlags := ld.Args["libFlags"]
2671 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2672 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002673 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002674 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002675}
2676
Jooyung Haned124c32021-01-26 11:43:46 +09002677func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002678 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2679 func(variables android.FixtureProductVariables) {
2680 variables.Platform_sdk_codename = proptools.StringPtr("S")
2681 variables.Platform_version_active_codenames = []string{"S"}
2682 },
2683 )
Jooyung Haned124c32021-01-26 11:43:46 +09002684 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2685 apex {
2686 name: "myapex",
2687 key: "myapex.key",
2688 native_shared_libs: ["libfoo"],
2689 min_sdk_version: "S",
2690 }
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696 cc_library {
2697 name: "libfoo",
2698 shared_libs: ["libbar"],
2699 apex_available: ["myapex"],
2700 min_sdk_version: "29",
2701 }
2702 cc_library {
2703 name: "libbar",
2704 apex_available: ["myapex"],
2705 }
2706 `, withSAsActiveCodeNames)
2707}
2708
2709func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002710 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2711 variables.Platform_sdk_codename = proptools.StringPtr("S")
2712 variables.Platform_version_active_codenames = []string{"S", "T"}
2713 })
Colin Cross1c460562021-02-16 17:55:47 -08002714 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002715 apex {
2716 name: "myapex",
2717 key: "myapex.key",
2718 native_shared_libs: ["libfoo"],
2719 min_sdk_version: "S",
2720 }
2721 apex_key {
2722 name: "myapex.key",
2723 public_key: "testkey.avbpubkey",
2724 private_key: "testkey.pem",
2725 }
2726 cc_library {
2727 name: "libfoo",
2728 shared_libs: ["libbar"],
2729 apex_available: ["myapex"],
2730 min_sdk_version: "S",
2731 }
2732 cc_library {
2733 name: "libbar",
2734 stubs: {
2735 symbol_file: "libbar.map.txt",
2736 versions: ["30", "S", "T"],
2737 },
2738 }
2739 `, withSAsActiveCodeNames)
2740
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002741 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002742 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2743 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002744 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002745}
2746
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002748 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002749 apex {
2750 name: "myapex",
2751 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002752 native_shared_libs: ["mylib"],
2753 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002754 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002755 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002756 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002757 }
2758
2759 apex_key {
2760 name: "myapex.key",
2761 public_key: "testkey.avbpubkey",
2762 private_key: "testkey.pem",
2763 }
2764
2765 prebuilt_etc {
2766 name: "myetc",
2767 src: "myprebuilt",
2768 sub_dir: "foo/bar",
2769 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002770
2771 cc_library {
2772 name: "mylib",
2773 srcs: ["mylib.cpp"],
2774 relative_install_path: "foo/bar",
2775 system_shared_libs: [],
2776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002777 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 }
2779
2780 cc_binary {
2781 name: "mybin",
2782 srcs: ["mylib.cpp"],
2783 relative_install_path: "foo/bar",
2784 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002785 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002786 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002787 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002788 `)
2789
Sundong Ahnabb64432019-10-22 13:58:29 +09002790 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002791 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002792
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002793 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002794 ensureContains(t, cmd, "/etc ")
2795 ensureContains(t, cmd, "/etc/foo ")
2796 ensureContains(t, cmd, "/etc/foo/bar ")
2797 ensureContains(t, cmd, "/lib64 ")
2798 ensureContains(t, cmd, "/lib64/foo ")
2799 ensureContains(t, cmd, "/lib64/foo/bar ")
2800 ensureContains(t, cmd, "/lib ")
2801 ensureContains(t, cmd, "/lib/foo ")
2802 ensureContains(t, cmd, "/lib/foo/bar ")
2803 ensureContains(t, cmd, "/bin ")
2804 ensureContains(t, cmd, "/bin/foo ")
2805 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002806}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002807
Jooyung Han35155c42020-02-06 17:33:20 +09002808func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002809 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002810 apex {
2811 name: "myapex",
2812 key: "myapex.key",
2813 multilib: {
2814 both: {
2815 native_shared_libs: ["mylib"],
2816 binaries: ["mybin"],
2817 },
2818 },
2819 compile_multilib: "both",
2820 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002821 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002822 }
2823
2824 apex_key {
2825 name: "myapex.key",
2826 public_key: "testkey.avbpubkey",
2827 private_key: "testkey.pem",
2828 }
2829
2830 cc_library {
2831 name: "mylib",
2832 relative_install_path: "foo/bar",
2833 system_shared_libs: [],
2834 stl: "none",
2835 apex_available: [ "myapex" ],
2836 native_bridge_supported: true,
2837 }
2838
2839 cc_binary {
2840 name: "mybin",
2841 relative_install_path: "foo/bar",
2842 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002843 stl: "none",
2844 apex_available: [ "myapex" ],
2845 native_bridge_supported: true,
2846 compile_multilib: "both", // default is "first" for binary
2847 multilib: {
2848 lib64: {
2849 suffix: "64",
2850 },
2851 },
2852 }
2853 `, withNativeBridgeEnabled)
2854 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2855 "bin/foo/bar/mybin",
2856 "bin/foo/bar/mybin64",
2857 "bin/arm/foo/bar/mybin",
2858 "bin/arm64/foo/bar/mybin64",
2859 "lib/foo/bar/mylib.so",
2860 "lib/arm/foo/bar/mylib.so",
2861 "lib64/foo/bar/mylib.so",
2862 "lib64/arm64/foo/bar/mylib.so",
2863 })
2864}
2865
Jooyung Han85d61762020-06-24 23:50:26 +09002866func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002867 result := android.GroupFixturePreparers(
2868 prepareForApexTest,
2869 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2870 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002871 apex {
2872 name: "myapex",
2873 key: "myapex.key",
2874 binaries: ["mybin"],
2875 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002876 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002877 }
2878 apex_key {
2879 name: "myapex.key",
2880 public_key: "testkey.avbpubkey",
2881 private_key: "testkey.pem",
2882 }
2883 cc_binary {
2884 name: "mybin",
2885 vendor: true,
2886 shared_libs: ["libfoo"],
2887 }
2888 cc_library {
2889 name: "libfoo",
2890 proprietary: true,
2891 }
2892 `)
2893
Colin Crossc68db4b2021-11-11 18:59:15 -08002894 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002895 "bin/mybin",
2896 "lib64/libfoo.so",
2897 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2898 "lib64/libc++.so",
2899 })
2900
Colin Crossc68db4b2021-11-11 18:59:15 -08002901 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2902 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002903 name := apexBundle.BaseModuleName()
2904 prefix := "TARGET_"
2905 var builder strings.Builder
2906 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002907 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002908 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002909 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002910
Colin Crossc68db4b2021-11-11 18:59:15 -08002911 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002912 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2913 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002914}
2915
Jooyung Hanc5a96762022-02-04 11:54:50 +09002916func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2917 testApexError(t, `Trying to include a VNDK library`, `
2918 apex {
2919 name: "myapex",
2920 key: "myapex.key",
2921 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2922 vendor: true,
2923 use_vndk_as_stable: true,
2924 updatable: false,
2925 }
2926 apex_key {
2927 name: "myapex.key",
2928 public_key: "testkey.avbpubkey",
2929 private_key: "testkey.pem",
2930 }`)
2931}
2932
Jooyung Handf78e212020-07-22 15:54:47 +09002933func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002934 // myapex myapex2
2935 // | |
2936 // mybin ------. mybin2
2937 // \ \ / |
2938 // (stable) .---\--------` |
2939 // \ / \ |
2940 // \ / \ /
2941 // libvndk libvendor
2942 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002943 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002944 apex {
2945 name: "myapex",
2946 key: "myapex.key",
2947 binaries: ["mybin"],
2948 vendor: true,
2949 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002950 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002951 }
2952 apex_key {
2953 name: "myapex.key",
2954 public_key: "testkey.avbpubkey",
2955 private_key: "testkey.pem",
2956 }
2957 cc_binary {
2958 name: "mybin",
2959 vendor: true,
2960 shared_libs: ["libvndk", "libvendor"],
2961 }
2962 cc_library {
2963 name: "libvndk",
2964 vndk: {
2965 enabled: true,
2966 },
2967 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002968 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002969 }
2970 cc_library {
2971 name: "libvendor",
2972 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002973 stl: "none",
2974 }
2975 apex {
2976 name: "myapex2",
2977 key: "myapex.key",
2978 binaries: ["mybin2"],
2979 vendor: true,
2980 use_vndk_as_stable: false,
2981 updatable: false,
2982 }
2983 cc_binary {
2984 name: "mybin2",
2985 vendor: true,
2986 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002987 }
2988 `)
2989
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002990 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002991
Jooyung Han91f92032022-02-04 12:36:33 +09002992 for _, tc := range []struct {
2993 name string
2994 apexName string
2995 moduleName string
2996 moduleVariant string
2997 libs []string
2998 contents []string
2999 requireVndkNamespace bool
3000 }{
3001 {
3002 name: "use_vndk_as_stable",
3003 apexName: "myapex",
3004 moduleName: "mybin",
3005 moduleVariant: vendorVariant + "_apex10000",
3006 libs: []string{
3007 // should link with vendor variants of VNDK libs(libvndk/libc++)
3008 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3009 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3010 // unstable Vendor libs as APEX variant
3011 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3012 },
3013 contents: []string{
3014 "bin/mybin",
3015 "lib64/libvendor.so",
3016 // VNDK libs (libvndk/libc++) are not included
3017 },
3018 requireVndkNamespace: true,
3019 },
3020 {
3021 name: "!use_vndk_as_stable",
3022 apexName: "myapex2",
3023 moduleName: "mybin2",
3024 moduleVariant: vendorVariant + "_myapex2",
3025 libs: []string{
3026 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3027 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3028 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3029 // unstable vendor libs have "merged" APEX variants
3030 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3031 },
3032 contents: []string{
3033 "bin/mybin2",
3034 "lib64/libvendor.so",
3035 // VNDK libs are included as well
3036 "lib64/libvndk.so",
3037 "lib64/libc++.so",
3038 },
3039 requireVndkNamespace: false,
3040 },
3041 } {
3042 t.Run(tc.name, func(t *testing.T) {
3043 // Check linked libs
3044 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3045 libs := names(ldRule.Args["libFlags"])
3046 for _, lib := range tc.libs {
3047 ensureListContains(t, libs, lib)
3048 }
3049 // Check apex contents
3050 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003051
Jooyung Han91f92032022-02-04 12:36:33 +09003052 // Check "requireNativeLibs"
3053 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
3054 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3055 if tc.requireVndkNamespace {
3056 ensureListContains(t, requireNativeLibs, ":vndk")
3057 } else {
3058 ensureListNotContains(t, requireNativeLibs, ":vndk")
3059 }
3060 })
3061 }
Jooyung Handf78e212020-07-22 15:54:47 +09003062}
3063
Justin Yun13decfb2021-03-08 19:25:55 +09003064func TestProductVariant(t *testing.T) {
3065 ctx := testApex(t, `
3066 apex {
3067 name: "myapex",
3068 key: "myapex.key",
3069 updatable: false,
3070 product_specific: true,
3071 binaries: ["foo"],
3072 }
3073
3074 apex_key {
3075 name: "myapex.key",
3076 public_key: "testkey.avbpubkey",
3077 private_key: "testkey.pem",
3078 }
3079
3080 cc_binary {
3081 name: "foo",
3082 product_available: true,
3083 apex_available: ["myapex"],
3084 srcs: ["foo.cpp"],
3085 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003086 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3087 variables.ProductVndkVersion = proptools.StringPtr("current")
3088 }),
3089 )
Justin Yun13decfb2021-03-08 19:25:55 +09003090
3091 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003092 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003093 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3094 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3095 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3096 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3097}
3098
Jooyung Han8e5685d2020-09-21 11:02:57 +09003099func TestApex_withPrebuiltFirmware(t *testing.T) {
3100 testCases := []struct {
3101 name string
3102 additionalProp string
3103 }{
3104 {"system apex with prebuilt_firmware", ""},
3105 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3106 }
3107 for _, tc := range testCases {
3108 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003109 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003110 apex {
3111 name: "myapex",
3112 key: "myapex.key",
3113 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003114 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003115 `+tc.additionalProp+`
3116 }
3117 apex_key {
3118 name: "myapex.key",
3119 public_key: "testkey.avbpubkey",
3120 private_key: "testkey.pem",
3121 }
3122 prebuilt_firmware {
3123 name: "myfirmware",
3124 src: "myfirmware.bin",
3125 filename_from_src: true,
3126 `+tc.additionalProp+`
3127 }
3128 `)
3129 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3130 "etc/firmware/myfirmware.bin",
3131 })
3132 })
3133 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003134}
3135
Jooyung Hanefb184e2020-06-25 17:14:25 +09003136func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 vendor: true,
3142 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003143 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003144 }
3145
3146 apex_key {
3147 name: "myapex.key",
3148 public_key: "testkey.avbpubkey",
3149 private_key: "testkey.pem",
3150 }
3151
3152 cc_library {
3153 name: "mylib",
3154 vendor_available: true,
3155 }
3156 `)
3157
3158 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003159 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003160 name := apexBundle.BaseModuleName()
3161 prefix := "TARGET_"
3162 var builder strings.Builder
3163 data.Custom(&builder, name, prefix, "", data)
3164 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003165 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 +09003166}
3167
Jooyung Han2ed99d02020-06-24 23:26:26 +09003168func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003169 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003170 apex {
3171 name: "myapex",
3172 key: "myapex.key",
3173 vintf_fragments: ["fragment.xml"],
3174 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003175 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003176 }
3177 apex_key {
3178 name: "myapex.key",
3179 public_key: "testkey.avbpubkey",
3180 private_key: "testkey.pem",
3181 }
3182 cc_binary {
3183 name: "mybin",
3184 }
3185 `)
3186
3187 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003188 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003189 name := apexBundle.BaseModuleName()
3190 prefix := "TARGET_"
3191 var builder strings.Builder
3192 data.Custom(&builder, name, prefix, "", data)
3193 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003194 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003195 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003196}
3197
Jiyong Park16e91a02018-12-20 18:18:08 +09003198func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003199 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003200 apex {
3201 name: "myapex",
3202 key: "myapex.key",
3203 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003204 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003205 }
3206
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212
3213 cc_library {
3214 name: "mylib",
3215 srcs: ["mylib.cpp"],
3216 system_shared_libs: [],
3217 stl: "none",
3218 stubs: {
3219 versions: ["1", "2", "3"],
3220 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003221 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003222 }
3223
3224 cc_binary {
3225 name: "not_in_apex",
3226 srcs: ["mylib.cpp"],
3227 static_libs: ["mylib"],
3228 static_executable: true,
3229 system_shared_libs: [],
3230 stl: "none",
3231 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003232 `)
3233
Colin Cross7113d202019-11-20 16:39:12 -08003234 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003235
3236 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003237 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003238}
Jiyong Park9335a262018-12-24 11:31:58 +09003239
3240func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003241 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003242 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003243 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003244 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003245 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003246 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003247 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003248 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003249 }
3250
3251 cc_library {
3252 name: "mylib",
3253 srcs: ["mylib.cpp"],
3254 system_shared_libs: [],
3255 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003256 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003257 }
3258
3259 apex_key {
3260 name: "myapex.key",
3261 public_key: "testkey.avbpubkey",
3262 private_key: "testkey.pem",
3263 }
3264
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003265 android_app_certificate {
3266 name: "myapex.certificate",
3267 certificate: "testkey",
3268 }
3269
3270 android_app_certificate {
3271 name: "myapex.certificate.override",
3272 certificate: "testkey.override",
3273 }
3274
Jiyong Park9335a262018-12-24 11:31:58 +09003275 `)
3276
3277 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003278 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003279
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003280 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3281 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003282 "vendor/foo/devkeys/testkey.avbpubkey")
3283 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003284 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3285 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003286 "vendor/foo/devkeys/testkey.pem")
3287 }
3288
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003289 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003290 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003291 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003292 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003294 }
3295}
Jiyong Park58e364a2019-01-19 19:24:06 +09003296
Jooyung Hanf121a652019-12-17 14:30:11 +09003297func TestCertificate(t *testing.T) {
3298 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003299 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003300 apex {
3301 name: "myapex",
3302 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003303 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003304 }
3305 apex_key {
3306 name: "myapex.key",
3307 public_key: "testkey.avbpubkey",
3308 private_key: "testkey.pem",
3309 }`)
3310 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3311 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3312 if actual := rule.Args["certificates"]; actual != expected {
3313 t.Errorf("certificates should be %q, not %q", expected, actual)
3314 }
3315 })
3316 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003317 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003318 apex {
3319 name: "myapex_keytest",
3320 key: "myapex.key",
3321 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003322 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003323 }
3324 apex_key {
3325 name: "myapex.key",
3326 public_key: "testkey.avbpubkey",
3327 private_key: "testkey.pem",
3328 }
3329 android_app_certificate {
3330 name: "myapex.certificate.override",
3331 certificate: "testkey.override",
3332 }`)
3333 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3334 expected := "testkey.override.x509.pem testkey.override.pk8"
3335 if actual := rule.Args["certificates"]; actual != expected {
3336 t.Errorf("certificates should be %q, not %q", expected, actual)
3337 }
3338 })
3339 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003340 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003341 apex {
3342 name: "myapex",
3343 key: "myapex.key",
3344 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003345 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003346 }
3347 apex_key {
3348 name: "myapex.key",
3349 public_key: "testkey.avbpubkey",
3350 private_key: "testkey.pem",
3351 }
3352 android_app_certificate {
3353 name: "myapex.certificate",
3354 certificate: "testkey",
3355 }`)
3356 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3357 expected := "testkey.x509.pem testkey.pk8"
3358 if actual := rule.Args["certificates"]; actual != expected {
3359 t.Errorf("certificates should be %q, not %q", expected, actual)
3360 }
3361 })
3362 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003363 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003364 apex {
3365 name: "myapex_keytest",
3366 key: "myapex.key",
3367 file_contexts: ":myapex-file_contexts",
3368 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003369 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003370 }
3371 apex_key {
3372 name: "myapex.key",
3373 public_key: "testkey.avbpubkey",
3374 private_key: "testkey.pem",
3375 }
3376 android_app_certificate {
3377 name: "myapex.certificate.override",
3378 certificate: "testkey.override",
3379 }`)
3380 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3381 expected := "testkey.override.x509.pem testkey.override.pk8"
3382 if actual := rule.Args["certificates"]; actual != expected {
3383 t.Errorf("certificates should be %q, not %q", expected, actual)
3384 }
3385 })
3386 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003387 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003388 apex {
3389 name: "myapex",
3390 key: "myapex.key",
3391 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003392 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003393 }
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }`)
3399 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3400 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3401 if actual := rule.Args["certificates"]; actual != expected {
3402 t.Errorf("certificates should be %q, not %q", expected, actual)
3403 }
3404 })
3405 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003406 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003407 apex {
3408 name: "myapex_keytest",
3409 key: "myapex.key",
3410 file_contexts: ":myapex-file_contexts",
3411 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003412 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003413 }
3414 apex_key {
3415 name: "myapex.key",
3416 public_key: "testkey.avbpubkey",
3417 private_key: "testkey.pem",
3418 }
3419 android_app_certificate {
3420 name: "myapex.certificate.override",
3421 certificate: "testkey.override",
3422 }`)
3423 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3424 expected := "testkey.override.x509.pem testkey.override.pk8"
3425 if actual := rule.Args["certificates"]; actual != expected {
3426 t.Errorf("certificates should be %q, not %q", expected, actual)
3427 }
3428 })
3429}
3430
Jiyong Park58e364a2019-01-19 19:24:06 +09003431func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003432 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003433 apex {
3434 name: "myapex",
3435 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003436 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003437 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003438 }
3439
3440 apex {
3441 name: "otherapex",
3442 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003443 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003444 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003445 }
3446
3447 apex_key {
3448 name: "myapex.key",
3449 public_key: "testkey.avbpubkey",
3450 private_key: "testkey.pem",
3451 }
3452
3453 cc_library {
3454 name: "mylib",
3455 srcs: ["mylib.cpp"],
3456 system_shared_libs: [],
3457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003458 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003459 "myapex",
3460 "otherapex",
3461 ],
Jooyung Han24282772020-03-21 23:20:55 +09003462 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003463 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003464 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003465 cc_library {
3466 name: "mylib2",
3467 srcs: ["mylib.cpp"],
3468 system_shared_libs: [],
3469 stl: "none",
3470 apex_available: [
3471 "myapex",
3472 "otherapex",
3473 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003474 static_libs: ["mylib3"],
3475 recovery_available: true,
3476 min_sdk_version: "29",
3477 }
3478 cc_library {
3479 name: "mylib3",
3480 srcs: ["mylib.cpp"],
3481 system_shared_libs: [],
3482 stl: "none",
3483 apex_available: [
3484 "myapex",
3485 "otherapex",
3486 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003487 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003488 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003489 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003490 `)
3491
Jooyung Hanc87a0592020-03-02 17:44:33 +09003492 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003493 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003494 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003495
Vinh Tranf9754732023-01-19 22:41:46 -05003496 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003497 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003498 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499
Vinh Tranf9754732023-01-19 22:41:46 -05003500 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003501 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003503
Colin Crossaede88c2020-08-11 12:17:01 -07003504 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3505 // each variant defines additional macros to distinguish which apex variant it is built for
3506
3507 // non-APEX variant does not have __ANDROID_APEX__ defined
3508 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3509 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3510
Vinh Tranf9754732023-01-19 22:41:46 -05003511 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003512 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3513 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003514
Jooyung Hanc87a0592020-03-02 17:44:33 +09003515 // non-APEX variant does not have __ANDROID_APEX__ defined
3516 mylibCFlags = ctx.ModuleForTests("mylib2", "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("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003521 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003522}
Jiyong Park7e636d02019-01-28 16:16:54 +09003523
3524func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003525 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003526 apex {
3527 name: "myapex",
3528 key: "myapex.key",
3529 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003530 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003531 }
3532
3533 apex_key {
3534 name: "myapex.key",
3535 public_key: "testkey.avbpubkey",
3536 private_key: "testkey.pem",
3537 }
3538
3539 cc_library_headers {
3540 name: "mylib_headers",
3541 export_include_dirs: ["my_include"],
3542 system_shared_libs: [],
3543 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003544 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003545 }
3546
3547 cc_library {
3548 name: "mylib",
3549 srcs: ["mylib.cpp"],
3550 system_shared_libs: [],
3551 stl: "none",
3552 header_libs: ["mylib_headers"],
3553 export_header_lib_headers: ["mylib_headers"],
3554 stubs: {
3555 versions: ["1", "2", "3"],
3556 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003557 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003558 }
3559
3560 cc_library {
3561 name: "otherlib",
3562 srcs: ["mylib.cpp"],
3563 system_shared_libs: [],
3564 stl: "none",
3565 shared_libs: ["mylib"],
3566 }
3567 `)
3568
Colin Cross7113d202019-11-20 16:39:12 -08003569 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003570
3571 // Ensure that the include path of the header lib is exported to 'otherlib'
3572 ensureContains(t, cFlags, "-Imy_include")
3573}
Alex Light9670d332019-01-29 18:07:33 -08003574
Jiyong Park7cd10e32020-01-14 09:22:18 +09003575type fileInApex struct {
3576 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003577 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003578 isLink bool
3579}
3580
Jooyung Han1724d582022-12-21 10:17:44 +09003581func (f fileInApex) String() string {
3582 return f.src + ":" + f.path
3583}
3584
3585func (f fileInApex) match(expectation string) bool {
3586 parts := strings.Split(expectation, ":")
3587 if len(parts) == 1 {
3588 match, _ := path.Match(parts[0], f.path)
3589 return match
3590 }
3591 if len(parts) == 2 {
3592 matchSrc, _ := path.Match(parts[0], f.src)
3593 matchDst, _ := path.Match(parts[1], f.path)
3594 return matchSrc && matchDst
3595 }
3596 panic("invalid expected file specification: " + expectation)
3597}
3598
Jooyung Hana57af4a2020-01-23 05:36:59 +00003599func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003600 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003601 module := ctx.ModuleForTests(moduleName, variant)
3602 apexRule := module.MaybeRule("apexRule")
3603 apexDir := "/image.apex/"
3604 if apexRule.Rule == nil {
3605 apexRule = module.Rule("zipApexRule")
3606 apexDir = "/image.zipapex/"
3607 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 for _, cmd := range strings.Split(copyCmds, "&&") {
3611 cmd = strings.TrimSpace(cmd)
3612 if cmd == "" {
3613 continue
3614 }
3615 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 switch terms[0] {
3619 case "mkdir":
3620 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003621 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003622 t.Fatal("copyCmds contains invalid cp command", cmd)
3623 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink = false
3627 case "ln":
3628 if len(terms) != 3 && len(terms) != 4 {
3629 // ln LINK TARGET or ln -s LINK TARGET
3630 t.Fatal("copyCmds contains invalid ln command", cmd)
3631 }
3632 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 = true
3635 default:
3636 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3637 }
3638 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003641 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 }
Jooyung Han1724d582022-12-21 10:17:44 +09003643 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003644 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 }
3646 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003647 return ret
3648}
3649
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003650func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003651 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 var failed bool
3653 var surplus []string
3654 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003656 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003657 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003658 if file.match(expected) {
3659 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003661 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003662 }
3663 }
Jooyung Han1724d582022-12-21 10:17:44 +09003664 if !matchFound {
3665 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003666 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003668
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003670 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003671 t.Log("surplus files", surplus)
3672 failed = true
3673 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003675 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003677 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 if !filesMatched[expected] {
3679 missing = append(missing, expected)
3680 }
3681 }
3682 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 t.Log("missing files", missing)
3684 failed = true
3685 }
3686 if failed {
3687 t.Fail()
3688 }
3689}
3690
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003691func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3692 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3693}
3694
3695func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3696 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3697 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3698 if deapexer.Output != nil {
3699 outputs = append(outputs, deapexer.Output.String())
3700 }
3701 for _, output := range deapexer.ImplicitOutputs {
3702 outputs = append(outputs, output.String())
3703 }
3704 actualFiles := make([]fileInApex, 0, len(outputs))
3705 for _, output := range outputs {
3706 dir := "/deapexer/"
3707 pos := strings.LastIndex(output, dir)
3708 if pos == -1 {
3709 t.Fatal("Unknown deapexer output ", output)
3710 }
3711 path := output[pos+len(dir):]
3712 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3713 }
3714 assertFileListEquals(t, files, actualFiles)
3715}
3716
Jooyung Han344d5432019-08-23 11:17:39 +09003717func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003718 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003719 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003721 "etc/llndk.libraries.29.txt",
3722 "etc/vndkcore.libraries.29.txt",
3723 "etc/vndksp.libraries.29.txt",
3724 "etc/vndkprivate.libraries.29.txt",
3725 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003726 }
3727 testCases := []struct {
3728 vndkVersion string
3729 expectedFiles []string
3730 }{
3731 {
3732 vndkVersion: "current",
3733 expectedFiles: append(commonFiles,
3734 "lib/libvndk.so",
3735 "lib/libvndksp.so",
3736 "lib64/libvndk.so",
3737 "lib64/libvndksp.so"),
3738 },
3739 {
3740 vndkVersion: "",
3741 expectedFiles: append(commonFiles,
3742 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3743 "lib/libvndksp.so",
3744 "lib64/libvndksp.so"),
3745 },
3746 }
3747 for _, tc := range testCases {
3748 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3749 ctx := testApex(t, `
3750 apex_vndk {
3751 name: "com.android.vndk.current",
3752 key: "com.android.vndk.current.key",
3753 updatable: false,
3754 }
3755
3756 apex_key {
3757 name: "com.android.vndk.current.key",
3758 public_key: "testkey.avbpubkey",
3759 private_key: "testkey.pem",
3760 }
3761
3762 cc_library {
3763 name: "libvndk",
3764 srcs: ["mylib.cpp"],
3765 vendor_available: true,
3766 product_available: true,
3767 vndk: {
3768 enabled: true,
3769 },
3770 system_shared_libs: [],
3771 stl: "none",
3772 apex_available: [ "com.android.vndk.current" ],
3773 }
3774
3775 cc_library {
3776 name: "libvndksp",
3777 srcs: ["mylib.cpp"],
3778 vendor_available: true,
3779 product_available: true,
3780 vndk: {
3781 enabled: true,
3782 support_system_process: true,
3783 },
3784 system_shared_libs: [],
3785 stl: "none",
3786 apex_available: [ "com.android.vndk.current" ],
3787 }
3788
3789 // VNDK-Ext should not cause any problems
3790
3791 cc_library {
3792 name: "libvndk.ext",
3793 srcs: ["mylib2.cpp"],
3794 vendor: true,
3795 vndk: {
3796 enabled: true,
3797 extends: "libvndk",
3798 },
3799 system_shared_libs: [],
3800 stl: "none",
3801 }
3802
3803 cc_library {
3804 name: "libvndksp.ext",
3805 srcs: ["mylib2.cpp"],
3806 vendor: true,
3807 vndk: {
3808 enabled: true,
3809 support_system_process: true,
3810 extends: "libvndksp",
3811 },
3812 system_shared_libs: [],
3813 stl: "none",
3814 }
3815 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3816 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3817 }))
3818 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3819 })
3820 }
Jooyung Han344d5432019-08-23 11:17:39 +09003821}
3822
3823func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003824 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003825 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003826 name: "com.android.vndk.current",
3827 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003828 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003829 }
3830
3831 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003832 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
3835 }
3836
3837 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 name: "libvndk",
3839 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003840 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003841 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003842 vndk: {
3843 enabled: true,
3844 },
3845 system_shared_libs: [],
3846 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003847 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003848 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003849
3850 cc_prebuilt_library_shared {
3851 name: "libvndk.arm",
3852 srcs: ["libvndk.arm.so"],
3853 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003854 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003855 vndk: {
3856 enabled: true,
3857 },
3858 enabled: false,
3859 arch: {
3860 arm: {
3861 enabled: true,
3862 },
3863 },
3864 system_shared_libs: [],
3865 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003866 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003868 `+vndkLibrariesTxtFiles("current"),
3869 withFiles(map[string][]byte{
3870 "libvndk.so": nil,
3871 "libvndk.arm.so": nil,
3872 }))
Colin Cross2807f002021-03-02 10:15:29 -08003873 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003874 "lib/libvndk.so",
3875 "lib/libvndk.arm.so",
3876 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003877 "lib/libc++.so",
3878 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003879 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 })
Jooyung Han344d5432019-08-23 11:17:39 +09003881}
3882
Jooyung Han39edb6c2019-11-06 16:53:07 +09003883func vndkLibrariesTxtFiles(vers ...string) (result string) {
3884 for _, v := range vers {
3885 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003886 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003887 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003888 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889 name: "` + txt + `.libraries.txt",
3890 }
3891 `
3892 }
3893 } else {
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 += `
3896 prebuilt_etc {
3897 name: "` + txt + `.libraries.` + v + `.txt",
3898 src: "dummy.txt",
3899 }
3900 `
3901 }
3902 }
3903 }
3904 return
3905}
3906
Jooyung Han344d5432019-08-23 11:17:39 +09003907func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003908 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003909 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003910 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003911 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003912 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003913 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003914 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003915 }
3916
3917 apex_key {
3918 name: "myapex.key",
3919 public_key: "testkey.avbpubkey",
3920 private_key: "testkey.pem",
3921 }
3922
Jooyung Han31c470b2019-10-18 16:26:59 +09003923 vndk_prebuilt_shared {
3924 name: "libvndk27",
3925 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003926 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003927 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003928 vndk: {
3929 enabled: true,
3930 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003931 target_arch: "arm64",
3932 arch: {
3933 arm: {
3934 srcs: ["libvndk27_arm.so"],
3935 },
3936 arm64: {
3937 srcs: ["libvndk27_arm64.so"],
3938 },
3939 },
Colin Cross2807f002021-03-02 10:15:29 -08003940 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003941 }
3942
3943 vndk_prebuilt_shared {
3944 name: "libvndk27",
3945 version: "27",
3946 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003947 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003948 vndk: {
3949 enabled: true,
3950 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003951 target_arch: "x86_64",
3952 arch: {
3953 x86: {
3954 srcs: ["libvndk27_x86.so"],
3955 },
3956 x86_64: {
3957 srcs: ["libvndk27_x86_64.so"],
3958 },
3959 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003960 }
3961 `+vndkLibrariesTxtFiles("27"),
3962 withFiles(map[string][]byte{
3963 "libvndk27_arm.so": nil,
3964 "libvndk27_arm64.so": nil,
3965 "libvndk27_x86.so": nil,
3966 "libvndk27_x86_64.so": nil,
3967 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003968
Colin Cross2807f002021-03-02 10:15:29 -08003969 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003970 "lib/libvndk27_arm.so",
3971 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003972 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003973 })
Jooyung Han344d5432019-08-23 11:17:39 +09003974}
3975
Jooyung Han90eee022019-10-01 20:02:42 +09003976func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003977 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003978 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003979 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003980 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003981 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003982 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003983 }
3984 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003985 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003986 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003987 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003988 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003989 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003990 }
3991 apex_key {
3992 name: "myapex.key",
3993 public_key: "testkey.avbpubkey",
3994 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003995 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003996
3997 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003998 module := ctx.ModuleForTests(moduleName, "android_common_image")
3999 apexManifestRule := module.Rule("apexManifestRule")
4000 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004001 }
4002
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004003 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004004 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004005}
4006
Jooyung Han344d5432019-08-23 11:17:39 +09004007func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004008 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004009 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004010 name: "com.android.vndk.current",
4011 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004012 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004013 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004014 }
4015
4016 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004017 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004018 public_key: "testkey.avbpubkey",
4019 private_key: "testkey.pem",
4020 }
4021
4022 cc_library {
4023 name: "libvndk",
4024 srcs: ["mylib.cpp"],
4025 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004026 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004027 native_bridge_supported: true,
4028 host_supported: true,
4029 vndk: {
4030 enabled: true,
4031 },
4032 system_shared_libs: [],
4033 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004034 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004035 }
Colin Cross2807f002021-03-02 10:15:29 -08004036 `+vndkLibrariesTxtFiles("current"),
4037 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004038
Colin Cross2807f002021-03-02 10:15:29 -08004039 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004040 "lib/libvndk.so",
4041 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004042 "lib/libc++.so",
4043 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004044 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 })
Jooyung Han344d5432019-08-23 11:17:39 +09004046}
4047
4048func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004049 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004050 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004051 name: "com.android.vndk.current",
4052 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004053 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004054 native_bridge_supported: true,
4055 }
4056
4057 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004059 public_key: "testkey.avbpubkey",
4060 private_key: "testkey.pem",
4061 }
4062
4063 cc_library {
4064 name: "libvndk",
4065 srcs: ["mylib.cpp"],
4066 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004067 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004068 native_bridge_supported: true,
4069 host_supported: true,
4070 vndk: {
4071 enabled: true,
4072 },
4073 system_shared_libs: [],
4074 stl: "none",
4075 }
4076 `)
4077}
4078
Jooyung Han31c470b2019-10-18 16:26:59 +09004079func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004080 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004082 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004083 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004084 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004085 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004086 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 }
4088
4089 apex_key {
4090 name: "myapex.key",
4091 public_key: "testkey.avbpubkey",
4092 private_key: "testkey.pem",
4093 }
4094
4095 vndk_prebuilt_shared {
4096 name: "libvndk27",
4097 version: "27",
4098 target_arch: "arm",
4099 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004100 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004101 vndk: {
4102 enabled: true,
4103 },
4104 arch: {
4105 arm: {
4106 srcs: ["libvndk27.so"],
4107 }
4108 },
4109 }
4110
4111 vndk_prebuilt_shared {
4112 name: "libvndk27",
4113 version: "27",
4114 target_arch: "arm",
4115 binder32bit: true,
4116 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004117 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004118 vndk: {
4119 enabled: true,
4120 },
4121 arch: {
4122 arm: {
4123 srcs: ["libvndk27binder32.so"],
4124 }
4125 },
Colin Cross2807f002021-03-02 10:15:29 -08004126 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004127 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004128 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004129 withFiles(map[string][]byte{
4130 "libvndk27.so": nil,
4131 "libvndk27binder32.so": nil,
4132 }),
4133 withBinder32bit,
4134 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004135 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004136 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4137 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004138 },
4139 }),
4140 )
4141
Colin Cross2807f002021-03-02 10:15:29 -08004142 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004143 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004144 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004145 })
4146}
4147
Jooyung Han45a96772020-06-15 14:59:42 +09004148func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004149 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004150 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004151 name: "com.android.vndk.current",
4152 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004153 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004154 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004155 }
4156
4157 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004158 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004159 public_key: "testkey.avbpubkey",
4160 private_key: "testkey.pem",
4161 }
4162
4163 cc_library {
4164 name: "libz",
4165 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004166 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004167 vndk: {
4168 enabled: true,
4169 },
4170 stubs: {
4171 symbol_file: "libz.map.txt",
4172 versions: ["30"],
4173 }
4174 }
4175 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4176 "libz.map.txt": nil,
4177 }))
4178
Colin Cross2807f002021-03-02 10:15:29 -08004179 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004180 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4181 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004182 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4183 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4184 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4185 "*/*",
4186 })
Jooyung Han45a96772020-06-15 14:59:42 +09004187}
4188
Jooyung Hane1633032019-08-01 17:41:43 +09004189func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004190 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004191 apex {
4192 name: "myapex_nodep",
4193 key: "myapex.key",
4194 native_shared_libs: ["lib_nodep"],
4195 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004196 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004197 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004198 }
4199
4200 apex {
4201 name: "myapex_dep",
4202 key: "myapex.key",
4203 native_shared_libs: ["lib_dep"],
4204 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004205 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004206 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004207 }
4208
4209 apex {
4210 name: "myapex_provider",
4211 key: "myapex.key",
4212 native_shared_libs: ["libfoo"],
4213 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004214 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004215 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004216 }
4217
4218 apex {
4219 name: "myapex_selfcontained",
4220 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004221 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004222 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004223 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004224 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004225 }
4226
4227 apex_key {
4228 name: "myapex.key",
4229 public_key: "testkey.avbpubkey",
4230 private_key: "testkey.pem",
4231 }
4232
4233 cc_library {
4234 name: "lib_nodep",
4235 srcs: ["mylib.cpp"],
4236 system_shared_libs: [],
4237 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004238 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004239 }
4240
4241 cc_library {
4242 name: "lib_dep",
4243 srcs: ["mylib.cpp"],
4244 shared_libs: ["libfoo"],
4245 system_shared_libs: [],
4246 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004247 apex_available: [
4248 "myapex_dep",
4249 "myapex_provider",
4250 "myapex_selfcontained",
4251 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004252 }
4253
4254 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004255 name: "lib_dep_on_bar",
4256 srcs: ["mylib.cpp"],
4257 shared_libs: ["libbar"],
4258 system_shared_libs: [],
4259 stl: "none",
4260 apex_available: [
4261 "myapex_selfcontained",
4262 ],
4263 }
4264
4265
4266 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004267 name: "libfoo",
4268 srcs: ["mytest.cpp"],
4269 stubs: {
4270 versions: ["1"],
4271 },
4272 system_shared_libs: [],
4273 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004274 apex_available: [
4275 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004276 ],
4277 }
4278
4279 cc_library {
4280 name: "libbar",
4281 srcs: ["mytest.cpp"],
4282 stubs: {
4283 versions: ["1"],
4284 },
4285 system_shared_libs: [],
4286 stl: "none",
4287 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004288 "myapex_selfcontained",
4289 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004290 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004291
Jooyung Hane1633032019-08-01 17:41:43 +09004292 `)
4293
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004294 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004295 var provideNativeLibs, requireNativeLibs []string
4296
Sundong Ahnabb64432019-10-22 13:58:29 +09004297 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004298 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4299 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004300 ensureListEmpty(t, provideNativeLibs)
4301 ensureListEmpty(t, requireNativeLibs)
4302
Sundong Ahnabb64432019-10-22 13:58:29 +09004303 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004304 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4305 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004306 ensureListEmpty(t, provideNativeLibs)
4307 ensureListContains(t, requireNativeLibs, "libfoo.so")
4308
Sundong Ahnabb64432019-10-22 13:58:29 +09004309 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004310 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4311 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004312 ensureListContains(t, provideNativeLibs, "libfoo.so")
4313 ensureListEmpty(t, requireNativeLibs)
4314
Sundong Ahnabb64432019-10-22 13:58:29 +09004315 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004316 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4317 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004318 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004319 ensureListEmpty(t, requireNativeLibs)
4320}
4321
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004322func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4323 ctx := testApex(t, `
4324 apex {
4325 name: "myapex",
4326 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004327 native_shared_libs: ["mylib"],
4328 updatable: false,
4329 }
4330
4331 apex_key {
4332 name: "myapex.key",
4333 public_key: "testkey.avbpubkey",
4334 private_key: "testkey.pem",
4335 }
4336
4337 cc_library {
4338 name: "mylib",
4339 srcs: ["mylib.cpp"],
4340 system_shared_libs: [],
4341 stl: "none",
4342 apex_available: [
4343 "//apex_available:platform",
4344 "myapex",
4345 ],
4346 }
4347 `, android.FixtureMergeEnv(map[string]string{
4348 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4349 }))
4350
Jooyung Han63dff462023-02-09 00:11:27 +00004351 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004352 apexManifestRule := module.Rule("apexManifestRule")
4353 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4354}
4355
Vinh Tran8f5310f2022-10-07 18:16:47 -04004356func TestCompileMultilibProp(t *testing.T) {
4357 testCases := []struct {
4358 compileMultiLibProp string
4359 containedLibs []string
4360 notContainedLibs []string
4361 }{
4362 {
4363 containedLibs: []string{
4364 "image.apex/lib64/mylib.so",
4365 "image.apex/lib/mylib.so",
4366 },
4367 compileMultiLibProp: `compile_multilib: "both",`,
4368 },
4369 {
4370 containedLibs: []string{"image.apex/lib64/mylib.so"},
4371 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4372 compileMultiLibProp: `compile_multilib: "first",`,
4373 },
4374 {
4375 containedLibs: []string{"image.apex/lib64/mylib.so"},
4376 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4377 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4378 },
4379 {
4380 containedLibs: []string{"image.apex/lib64/mylib.so"},
4381 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4382 compileMultiLibProp: `compile_multilib: "64",`,
4383 },
4384 {
4385 containedLibs: []string{"image.apex/lib/mylib.so"},
4386 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4387 compileMultiLibProp: `compile_multilib: "32",`,
4388 },
4389 }
4390 for _, testCase := range testCases {
4391 ctx := testApex(t, fmt.Sprintf(`
4392 apex {
4393 name: "myapex",
4394 key: "myapex.key",
4395 %s
4396 native_shared_libs: ["mylib"],
4397 updatable: false,
4398 }
4399 apex_key {
4400 name: "myapex.key",
4401 public_key: "testkey.avbpubkey",
4402 private_key: "testkey.pem",
4403 }
4404 cc_library {
4405 name: "mylib",
4406 srcs: ["mylib.cpp"],
4407 apex_available: [
4408 "//apex_available:platform",
4409 "myapex",
4410 ],
4411 }
4412 `, testCase.compileMultiLibProp),
4413 )
4414 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4415 apexRule := module.Rule("apexRule")
4416 copyCmds := apexRule.Args["copy_commands"]
4417 for _, containedLib := range testCase.containedLibs {
4418 ensureContains(t, copyCmds, containedLib)
4419 }
4420 for _, notContainedLib := range testCase.notContainedLibs {
4421 ensureNotContains(t, copyCmds, notContainedLib)
4422 }
4423 }
4424}
4425
Alex Light0851b882019-02-07 13:20:53 -08004426func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004427 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004428 apex {
4429 name: "myapex",
4430 key: "myapex.key",
4431 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004432 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004433 }
4434
4435 apex_key {
4436 name: "myapex.key",
4437 public_key: "testkey.avbpubkey",
4438 private_key: "testkey.pem",
4439 }
4440
4441 cc_library {
4442 name: "mylib_common",
4443 srcs: ["mylib.cpp"],
4444 system_shared_libs: [],
4445 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004446 apex_available: [
4447 "//apex_available:platform",
4448 "myapex",
4449 ],
Alex Light0851b882019-02-07 13:20:53 -08004450 }
4451 `)
4452
Sundong Ahnabb64432019-10-22 13:58:29 +09004453 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004454 apexRule := module.Rule("apexRule")
4455 copyCmds := apexRule.Args["copy_commands"]
4456
4457 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4458 t.Log("Apex was a test apex!")
4459 t.Fail()
4460 }
4461 // Ensure that main rule creates an output
4462 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4463
4464 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004465 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004466
4467 // Ensure that both direct and indirect deps are copied into apex
4468 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4469
Colin Cross7113d202019-11-20 16:39:12 -08004470 // Ensure that the platform variant ends with _shared
4471 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004472
Colin Cross56a83212020-09-15 18:30:11 -07004473 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004474 t.Log("Found mylib_common not in any apex!")
4475 t.Fail()
4476 }
4477}
4478
4479func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004480 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004481 apex_test {
4482 name: "myapex",
4483 key: "myapex.key",
4484 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004485 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004486 }
4487
4488 apex_key {
4489 name: "myapex.key",
4490 public_key: "testkey.avbpubkey",
4491 private_key: "testkey.pem",
4492 }
4493
4494 cc_library {
4495 name: "mylib_common_test",
4496 srcs: ["mylib.cpp"],
4497 system_shared_libs: [],
4498 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004499 // TODO: remove //apex_available:platform
4500 apex_available: [
4501 "//apex_available:platform",
4502 "myapex",
4503 ],
Alex Light0851b882019-02-07 13:20:53 -08004504 }
4505 `)
4506
Sundong Ahnabb64432019-10-22 13:58:29 +09004507 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004508 apexRule := module.Rule("apexRule")
4509 copyCmds := apexRule.Args["copy_commands"]
4510
4511 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4512 t.Log("Apex was not a test apex!")
4513 t.Fail()
4514 }
4515 // Ensure that main rule creates an output
4516 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4517
4518 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004519 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004520
4521 // Ensure that both direct and indirect deps are copied into apex
4522 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4523
Colin Cross7113d202019-11-20 16:39:12 -08004524 // Ensure that the platform variant ends with _shared
4525 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004526}
4527
Alex Light9670d332019-01-29 18:07:33 -08004528func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004529 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004530 apex {
4531 name: "myapex",
4532 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004533 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004534 multilib: {
4535 first: {
4536 native_shared_libs: ["mylib_common"],
4537 }
4538 },
4539 target: {
4540 android: {
4541 multilib: {
4542 first: {
4543 native_shared_libs: ["mylib"],
4544 }
4545 }
4546 },
4547 host: {
4548 multilib: {
4549 first: {
4550 native_shared_libs: ["mylib2"],
4551 }
4552 }
4553 }
4554 }
4555 }
4556
4557 apex_key {
4558 name: "myapex.key",
4559 public_key: "testkey.avbpubkey",
4560 private_key: "testkey.pem",
4561 }
4562
4563 cc_library {
4564 name: "mylib",
4565 srcs: ["mylib.cpp"],
4566 system_shared_libs: [],
4567 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004568 // TODO: remove //apex_available:platform
4569 apex_available: [
4570 "//apex_available:platform",
4571 "myapex",
4572 ],
Alex Light9670d332019-01-29 18:07:33 -08004573 }
4574
4575 cc_library {
4576 name: "mylib_common",
4577 srcs: ["mylib.cpp"],
4578 system_shared_libs: [],
4579 stl: "none",
4580 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004581 // TODO: remove //apex_available:platform
4582 apex_available: [
4583 "//apex_available:platform",
4584 "myapex",
4585 ],
Alex Light9670d332019-01-29 18:07:33 -08004586 }
4587
4588 cc_library {
4589 name: "mylib2",
4590 srcs: ["mylib.cpp"],
4591 system_shared_libs: [],
4592 stl: "none",
4593 compile_multilib: "first",
4594 }
4595 `)
4596
Sundong Ahnabb64432019-10-22 13:58:29 +09004597 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004598 copyCmds := apexRule.Args["copy_commands"]
4599
4600 // Ensure that main rule creates an output
4601 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4602
4603 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004604 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4605 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4606 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004607
4608 // Ensure that both direct and indirect deps are copied into apex
4609 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4610 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4611 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4612
Colin Cross7113d202019-11-20 16:39:12 -08004613 // Ensure that the platform variant ends with _shared
4614 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4615 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4616 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004617}
Jiyong Park04480cf2019-02-06 00:16:29 +09004618
Jiyong Park59140302020-12-14 18:44:04 +09004619func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004620 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004621 apex {
4622 name: "myapex",
4623 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004624 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004625 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004626 arch: {
4627 arm64: {
4628 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004629 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004630 },
4631 x86_64: {
4632 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004633 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004634 },
4635 }
4636 }
4637
4638 apex_key {
4639 name: "myapex.key",
4640 public_key: "testkey.avbpubkey",
4641 private_key: "testkey.pem",
4642 }
4643
4644 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004645 name: "mylib.generic",
4646 srcs: ["mylib.cpp"],
4647 system_shared_libs: [],
4648 stl: "none",
4649 // TODO: remove //apex_available:platform
4650 apex_available: [
4651 "//apex_available:platform",
4652 "myapex",
4653 ],
4654 }
4655
4656 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004657 name: "mylib.arm64",
4658 srcs: ["mylib.cpp"],
4659 system_shared_libs: [],
4660 stl: "none",
4661 // TODO: remove //apex_available:platform
4662 apex_available: [
4663 "//apex_available:platform",
4664 "myapex",
4665 ],
4666 }
4667
4668 cc_library {
4669 name: "mylib.x64",
4670 srcs: ["mylib.cpp"],
4671 system_shared_libs: [],
4672 stl: "none",
4673 // TODO: remove //apex_available:platform
4674 apex_available: [
4675 "//apex_available:platform",
4676 "myapex",
4677 ],
4678 }
4679 `)
4680
4681 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4682 copyCmds := apexRule.Args["copy_commands"]
4683
4684 // Ensure that apex variant is created for the direct dep
4685 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004686 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004687 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4688
4689 // Ensure that both direct and indirect deps are copied into apex
4690 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4691 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4692}
4693
Jiyong Park04480cf2019-02-06 00:16:29 +09004694func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004695 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004696 apex {
4697 name: "myapex",
4698 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004699 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004700 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004701 }
4702
4703 apex_key {
4704 name: "myapex.key",
4705 public_key: "testkey.avbpubkey",
4706 private_key: "testkey.pem",
4707 }
4708
4709 sh_binary {
4710 name: "myscript",
4711 src: "mylib.cpp",
4712 filename: "myscript.sh",
4713 sub_dir: "script",
4714 }
4715 `)
4716
Sundong Ahnabb64432019-10-22 13:58:29 +09004717 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004718 copyCmds := apexRule.Args["copy_commands"]
4719
4720 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4721}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004722
Jooyung Han91df2082019-11-20 01:49:42 +09004723func TestApexInVariousPartition(t *testing.T) {
4724 testcases := []struct {
4725 propName, parition, flattenedPartition string
4726 }{
4727 {"", "system", "system_ext"},
4728 {"product_specific: true", "product", "product"},
4729 {"soc_specific: true", "vendor", "vendor"},
4730 {"proprietary: true", "vendor", "vendor"},
4731 {"vendor: true", "vendor", "vendor"},
4732 {"system_ext_specific: true", "system_ext", "system_ext"},
4733 }
4734 for _, tc := range testcases {
4735 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004736 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004737 apex {
4738 name: "myapex",
4739 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004740 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004741 `+tc.propName+`
4742 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004743
Jooyung Han91df2082019-11-20 01:49:42 +09004744 apex_key {
4745 name: "myapex.key",
4746 public_key: "testkey.avbpubkey",
4747 private_key: "testkey.pem",
4748 }
4749 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004750
Jooyung Han91df2082019-11-20 01:49:42 +09004751 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004752 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4753 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004754 if actual != expected {
4755 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4756 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004757
Jooyung Han91df2082019-11-20 01:49:42 +09004758 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004759 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4760 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004761 if actual != expected {
4762 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4763 }
4764 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004765 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004766}
Jiyong Park67882562019-03-21 01:11:21 +09004767
Jooyung Han580eb4f2020-06-24 19:33:06 +09004768func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004769 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004770 apex {
4771 name: "myapex",
4772 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004773 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004774 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004775
Jooyung Han580eb4f2020-06-24 19:33:06 +09004776 apex_key {
4777 name: "myapex.key",
4778 public_key: "testkey.avbpubkey",
4779 private_key: "testkey.pem",
4780 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004781 `)
4782 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004783 rule := module.Output("file_contexts")
4784 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4785}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004786
Jooyung Han580eb4f2020-06-24 19:33:06 +09004787func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004788 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004789 apex {
4790 name: "myapex",
4791 key: "myapex.key",
4792 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004793 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004795
Jooyung Han580eb4f2020-06-24 19:33:06 +09004796 apex_key {
4797 name: "myapex.key",
4798 public_key: "testkey.avbpubkey",
4799 private_key: "testkey.pem",
4800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801 `, withFiles(map[string][]byte{
4802 "my_own_file_contexts": nil,
4803 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004804}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004805
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004807 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004808 apex {
4809 name: "myapex",
4810 key: "myapex.key",
4811 product_specific: true,
4812 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004813 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004814 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004815
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816 apex_key {
4817 name: "myapex.key",
4818 public_key: "testkey.avbpubkey",
4819 private_key: "testkey.pem",
4820 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004821 `)
4822
Colin Cross1c460562021-02-16 17:55:47 -08004823 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004824 apex {
4825 name: "myapex",
4826 key: "myapex.key",
4827 product_specific: true,
4828 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004829 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004830 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004831
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832 apex_key {
4833 name: "myapex.key",
4834 public_key: "testkey.avbpubkey",
4835 private_key: "testkey.pem",
4836 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004837 `, withFiles(map[string][]byte{
4838 "product_specific_file_contexts": nil,
4839 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004840 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4841 rule := module.Output("file_contexts")
4842 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4843}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004844
Jooyung Han580eb4f2020-06-24 19:33:06 +09004845func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004846 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004847 apex {
4848 name: "myapex",
4849 key: "myapex.key",
4850 product_specific: true,
4851 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004852 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004853 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004854
Jooyung Han580eb4f2020-06-24 19:33:06 +09004855 apex_key {
4856 name: "myapex.key",
4857 public_key: "testkey.avbpubkey",
4858 private_key: "testkey.pem",
4859 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004860
Jooyung Han580eb4f2020-06-24 19:33:06 +09004861 filegroup {
4862 name: "my-file-contexts",
4863 srcs: ["product_specific_file_contexts"],
4864 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004865 `, withFiles(map[string][]byte{
4866 "product_specific_file_contexts": nil,
4867 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004868 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4869 rule := module.Output("file_contexts")
4870 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004871}
4872
Jiyong Park67882562019-03-21 01:11:21 +09004873func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004874 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004875 apex_key {
4876 name: "myapex.key",
4877 public_key: ":my.avbpubkey",
4878 private_key: ":my.pem",
4879 product_specific: true,
4880 }
4881
4882 filegroup {
4883 name: "my.avbpubkey",
4884 srcs: ["testkey2.avbpubkey"],
4885 }
4886
4887 filegroup {
4888 name: "my.pem",
4889 srcs: ["testkey2.pem"],
4890 }
4891 `)
4892
4893 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4894 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004895 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004896 if actual_pubkey != expected_pubkey {
4897 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4898 }
4899 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004900 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004901 if actual_privkey != expected_privkey {
4902 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4903 }
4904}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004905
4906func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004907 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004908 prebuilt_apex {
4909 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004910 arch: {
4911 arm64: {
4912 src: "myapex-arm64.apex",
4913 },
4914 arm: {
4915 src: "myapex-arm.apex",
4916 },
4917 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004918 }
4919 `)
4920
Wei Li340ee8e2022-03-18 17:33:24 -07004921 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4922 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004923
Jiyong Parkc95714e2019-03-29 14:23:10 +09004924 expectedInput := "myapex-arm64.apex"
4925 if prebuilt.inputApex.String() != expectedInput {
4926 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4927 }
Wei Li340ee8e2022-03-18 17:33:24 -07004928 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4929 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4930 rule := testingModule.Rule("genProvenanceMetaData")
4931 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4932 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4933 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4934 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004935
4936 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4937 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004938}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004939
Paul Duffinc0609c62021-03-01 17:27:16 +00004940func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004941 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004942 prebuilt_apex {
4943 name: "myapex",
4944 }
4945 `)
4946}
4947
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004948func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004949 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004950 prebuilt_apex {
4951 name: "myapex",
4952 src: "myapex-arm.apex",
4953 filename: "notmyapex.apex",
4954 }
4955 `)
4956
Wei Li340ee8e2022-03-18 17:33:24 -07004957 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4958 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004959
4960 expected := "notmyapex.apex"
4961 if p.installFilename != expected {
4962 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4963 }
Wei Li340ee8e2022-03-18 17:33:24 -07004964 rule := testingModule.Rule("genProvenanceMetaData")
4965 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4966 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4967 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4968 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004969}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004970
Samiul Islam7c02e262021-09-08 17:48:28 +01004971func TestApexSetFilenameOverride(t *testing.T) {
4972 testApex(t, `
4973 apex_set {
4974 name: "com.company.android.myapex",
4975 apex_name: "com.android.myapex",
4976 set: "company-myapex.apks",
4977 filename: "com.company.android.myapex.apex"
4978 }
4979 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4980
4981 testApex(t, `
4982 apex_set {
4983 name: "com.company.android.myapex",
4984 apex_name: "com.android.myapex",
4985 set: "company-myapex.apks",
4986 filename: "com.company.android.myapex.capex"
4987 }
4988 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4989
4990 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4991 apex_set {
4992 name: "com.company.android.myapex",
4993 apex_name: "com.android.myapex",
4994 set: "company-myapex.apks",
4995 filename: "some-random-suffix"
4996 }
4997 `)
4998}
4999
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005000func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005001 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005002 prebuilt_apex {
5003 name: "myapex.prebuilt",
5004 src: "myapex-arm.apex",
5005 overrides: [
5006 "myapex",
5007 ],
5008 }
5009 `)
5010
Wei Li340ee8e2022-03-18 17:33:24 -07005011 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5012 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005013
5014 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005015 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005016 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005017 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005018 }
Wei Li340ee8e2022-03-18 17:33:24 -07005019 rule := testingModule.Rule("genProvenanceMetaData")
5020 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5021 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5022 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5023 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005024}
5025
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005026func TestPrebuiltApexName(t *testing.T) {
5027 testApex(t, `
5028 prebuilt_apex {
5029 name: "com.company.android.myapex",
5030 apex_name: "com.android.myapex",
5031 src: "company-myapex-arm.apex",
5032 }
5033 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5034
5035 testApex(t, `
5036 apex_set {
5037 name: "com.company.android.myapex",
5038 apex_name: "com.android.myapex",
5039 set: "company-myapex.apks",
5040 }
5041 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5042}
5043
5044func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5045 _ = android.GroupFixturePreparers(
5046 java.PrepareForTestWithJavaDefaultModules,
5047 PrepareForTestWithApexBuildComponents,
5048 android.FixtureWithRootAndroidBp(`
5049 platform_bootclasspath {
5050 name: "platform-bootclasspath",
5051 fragments: [
5052 {
5053 apex: "com.android.art",
5054 module: "art-bootclasspath-fragment",
5055 },
5056 ],
5057 }
5058
5059 prebuilt_apex {
5060 name: "com.company.android.art",
5061 apex_name: "com.android.art",
5062 src: "com.company.android.art-arm.apex",
5063 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5064 }
5065
5066 prebuilt_bootclasspath_fragment {
5067 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005068 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005069 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005070 hidden_api: {
5071 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5072 metadata: "my-bootclasspath-fragment/metadata.csv",
5073 index: "my-bootclasspath-fragment/index.csv",
5074 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5075 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5076 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005077 }
5078
5079 java_import {
5080 name: "core-oj",
5081 jars: ["prebuilt.jar"],
5082 }
5083 `),
5084 ).RunTest(t)
5085}
5086
Paul Duffin092153d2021-01-26 11:42:39 +00005087// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5088// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005089func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005090 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005091
Paul Duffin89886cb2021-02-05 16:44:03 +00005092 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005093 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005094 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005095 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005096 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005097 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005098 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5099 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5100 android.NormalizePathForTesting(dexJarBuildPath))
5101 }
5102
5103 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005104 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005105 // Make sure the import has been given the correct path to the dex jar.
5106 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5107 dexJarBuildPath := p.DexJarInstallPath()
5108 stem := android.RemoveOptionalPrebuiltPrefix(name)
5109 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5110 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5111 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005112 }
5113
Paul Duffin39853512021-02-26 11:09:39 +00005114 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005115 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005116 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005117 android.AssertArrayString(t, "Check if there is no source variant",
5118 []string{"android_common"},
5119 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005120 }
5121
5122 t.Run("prebuilt only", func(t *testing.T) {
5123 bp := `
5124 prebuilt_apex {
5125 name: "myapex",
5126 arch: {
5127 arm64: {
5128 src: "myapex-arm64.apex",
5129 },
5130 arm: {
5131 src: "myapex-arm.apex",
5132 },
5133 },
Paul Duffin39853512021-02-26 11:09:39 +00005134 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005135 }
5136
5137 java_import {
5138 name: "libfoo",
5139 jars: ["libfoo.jar"],
5140 }
Paul Duffin39853512021-02-26 11:09:39 +00005141
5142 java_sdk_library_import {
5143 name: "libbar",
5144 public: {
5145 jars: ["libbar.jar"],
5146 },
5147 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005148 `
5149
5150 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5151 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5152
Martin Stjernholm44825602021-09-17 01:44:12 +01005153 deapexerName := deapexerModuleName("myapex")
5154 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5155
Paul Duffinf6932af2021-02-26 18:21:56 +00005156 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005157 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005158 rule := deapexer.Rule("deapexer")
5159 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5160 t.Errorf("expected: %q, found: %q", expected, actual)
5161 }
5162
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005163 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005164 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005165 rule = prebuiltApex.Rule("android/soong/android.Cp")
5166 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5167 t.Errorf("expected: %q, found: %q", expected, actual)
5168 }
5169
Paul Duffin89886cb2021-02-05 16:44:03 +00005170 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005171 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005172
5173 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005174 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005175 })
5176
5177 t.Run("prebuilt with source preferred", func(t *testing.T) {
5178
5179 bp := `
5180 prebuilt_apex {
5181 name: "myapex",
5182 arch: {
5183 arm64: {
5184 src: "myapex-arm64.apex",
5185 },
5186 arm: {
5187 src: "myapex-arm.apex",
5188 },
5189 },
Paul Duffin39853512021-02-26 11:09:39 +00005190 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005191 }
5192
5193 java_import {
5194 name: "libfoo",
5195 jars: ["libfoo.jar"],
5196 }
5197
5198 java_library {
5199 name: "libfoo",
5200 }
Paul Duffin39853512021-02-26 11:09:39 +00005201
5202 java_sdk_library_import {
5203 name: "libbar",
5204 public: {
5205 jars: ["libbar.jar"],
5206 },
5207 }
5208
5209 java_sdk_library {
5210 name: "libbar",
5211 srcs: ["foo/bar/MyClass.java"],
5212 unsafe_ignore_missing_latest_api: true,
5213 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005214 `
5215
5216 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5217 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5218
Paul Duffin89886cb2021-02-05 16:44:03 +00005219 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005220 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005221 ensureNoSourceVariant(t, ctx, "libfoo")
5222
5223 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005224 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005225 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005226 })
5227
5228 t.Run("prebuilt preferred with source", func(t *testing.T) {
5229 bp := `
5230 prebuilt_apex {
5231 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005232 arch: {
5233 arm64: {
5234 src: "myapex-arm64.apex",
5235 },
5236 arm: {
5237 src: "myapex-arm.apex",
5238 },
5239 },
Paul Duffin39853512021-02-26 11:09:39 +00005240 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005241 }
5242
5243 java_import {
5244 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005245 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005246 jars: ["libfoo.jar"],
5247 }
5248
5249 java_library {
5250 name: "libfoo",
5251 }
Paul Duffin39853512021-02-26 11:09:39 +00005252
5253 java_sdk_library_import {
5254 name: "libbar",
5255 prefer: true,
5256 public: {
5257 jars: ["libbar.jar"],
5258 },
5259 }
5260
5261 java_sdk_library {
5262 name: "libbar",
5263 srcs: ["foo/bar/MyClass.java"],
5264 unsafe_ignore_missing_latest_api: true,
5265 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005266 `
5267
5268 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5269 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5270
Paul Duffin89886cb2021-02-05 16:44:03 +00005271 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005272 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005273 ensureNoSourceVariant(t, ctx, "libfoo")
5274
5275 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005276 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005277 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005278 })
5279}
5280
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005281func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005282 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005283 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005284 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5285 // is disabled.
5286 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5287 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005288
Paul Duffin37856732021-02-26 14:24:15 +00005289 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5290 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005291 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005292 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005293 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005294 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005295 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005296 foundLibfooJar = true
5297 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005298 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005299 }
5300 }
5301 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005302 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 +00005303 }
5304 }
5305
Paul Duffin40a3f652021-07-19 13:11:24 +01005306 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005307 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005308 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005309 var rule android.TestingBuildParams
5310
5311 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5312 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005313 }
5314
Paul Duffin40a3f652021-07-19 13:11:24 +01005315 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5316 t.Helper()
5317 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5318 var rule android.TestingBuildParams
5319
5320 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5321 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5322 }
5323
Paul Duffin89f570a2021-06-16 01:42:33 +01005324 fragment := java.ApexVariantReference{
5325 Apex: proptools.StringPtr("myapex"),
5326 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5327 }
5328
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005329 t.Run("prebuilt only", func(t *testing.T) {
5330 bp := `
5331 prebuilt_apex {
5332 name: "myapex",
5333 arch: {
5334 arm64: {
5335 src: "myapex-arm64.apex",
5336 },
5337 arm: {
5338 src: "myapex-arm.apex",
5339 },
5340 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005341 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5342 }
5343
5344 prebuilt_bootclasspath_fragment {
5345 name: "my-bootclasspath-fragment",
5346 contents: ["libfoo", "libbar"],
5347 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005348 hidden_api: {
5349 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5350 metadata: "my-bootclasspath-fragment/metadata.csv",
5351 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005352 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5353 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5354 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005355 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 }
5357
5358 java_import {
5359 name: "libfoo",
5360 jars: ["libfoo.jar"],
5361 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005362 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005363 }
Paul Duffin37856732021-02-26 14:24:15 +00005364
5365 java_sdk_library_import {
5366 name: "libbar",
5367 public: {
5368 jars: ["libbar.jar"],
5369 },
5370 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005371 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005372 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005373 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374 `
5375
Paul Duffin89f570a2021-06-16 01:42:33 +01005376 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005377 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5378 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005379
Paul Duffin537ea3d2021-05-14 10:38:00 +01005380 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005381 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005382 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005383 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005384 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5385 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005386 })
5387
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005388 t.Run("apex_set only", func(t *testing.T) {
5389 bp := `
5390 apex_set {
5391 name: "myapex",
5392 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005393 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005394 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005395 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5396 }
5397
5398 java_import {
5399 name: "myjavalib",
5400 jars: ["myjavalib.jar"],
5401 apex_available: ["myapex"],
5402 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005403 }
5404
5405 prebuilt_bootclasspath_fragment {
5406 name: "my-bootclasspath-fragment",
5407 contents: ["libfoo", "libbar"],
5408 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005409 hidden_api: {
5410 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5411 metadata: "my-bootclasspath-fragment/metadata.csv",
5412 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005413 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5414 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5415 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005416 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005417 }
5418
Liz Kammer2dc72442023-04-20 10:10:48 -04005419 prebuilt_systemserverclasspath_fragment {
5420 name: "my-systemserverclasspath-fragment",
5421 contents: ["libbaz"],
5422 apex_available: ["myapex"],
5423 }
5424
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005425 java_import {
5426 name: "libfoo",
5427 jars: ["libfoo.jar"],
5428 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005429 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005430 }
5431
5432 java_sdk_library_import {
5433 name: "libbar",
5434 public: {
5435 jars: ["libbar.jar"],
5436 },
5437 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005438 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005439 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005440 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005441
5442 java_sdk_library_import {
5443 name: "libbaz",
5444 public: {
5445 jars: ["libbaz.jar"],
5446 },
5447 apex_available: ["myapex"],
5448 shared_library: false,
5449 permitted_packages: ["baz"],
5450 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005451 `
5452
Paul Duffin89f570a2021-06-16 01:42:33 +01005453 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005454 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5455 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5456
Paul Duffin537ea3d2021-05-14 10:38:00 +01005457 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005458 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005459 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005460 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005461 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5462 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005463
5464 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5465
5466 overrideNames := []string{
5467 "",
5468 "myjavalib.myapex",
5469 "libfoo.myapex",
5470 "libbar.myapex",
5471 "libbaz.myapex",
5472 }
5473 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5474 for i, e := range mkEntries {
5475 g := e.OverrideName
5476 if w := overrideNames[i]; w != g {
5477 t.Errorf("Expected override name %q, got %q", w, g)
5478 }
5479 }
5480
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005481 })
5482
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005483 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5484 bp := `
5485 prebuilt_apex {
5486 name: "myapex",
5487 arch: {
5488 arm64: {
5489 src: "myapex-arm64.apex",
5490 },
5491 arm: {
5492 src: "myapex-arm.apex",
5493 },
5494 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005495 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5496 }
5497
5498 prebuilt_bootclasspath_fragment {
5499 name: "my-bootclasspath-fragment",
5500 contents: ["libfoo", "libbar"],
5501 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005502 hidden_api: {
5503 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5504 metadata: "my-bootclasspath-fragment/metadata.csv",
5505 index: "my-bootclasspath-fragment/index.csv",
5506 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5507 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5508 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 }
5510
5511 java_import {
5512 name: "libfoo",
5513 jars: ["libfoo.jar"],
5514 apex_available: ["myapex"],
5515 }
5516
5517 java_library {
5518 name: "libfoo",
5519 srcs: ["foo/bar/MyClass.java"],
5520 apex_available: ["myapex"],
5521 }
Paul Duffin37856732021-02-26 14:24:15 +00005522
5523 java_sdk_library_import {
5524 name: "libbar",
5525 public: {
5526 jars: ["libbar.jar"],
5527 },
5528 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005529 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005530 }
5531
5532 java_sdk_library {
5533 name: "libbar",
5534 srcs: ["foo/bar/MyClass.java"],
5535 unsafe_ignore_missing_latest_api: true,
5536 apex_available: ["myapex"],
5537 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 `
5539
5540 // In this test the source (java_library) libfoo is active since the
5541 // prebuilt (java_import) defaults to prefer:false. However the
5542 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5543 // find the dex boot jar in it. We either need to disable the source libfoo
5544 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005545 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005546 // dexbootjar check is skipped if AllowMissingDependencies is true
5547 preparerAllowMissingDeps := android.GroupFixturePreparers(
5548 preparer,
5549 android.PrepareForTestWithAllowMissingDependencies,
5550 )
5551 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 })
5553
5554 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5555 bp := `
5556 prebuilt_apex {
5557 name: "myapex",
5558 arch: {
5559 arm64: {
5560 src: "myapex-arm64.apex",
5561 },
5562 arm: {
5563 src: "myapex-arm.apex",
5564 },
5565 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5567 }
5568
5569 prebuilt_bootclasspath_fragment {
5570 name: "my-bootclasspath-fragment",
5571 contents: ["libfoo", "libbar"],
5572 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005573 hidden_api: {
5574 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5575 metadata: "my-bootclasspath-fragment/metadata.csv",
5576 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005577 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5578 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5579 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005580 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 }
5582
5583 java_import {
5584 name: "libfoo",
5585 prefer: true,
5586 jars: ["libfoo.jar"],
5587 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005588 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 }
5590
5591 java_library {
5592 name: "libfoo",
5593 srcs: ["foo/bar/MyClass.java"],
5594 apex_available: ["myapex"],
5595 }
Paul Duffin37856732021-02-26 14:24:15 +00005596
5597 java_sdk_library_import {
5598 name: "libbar",
5599 prefer: true,
5600 public: {
5601 jars: ["libbar.jar"],
5602 },
5603 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005604 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005605 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005606 }
5607
5608 java_sdk_library {
5609 name: "libbar",
5610 srcs: ["foo/bar/MyClass.java"],
5611 unsafe_ignore_missing_latest_api: true,
5612 apex_available: ["myapex"],
5613 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 `
5615
Paul Duffin89f570a2021-06-16 01:42:33 +01005616 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005617 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5618 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005619
Paul Duffin537ea3d2021-05-14 10:38:00 +01005620 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005621 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005622 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005623 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005624 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5625 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005626 })
5627
5628 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5629 bp := `
5630 apex {
5631 name: "myapex",
5632 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005633 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005634 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005635 }
5636
5637 apex_key {
5638 name: "myapex.key",
5639 public_key: "testkey.avbpubkey",
5640 private_key: "testkey.pem",
5641 }
5642
5643 prebuilt_apex {
5644 name: "myapex",
5645 arch: {
5646 arm64: {
5647 src: "myapex-arm64.apex",
5648 },
5649 arm: {
5650 src: "myapex-arm.apex",
5651 },
5652 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005653 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5654 }
5655
5656 prebuilt_bootclasspath_fragment {
5657 name: "my-bootclasspath-fragment",
5658 contents: ["libfoo", "libbar"],
5659 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005660 hidden_api: {
5661 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5662 metadata: "my-bootclasspath-fragment/metadata.csv",
5663 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005664 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5665 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5666 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005667 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005668 }
5669
5670 java_import {
5671 name: "libfoo",
5672 jars: ["libfoo.jar"],
5673 apex_available: ["myapex"],
5674 }
5675
5676 java_library {
5677 name: "libfoo",
5678 srcs: ["foo/bar/MyClass.java"],
5679 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005680 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005681 }
Paul Duffin37856732021-02-26 14:24:15 +00005682
5683 java_sdk_library_import {
5684 name: "libbar",
5685 public: {
5686 jars: ["libbar.jar"],
5687 },
5688 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005689 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005690 }
5691
5692 java_sdk_library {
5693 name: "libbar",
5694 srcs: ["foo/bar/MyClass.java"],
5695 unsafe_ignore_missing_latest_api: true,
5696 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005697 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005698 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005699 `
5700
Paul Duffin89f570a2021-06-16 01:42:33 +01005701 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005702 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5703 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005704
Paul Duffin537ea3d2021-05-14 10:38:00 +01005705 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005706 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005707 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005708 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005709 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5710 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 })
5712
5713 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5714 bp := `
5715 apex {
5716 name: "myapex",
5717 enabled: false,
5718 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005719 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005720 }
5721
5722 apex_key {
5723 name: "myapex.key",
5724 public_key: "testkey.avbpubkey",
5725 private_key: "testkey.pem",
5726 }
5727
5728 prebuilt_apex {
5729 name: "myapex",
5730 arch: {
5731 arm64: {
5732 src: "myapex-arm64.apex",
5733 },
5734 arm: {
5735 src: "myapex-arm.apex",
5736 },
5737 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005738 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5739 }
5740
5741 prebuilt_bootclasspath_fragment {
5742 name: "my-bootclasspath-fragment",
5743 contents: ["libfoo", "libbar"],
5744 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005745 hidden_api: {
5746 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5747 metadata: "my-bootclasspath-fragment/metadata.csv",
5748 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005749 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5750 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5751 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005752 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005753 }
5754
5755 java_import {
5756 name: "libfoo",
5757 prefer: true,
5758 jars: ["libfoo.jar"],
5759 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005760 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005761 }
5762
5763 java_library {
5764 name: "libfoo",
5765 srcs: ["foo/bar/MyClass.java"],
5766 apex_available: ["myapex"],
5767 }
Paul Duffin37856732021-02-26 14:24:15 +00005768
5769 java_sdk_library_import {
5770 name: "libbar",
5771 prefer: true,
5772 public: {
5773 jars: ["libbar.jar"],
5774 },
5775 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005776 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005777 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005778 }
5779
5780 java_sdk_library {
5781 name: "libbar",
5782 srcs: ["foo/bar/MyClass.java"],
5783 unsafe_ignore_missing_latest_api: true,
5784 apex_available: ["myapex"],
5785 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005786 `
5787
Paul Duffin89f570a2021-06-16 01:42:33 +01005788 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005789 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5790 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005791
Paul Duffin537ea3d2021-05-14 10:38:00 +01005792 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005793 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005794 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005795 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005796 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5797 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005798 })
5799}
5800
Roland Levillain630846d2019-06-26 12:48:34 +01005801func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005802 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005803 apex_test {
5804 name: "myapex",
5805 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005806 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005807 tests: [
5808 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005809 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005810 ],
5811 }
5812
5813 apex_key {
5814 name: "myapex.key",
5815 public_key: "testkey.avbpubkey",
5816 private_key: "testkey.pem",
5817 }
5818
Liz Kammer1c14a212020-05-12 15:26:55 -07005819 filegroup {
5820 name: "fg",
5821 srcs: [
5822 "baz",
5823 "bar/baz"
5824 ],
5825 }
5826
Roland Levillain630846d2019-06-26 12:48:34 +01005827 cc_test {
5828 name: "mytest",
5829 gtest: false,
5830 srcs: ["mytest.cpp"],
5831 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005832 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005833 system_shared_libs: [],
5834 static_executable: true,
5835 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005836 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005837 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005838
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005839 cc_library {
5840 name: "mylib",
5841 srcs: ["mylib.cpp"],
5842 system_shared_libs: [],
5843 stl: "none",
5844 }
5845
Liz Kammer5bd365f2020-05-27 15:15:11 -07005846 filegroup {
5847 name: "fg2",
5848 srcs: [
5849 "testdata/baz"
5850 ],
5851 }
5852
Roland Levillain9b5fde92019-06-28 15:41:19 +01005853 cc_test {
5854 name: "mytests",
5855 gtest: false,
5856 srcs: [
5857 "mytest1.cpp",
5858 "mytest2.cpp",
5859 "mytest3.cpp",
5860 ],
5861 test_per_src: true,
5862 relative_install_path: "test",
5863 system_shared_libs: [],
5864 static_executable: true,
5865 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005866 data: [
5867 ":fg",
5868 ":fg2",
5869 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005870 }
Roland Levillain630846d2019-06-26 12:48:34 +01005871 `)
5872
Sundong Ahnabb64432019-10-22 13:58:29 +09005873 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005874 copyCmds := apexRule.Args["copy_commands"]
5875
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005876 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005877 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005878 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005879
Liz Kammer1c14a212020-05-12 15:26:55 -07005880 //Ensure that test data are copied into apex.
5881 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5882 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5883
Roland Levillain9b5fde92019-06-28 15:41:19 +01005884 // Ensure that test deps built with `test_per_src` are copied into apex.
5885 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5886 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5887 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005888
5889 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005890 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005891 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005892 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005893 prefix := "TARGET_"
5894 var builder strings.Builder
5895 data.Custom(&builder, name, prefix, "", data)
5896 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005897 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5898 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5899 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5900 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5901 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5902 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005903 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005904
5905 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005906 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005907 data.Custom(&builder, name, prefix, "", data)
5908 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005909 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5910 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005911}
5912
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005913func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005914 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005915 apex {
5916 name: "myapex",
5917 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005918 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005919 }
5920 apex_key {
5921 name: "myapex.key",
5922 public_key: "testkey.avbpubkey",
5923 private_key: "testkey.pem",
5924 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005925 `,
5926 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5927 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5928 }),
5929 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005930 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005931 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005932 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005933 var builder strings.Builder
5934 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5935 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005936 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005937}
5938
Jooyung Hand48f3c32019-08-23 11:18:57 +09005939func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5940 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5941 apex {
5942 name: "myapex",
5943 key: "myapex.key",
5944 native_shared_libs: ["libfoo"],
5945 }
5946
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }
5952
5953 cc_library {
5954 name: "libfoo",
5955 stl: "none",
5956 system_shared_libs: [],
5957 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005958 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005959 }
5960 `)
5961 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5962 apex {
5963 name: "myapex",
5964 key: "myapex.key",
5965 java_libs: ["myjar"],
5966 }
5967
5968 apex_key {
5969 name: "myapex.key",
5970 public_key: "testkey.avbpubkey",
5971 private_key: "testkey.pem",
5972 }
5973
5974 java_library {
5975 name: "myjar",
5976 srcs: ["foo/bar/MyClass.java"],
5977 sdk_version: "none",
5978 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005979 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005980 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005981 }
5982 `)
5983}
5984
Bill Peckhama41a6962021-01-11 10:58:54 -08005985func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005986 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005987 apex {
5988 name: "myapex",
5989 key: "myapex.key",
5990 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005991 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005992 }
5993
5994 apex_key {
5995 name: "myapex.key",
5996 public_key: "testkey.avbpubkey",
5997 private_key: "testkey.pem",
5998 }
5999
6000 java_import {
6001 name: "myjavaimport",
6002 apex_available: ["myapex"],
6003 jars: ["my.jar"],
6004 compile_dex: true,
6005 }
6006 `)
6007
6008 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6009 apexRule := module.Rule("apexRule")
6010 copyCmds := apexRule.Args["copy_commands"]
6011 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6012}
6013
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006014func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006015 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006016 apex {
6017 name: "myapex",
6018 key: "myapex.key",
6019 apps: [
6020 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006021 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006022 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006023 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006024 }
6025
6026 apex_key {
6027 name: "myapex.key",
6028 public_key: "testkey.avbpubkey",
6029 private_key: "testkey.pem",
6030 }
6031
6032 android_app {
6033 name: "AppFoo",
6034 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006035 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006036 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006037 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006038 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006039 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006040 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006041
6042 android_app {
6043 name: "AppFooPriv",
6044 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006045 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006046 system_modules: "none",
6047 privileged: true,
Andrei Onea580636b2022-08-17 16:53:46 +00006048 privapp_allowlist: "perms.xml",
6049 package_name: "com.android.AppFooPriv",
Colin Cross094cde42020-02-15 10:38:00 -08006050 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006051 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006052 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006053
6054 cc_library_shared {
6055 name: "libjni",
6056 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006057 shared_libs: ["libfoo"],
6058 stl: "none",
6059 system_shared_libs: [],
6060 apex_available: [ "myapex" ],
6061 sdk_version: "current",
6062 }
6063
6064 cc_library_shared {
6065 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006066 stl: "none",
6067 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006068 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006069 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006070 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006071 `)
6072
Sundong Ahnabb64432019-10-22 13:58:29 +09006073 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006074 apexRule := module.Rule("apexRule")
6075 copyCmds := apexRule.Args["copy_commands"]
6076
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006077 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6078 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006079 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006080
Colin Crossaede88c2020-08-11 12:17:01 -07006081 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006082 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006083 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006084 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006085 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006086 // JNI libraries including transitive deps are
6087 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006088 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006089 // ... embedded inside APK (jnilibs.zip)
6090 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6091 // ... and not directly inside the APEX
6092 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6093 }
Dario Frenicde2a032019-10-27 00:29:22 +01006094}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006095
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006096func TestApexWithAppImportBuildId(t *testing.T) {
6097 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6098 for _, id := range invalidBuildIds {
6099 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6100 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6101 variables.BuildId = proptools.StringPtr(id)
6102 })
6103 testApexError(t, message, `apex {
6104 name: "myapex",
6105 key: "myapex.key",
6106 apps: ["AppFooPrebuilt"],
6107 updatable: false,
6108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
6116 android_app_import {
6117 name: "AppFooPrebuilt",
6118 apk: "PrebuiltAppFoo.apk",
6119 presigned: true,
6120 apex_available: ["myapex"],
6121 }
6122 `, fixture)
6123 }
6124}
6125
Dario Frenicde2a032019-10-27 00:29:22 +01006126func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006127 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006128 apex {
6129 name: "myapex",
6130 key: "myapex.key",
6131 apps: [
6132 "AppFooPrebuilt",
6133 "AppFooPrivPrebuilt",
6134 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006135 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 android_app_import {
6145 name: "AppFooPrebuilt",
6146 apk: "PrebuiltAppFoo.apk",
6147 presigned: true,
6148 dex_preopt: {
6149 enabled: false,
6150 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006151 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006152 }
6153
6154 android_app_import {
6155 name: "AppFooPrivPrebuilt",
6156 apk: "PrebuiltAppFooPriv.apk",
6157 privileged: true,
6158 presigned: true,
6159 dex_preopt: {
6160 enabled: false,
6161 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006162 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006163 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006164 }
6165 `)
6166
Sundong Ahnabb64432019-10-22 13:58:29 +09006167 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006168 apexRule := module.Rule("apexRule")
6169 copyCmds := apexRule.Args["copy_commands"]
6170
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006171 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6172 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006173}
6174
6175func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006176 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006177 apex {
6178 name: "myapex",
6179 key: "myapex.key",
6180 apps: [
6181 "AppFoo",
6182 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006183 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006184 }
6185
6186 apex_key {
6187 name: "myapex.key",
6188 public_key: "testkey.avbpubkey",
6189 private_key: "testkey.pem",
6190 }
6191
6192 android_app {
6193 name: "AppFoo",
6194 srcs: ["foo/bar/MyClass.java"],
6195 sdk_version: "none",
6196 system_modules: "none",
6197 apex_available: [ "myapex" ],
6198 }
6199
6200 android_app_import {
6201 name: "AppFoo",
6202 apk: "AppFooPrebuilt.apk",
6203 filename: "AppFooPrebuilt.apk",
6204 presigned: true,
6205 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006206 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006207 }
6208 `, withFiles(map[string][]byte{
6209 "AppFooPrebuilt.apk": nil,
6210 }))
6211
6212 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006213 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006214 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006215}
6216
Dario Freni6f3937c2019-12-20 22:58:03 +00006217func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006218 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006219 apex {
6220 name: "myapex",
6221 key: "myapex.key",
6222 apps: [
6223 "TesterHelpAppFoo",
6224 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006225 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006226 }
6227
6228 apex_key {
6229 name: "myapex.key",
6230 public_key: "testkey.avbpubkey",
6231 private_key: "testkey.pem",
6232 }
6233
6234 android_test_helper_app {
6235 name: "TesterHelpAppFoo",
6236 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006237 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006238 }
6239
6240 `)
6241
6242 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6243 apexRule := module.Rule("apexRule")
6244 copyCmds := apexRule.Args["copy_commands"]
6245
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006246 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006247}
6248
Jooyung Han18020ea2019-11-13 10:50:48 +09006249func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6250 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006251 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006252 apex {
6253 name: "myapex",
6254 key: "myapex.key",
6255 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006256 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006257 }
6258
6259 apex_key {
6260 name: "myapex.key",
6261 public_key: "testkey.avbpubkey",
6262 private_key: "testkey.pem",
6263 }
6264
6265 apex {
6266 name: "otherapex",
6267 key: "myapex.key",
6268 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006269 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006270 }
6271
6272 cc_defaults {
6273 name: "libfoo-defaults",
6274 apex_available: ["otherapex"],
6275 }
6276
6277 cc_library {
6278 name: "libfoo",
6279 defaults: ["libfoo-defaults"],
6280 stl: "none",
6281 system_shared_libs: [],
6282 }`)
6283}
6284
Paul Duffine52e66f2020-03-30 17:54:29 +01006285func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006286 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006287 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006288 apex {
6289 name: "myapex",
6290 key: "myapex.key",
6291 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006292 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006293 }
6294
6295 apex_key {
6296 name: "myapex.key",
6297 public_key: "testkey.avbpubkey",
6298 private_key: "testkey.pem",
6299 }
6300
6301 apex {
6302 name: "otherapex",
6303 key: "otherapex.key",
6304 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006305 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006306 }
6307
6308 apex_key {
6309 name: "otherapex.key",
6310 public_key: "testkey.avbpubkey",
6311 private_key: "testkey.pem",
6312 }
6313
6314 cc_library {
6315 name: "libfoo",
6316 stl: "none",
6317 system_shared_libs: [],
6318 apex_available: ["otherapex"],
6319 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006320}
Jiyong Park127b40b2019-09-30 16:04:35 +09006321
Paul Duffine52e66f2020-03-30 17:54:29 +01006322func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006323 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006324 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006325.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006326.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006327.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006328.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006329.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006330.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006331 apex {
6332 name: "myapex",
6333 key: "myapex.key",
6334 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006335 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006336 }
6337
6338 apex_key {
6339 name: "myapex.key",
6340 public_key: "testkey.avbpubkey",
6341 private_key: "testkey.pem",
6342 }
6343
Jiyong Park127b40b2019-09-30 16:04:35 +09006344 cc_library {
6345 name: "libfoo",
6346 stl: "none",
6347 shared_libs: ["libbar"],
6348 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006349 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006350 }
6351
6352 cc_library {
6353 name: "libbar",
6354 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006355 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006356 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006357 apex_available: ["myapex"],
6358 }
6359
6360 cc_library {
6361 name: "libbaz",
6362 stl: "none",
6363 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006364 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006365}
Jiyong Park127b40b2019-09-30 16:04:35 +09006366
Paul Duffine52e66f2020-03-30 17:54:29 +01006367func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006368 testApexError(t, "\"otherapex\" is not a valid module name", `
6369 apex {
6370 name: "myapex",
6371 key: "myapex.key",
6372 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006373 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006374 }
6375
6376 apex_key {
6377 name: "myapex.key",
6378 public_key: "testkey.avbpubkey",
6379 private_key: "testkey.pem",
6380 }
6381
6382 cc_library {
6383 name: "libfoo",
6384 stl: "none",
6385 system_shared_libs: [],
6386 apex_available: ["otherapex"],
6387 }`)
6388
Paul Duffine52e66f2020-03-30 17:54:29 +01006389 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006390 apex {
6391 name: "myapex",
6392 key: "myapex.key",
6393 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006394 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006395 }
6396
6397 apex_key {
6398 name: "myapex.key",
6399 public_key: "testkey.avbpubkey",
6400 private_key: "testkey.pem",
6401 }
6402
6403 cc_library {
6404 name: "libfoo",
6405 stl: "none",
6406 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006407 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006408 apex_available: ["myapex"],
6409 }
6410
6411 cc_library {
6412 name: "libbar",
6413 stl: "none",
6414 system_shared_libs: [],
6415 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006416 }
6417
6418 cc_library {
6419 name: "libbaz",
6420 stl: "none",
6421 system_shared_libs: [],
6422 stubs: {
6423 versions: ["10", "20", "30"],
6424 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006425 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006426}
Jiyong Park127b40b2019-09-30 16:04:35 +09006427
Jiyong Park89e850a2020-04-07 16:37:39 +09006428func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006429 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006430 apex {
6431 name: "myapex",
6432 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006433 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006434 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006435 }
6436
6437 apex_key {
6438 name: "myapex.key",
6439 public_key: "testkey.avbpubkey",
6440 private_key: "testkey.pem",
6441 }
6442
6443 cc_library {
6444 name: "libfoo",
6445 stl: "none",
6446 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006447 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006448 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006449 }
6450
6451 cc_library {
6452 name: "libfoo2",
6453 stl: "none",
6454 system_shared_libs: [],
6455 shared_libs: ["libbaz"],
6456 apex_available: ["//apex_available:platform"],
6457 }
6458
6459 cc_library {
6460 name: "libbar",
6461 stl: "none",
6462 system_shared_libs: [],
6463 apex_available: ["myapex"],
6464 }
6465
6466 cc_library {
6467 name: "libbaz",
6468 stl: "none",
6469 system_shared_libs: [],
6470 apex_available: ["myapex"],
6471 stubs: {
6472 versions: ["1"],
6473 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006474 }`)
6475
Jiyong Park89e850a2020-04-07 16:37:39 +09006476 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6477 // because it depends on libbar which isn't available to platform
6478 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6479 if libfoo.NotAvailableForPlatform() != true {
6480 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6481 }
6482
6483 // libfoo2 however can be available to platform because it depends on libbaz which provides
6484 // stubs
6485 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6486 if libfoo2.NotAvailableForPlatform() == true {
6487 t.Errorf("%q should be available to platform", libfoo2.String())
6488 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006489}
Jiyong Parka90ca002019-10-07 15:47:24 +09006490
Paul Duffine52e66f2020-03-30 17:54:29 +01006491func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006492 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006493 apex {
6494 name: "myapex",
6495 key: "myapex.key",
6496 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006497 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006498 }
6499
6500 apex_key {
6501 name: "myapex.key",
6502 public_key: "testkey.avbpubkey",
6503 private_key: "testkey.pem",
6504 }
6505
6506 cc_library {
6507 name: "libfoo",
6508 stl: "none",
6509 system_shared_libs: [],
6510 apex_available: ["myapex"],
6511 static: {
6512 apex_available: ["//apex_available:platform"],
6513 },
6514 }`)
6515
Jiyong Park89e850a2020-04-07 16:37:39 +09006516 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6517 if libfooShared.NotAvailableForPlatform() != true {
6518 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6519 }
6520 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6521 if libfooStatic.NotAvailableForPlatform() != false {
6522 t.Errorf("%q should be available to platform", libfooStatic.String())
6523 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006524}
6525
Jiyong Park5d790c32019-11-15 18:40:32 +09006526func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006527 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006528 apex {
6529 name: "myapex",
6530 key: "myapex.key",
6531 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006532 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006533 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006534 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006535 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006536 }
6537
6538 override_apex {
6539 name: "override_myapex",
6540 base: "myapex",
6541 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006542 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006543 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006544 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006545 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006546 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006547 key: "mynewapex.key",
6548 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006549 }
6550
6551 apex_key {
6552 name: "myapex.key",
6553 public_key: "testkey.avbpubkey",
6554 private_key: "testkey.pem",
6555 }
6556
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006557 apex_key {
6558 name: "mynewapex.key",
6559 public_key: "testkey2.avbpubkey",
6560 private_key: "testkey2.pem",
6561 }
6562
6563 android_app_certificate {
6564 name: "myapex.certificate",
6565 certificate: "testkey",
6566 }
6567
Jiyong Park5d790c32019-11-15 18:40:32 +09006568 android_app {
6569 name: "app",
6570 srcs: ["foo/bar/MyClass.java"],
6571 package_name: "foo",
6572 sdk_version: "none",
6573 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006574 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006575 }
6576
6577 override_android_app {
6578 name: "override_app",
6579 base: "app",
6580 package_name: "bar",
6581 }
markchien7c803b82021-08-26 22:10:06 +08006582
6583 bpf {
6584 name: "bpf",
6585 srcs: ["bpf.c"],
6586 }
6587
6588 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006589 name: "overrideBpf",
6590 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006591 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006592
6593 prebuilt_etc {
6594 name: "myetc",
6595 src: "myprebuilt",
6596 }
6597
6598 prebuilt_etc {
6599 name: "override_myetc",
6600 src: "override_myprebuilt",
6601 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006602 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006603
Jiyong Park317645e2019-12-05 13:20:58 +09006604 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6605 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6606 if originalVariant.GetOverriddenBy() != "" {
6607 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6608 }
6609 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6610 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6611 }
6612
Jiyong Park5d790c32019-11-15 18:40:32 +09006613 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6614 apexRule := module.Rule("apexRule")
6615 copyCmds := apexRule.Args["copy_commands"]
6616
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006617 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6618 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006619
markchien7c803b82021-08-26 22:10:06 +08006620 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006621 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006622
Daniel Norman5a3ce132021-08-26 15:44:43 -07006623 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6624 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6625
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006626 apexBundle := module.Module().(*apexBundle)
6627 name := apexBundle.Name()
6628 if name != "override_myapex" {
6629 t.Errorf("name should be \"override_myapex\", but was %q", name)
6630 }
6631
Baligh Uddin004d7172020-02-19 21:29:28 -08006632 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6633 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6634 }
6635
Jiyong Park20bacab2020-03-03 11:45:41 +09006636 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006637 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006638 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6639
6640 signApkRule := module.Rule("signapk")
6641 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006642
Colin Crossaa255532020-07-03 13:18:24 -07006643 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006644 var builder strings.Builder
6645 data.Custom(&builder, name, "TARGET_", "", data)
6646 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006647 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6648 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6649 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006650 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006651 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006652 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006653 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006654 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006655 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6656 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006657}
6658
Albert Martineefabcf2022-03-21 20:11:16 +00006659func TestMinSdkVersionOverride(t *testing.T) {
6660 // Override from 29 to 31
6661 minSdkOverride31 := "31"
6662 ctx := testApex(t, `
6663 apex {
6664 name: "myapex",
6665 key: "myapex.key",
6666 native_shared_libs: ["mylib"],
6667 updatable: true,
6668 min_sdk_version: "29"
6669 }
6670
6671 override_apex {
6672 name: "override_myapex",
6673 base: "myapex",
6674 logging_parent: "com.foo.bar",
6675 package_name: "test.overridden.package"
6676 }
6677
6678 apex_key {
6679 name: "myapex.key",
6680 public_key: "testkey.avbpubkey",
6681 private_key: "testkey.pem",
6682 }
6683
6684 cc_library {
6685 name: "mylib",
6686 srcs: ["mylib.cpp"],
6687 runtime_libs: ["libbar"],
6688 system_shared_libs: [],
6689 stl: "none",
6690 apex_available: [ "myapex" ],
6691 min_sdk_version: "apex_inherit"
6692 }
6693
6694 cc_library {
6695 name: "libbar",
6696 srcs: ["mylib.cpp"],
6697 system_shared_libs: [],
6698 stl: "none",
6699 apex_available: [ "myapex" ],
6700 min_sdk_version: "apex_inherit"
6701 }
6702
6703 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6704
6705 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6706 copyCmds := apexRule.Args["copy_commands"]
6707
6708 // Ensure that direct non-stubs dep is always included
6709 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6710
6711 // Ensure that runtime_libs dep in included
6712 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6713
6714 // Ensure libraries target overridden min_sdk_version value
6715 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6716}
6717
6718func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6719 // Attempt to override from 31 to 29, should be a NOOP
6720 minSdkOverride29 := "29"
6721 ctx := testApex(t, `
6722 apex {
6723 name: "myapex",
6724 key: "myapex.key",
6725 native_shared_libs: ["mylib"],
6726 updatable: true,
6727 min_sdk_version: "31"
6728 }
6729
6730 override_apex {
6731 name: "override_myapex",
6732 base: "myapex",
6733 logging_parent: "com.foo.bar",
6734 package_name: "test.overridden.package"
6735 }
6736
6737 apex_key {
6738 name: "myapex.key",
6739 public_key: "testkey.avbpubkey",
6740 private_key: "testkey.pem",
6741 }
6742
6743 cc_library {
6744 name: "mylib",
6745 srcs: ["mylib.cpp"],
6746 runtime_libs: ["libbar"],
6747 system_shared_libs: [],
6748 stl: "none",
6749 apex_available: [ "myapex" ],
6750 min_sdk_version: "apex_inherit"
6751 }
6752
6753 cc_library {
6754 name: "libbar",
6755 srcs: ["mylib.cpp"],
6756 system_shared_libs: [],
6757 stl: "none",
6758 apex_available: [ "myapex" ],
6759 min_sdk_version: "apex_inherit"
6760 }
6761
6762 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6763
6764 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6765 copyCmds := apexRule.Args["copy_commands"]
6766
6767 // Ensure that direct non-stubs dep is always included
6768 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6769
6770 // Ensure that runtime_libs dep in included
6771 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6772
6773 // Ensure libraries target the original min_sdk_version value rather than the overridden
6774 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6775}
6776
Jooyung Han214bf372019-11-12 13:03:50 +09006777func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006778 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006779 apex {
6780 name: "myapex",
6781 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006782 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006783 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006784 }
6785
6786 apex_key {
6787 name: "myapex.key",
6788 public_key: "testkey.avbpubkey",
6789 private_key: "testkey.pem",
6790 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006791
6792 cc_library {
6793 name: "mylib",
6794 srcs: ["mylib.cpp"],
6795 stl: "libc++",
6796 system_shared_libs: [],
6797 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006798 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006799 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006800 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006801
6802 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6803 args := module.Rule("apexRule").Args
6804 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006805 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006806
6807 // The copies of the libraries in the apex should have one more dependency than
6808 // the ones outside the apex, namely the unwinder. Ideally we should check
6809 // the dependency names directly here but for some reason the names are blank in
6810 // this test.
6811 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006812 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006813 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6814 if len(apexImplicits) != len(nonApexImplicits)+1 {
6815 t.Errorf("%q missing unwinder dep", lib)
6816 }
6817 }
Jooyung Han214bf372019-11-12 13:03:50 +09006818}
6819
Paul Duffine05480a2021-03-08 15:07:14 +00006820var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006821 "api/current.txt": nil,
6822 "api/removed.txt": nil,
6823 "api/system-current.txt": nil,
6824 "api/system-removed.txt": nil,
6825 "api/test-current.txt": nil,
6826 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006827
Anton Hanssondff2c782020-12-21 17:10:01 +00006828 "100/public/api/foo.txt": nil,
6829 "100/public/api/foo-removed.txt": nil,
6830 "100/system/api/foo.txt": nil,
6831 "100/system/api/foo-removed.txt": nil,
6832
Paul Duffineedc5d52020-06-12 17:46:39 +01006833 // For java_sdk_library_import
6834 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006835}
6836
Jooyung Han58f26ab2019-12-18 15:34:32 +09006837func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006838 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006839 apex {
6840 name: "myapex",
6841 key: "myapex.key",
6842 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006843 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006844 }
6845
6846 apex_key {
6847 name: "myapex.key",
6848 public_key: "testkey.avbpubkey",
6849 private_key: "testkey.pem",
6850 }
6851
6852 java_sdk_library {
6853 name: "foo",
6854 srcs: ["a.java"],
6855 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006856 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006857 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006858
6859 prebuilt_apis {
6860 name: "sdk",
6861 api_dirs: ["100"],
6862 }
Paul Duffin9b879592020-05-26 13:21:35 +01006863 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006864
6865 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006866 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006867 "javalib/foo.jar",
6868 "etc/permissions/foo.xml",
6869 })
6870 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006871 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006872 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 +09006873}
6874
Paul Duffin9b879592020-05-26 13:21:35 +01006875func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006876 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006877 apex {
6878 name: "myapex",
6879 key: "myapex.key",
6880 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006881 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006882 }
6883
6884 apex_key {
6885 name: "myapex.key",
6886 public_key: "testkey.avbpubkey",
6887 private_key: "testkey.pem",
6888 }
6889
6890 java_sdk_library {
6891 name: "foo",
6892 srcs: ["a.java"],
6893 api_packages: ["foo"],
6894 apex_available: ["myapex"],
6895 sdk_version: "none",
6896 system_modules: "none",
6897 }
6898
6899 java_library {
6900 name: "bar",
6901 srcs: ["a.java"],
6902 libs: ["foo"],
6903 apex_available: ["myapex"],
6904 sdk_version: "none",
6905 system_modules: "none",
6906 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006907
6908 prebuilt_apis {
6909 name: "sdk",
6910 api_dirs: ["100"],
6911 }
Paul Duffin9b879592020-05-26 13:21:35 +01006912 `, withFiles(filesForSdkLibrary))
6913
6914 // java_sdk_library installs both impl jar and permission XML
6915 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6916 "javalib/bar.jar",
6917 "javalib/foo.jar",
6918 "etc/permissions/foo.xml",
6919 })
6920
6921 // The bar library should depend on the implementation jar.
6922 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006923 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006924 t.Errorf("expected %q, found %#q", expected, actual)
6925 }
6926}
6927
6928func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006929 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006930 apex {
6931 name: "myapex",
6932 key: "myapex.key",
6933 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006934 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006935 }
6936
6937 apex_key {
6938 name: "myapex.key",
6939 public_key: "testkey.avbpubkey",
6940 private_key: "testkey.pem",
6941 }
6942
6943 java_sdk_library {
6944 name: "foo",
6945 srcs: ["a.java"],
6946 api_packages: ["foo"],
6947 apex_available: ["myapex"],
6948 sdk_version: "none",
6949 system_modules: "none",
6950 }
6951
6952 java_library {
6953 name: "bar",
6954 srcs: ["a.java"],
6955 libs: ["foo"],
6956 sdk_version: "none",
6957 system_modules: "none",
6958 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006959
6960 prebuilt_apis {
6961 name: "sdk",
6962 api_dirs: ["100"],
6963 }
Paul Duffin9b879592020-05-26 13:21:35 +01006964 `, withFiles(filesForSdkLibrary))
6965
6966 // java_sdk_library installs both impl jar and permission XML
6967 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6968 "javalib/foo.jar",
6969 "etc/permissions/foo.xml",
6970 })
6971
6972 // The bar library should depend on the stubs jar.
6973 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006974 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006975 t.Errorf("expected %q, found %#q", expected, actual)
6976 }
6977}
6978
Paul Duffineedc5d52020-06-12 17:46:39 +01006979func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006980 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006981 prebuilt_apis {
6982 name: "sdk",
6983 api_dirs: ["100"],
6984 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006985 withFiles(map[string][]byte{
6986 "apex/a.java": nil,
6987 "apex/apex_manifest.json": nil,
6988 "apex/Android.bp": []byte(`
6989 package {
6990 default_visibility: ["//visibility:private"],
6991 }
6992
6993 apex {
6994 name: "myapex",
6995 key: "myapex.key",
6996 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006997 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006998 }
6999
7000 apex_key {
7001 name: "myapex.key",
7002 public_key: "testkey.avbpubkey",
7003 private_key: "testkey.pem",
7004 }
7005
7006 java_library {
7007 name: "bar",
7008 srcs: ["a.java"],
7009 libs: ["foo"],
7010 apex_available: ["myapex"],
7011 sdk_version: "none",
7012 system_modules: "none",
7013 }
7014`),
7015 "source/a.java": nil,
7016 "source/api/current.txt": nil,
7017 "source/api/removed.txt": nil,
7018 "source/Android.bp": []byte(`
7019 package {
7020 default_visibility: ["//visibility:private"],
7021 }
7022
7023 java_sdk_library {
7024 name: "foo",
7025 visibility: ["//apex"],
7026 srcs: ["a.java"],
7027 api_packages: ["foo"],
7028 apex_available: ["myapex"],
7029 sdk_version: "none",
7030 system_modules: "none",
7031 public: {
7032 enabled: true,
7033 },
7034 }
7035`),
7036 "prebuilt/a.jar": nil,
7037 "prebuilt/Android.bp": []byte(`
7038 package {
7039 default_visibility: ["//visibility:private"],
7040 }
7041
7042 java_sdk_library_import {
7043 name: "foo",
7044 visibility: ["//apex", "//source"],
7045 apex_available: ["myapex"],
7046 prefer: true,
7047 public: {
7048 jars: ["a.jar"],
7049 },
7050 }
7051`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007052 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007053 )
7054
7055 // java_sdk_library installs both impl jar and permission XML
7056 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7057 "javalib/bar.jar",
7058 "javalib/foo.jar",
7059 "etc/permissions/foo.xml",
7060 })
7061
7062 // The bar library should depend on the implementation jar.
7063 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007064 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007065 t.Errorf("expected %q, found %#q", expected, actual)
7066 }
7067}
7068
7069func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7070 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7071 apex {
7072 name: "myapex",
7073 key: "myapex.key",
7074 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007075 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007076 }
7077
7078 apex_key {
7079 name: "myapex.key",
7080 public_key: "testkey.avbpubkey",
7081 private_key: "testkey.pem",
7082 }
7083
7084 java_sdk_library_import {
7085 name: "foo",
7086 apex_available: ["myapex"],
7087 prefer: true,
7088 public: {
7089 jars: ["a.jar"],
7090 },
7091 }
7092
7093 `, withFiles(filesForSdkLibrary))
7094}
7095
atrost6e126252020-01-27 17:01:16 +00007096func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007097 result := android.GroupFixturePreparers(
7098 prepareForApexTest,
7099 java.PrepareForTestWithPlatformCompatConfig,
7100 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007101 apex {
7102 name: "myapex",
7103 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007104 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007105 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007106 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007107 }
7108
7109 apex_key {
7110 name: "myapex.key",
7111 public_key: "testkey.avbpubkey",
7112 private_key: "testkey.pem",
7113 }
7114
7115 platform_compat_config {
7116 name: "myjar-platform-compat-config",
7117 src: ":myjar",
7118 }
7119
7120 java_library {
7121 name: "myjar",
7122 srcs: ["foo/bar/MyClass.java"],
7123 sdk_version: "none",
7124 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007125 apex_available: [ "myapex" ],
7126 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007127
7128 // Make sure that a preferred prebuilt does not affect the apex contents.
7129 prebuilt_platform_compat_config {
7130 name: "myjar-platform-compat-config",
7131 metadata: "compat-config/metadata.xml",
7132 prefer: true,
7133 }
atrost6e126252020-01-27 17:01:16 +00007134 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007135 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007136 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7137 "etc/compatconfig/myjar-platform-compat-config.xml",
7138 "javalib/myjar.jar",
7139 })
7140}
7141
Jooyung Han862c0d62022-12-21 10:15:37 +09007142func TestNoDupeApexFiles(t *testing.T) {
7143 android.GroupFixturePreparers(
7144 android.PrepareForTestWithAndroidBuildComponents,
7145 PrepareForTestWithApexBuildComponents,
7146 prepareForTestWithMyapex,
7147 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7148 ).
7149 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7150 RunTestWithBp(t, `
7151 apex {
7152 name: "myapex",
7153 key: "myapex.key",
7154 prebuilts: ["foo", "bar"],
7155 updatable: false,
7156 }
7157
7158 apex_key {
7159 name: "myapex.key",
7160 public_key: "testkey.avbpubkey",
7161 private_key: "testkey.pem",
7162 }
7163
7164 prebuilt_etc {
7165 name: "foo",
7166 src: "myprebuilt",
7167 filename_from_src: true,
7168 }
7169
7170 prebuilt_etc {
7171 name: "bar",
7172 src: "myprebuilt",
7173 filename_from_src: true,
7174 }
7175 `)
7176}
7177
Jiyong Park479321d2019-12-16 11:47:12 +09007178func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7179 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7180 apex {
7181 name: "myapex",
7182 key: "myapex.key",
7183 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007184 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007185 }
7186
7187 apex_key {
7188 name: "myapex.key",
7189 public_key: "testkey.avbpubkey",
7190 private_key: "testkey.pem",
7191 }
7192
7193 java_library {
7194 name: "myjar",
7195 srcs: ["foo/bar/MyClass.java"],
7196 sdk_version: "none",
7197 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007198 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007199 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007200 }
7201 `)
7202}
7203
Jiyong Park7afd1072019-12-30 16:56:33 +09007204func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007205 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007206 apex {
7207 name: "myapex",
7208 key: "myapex.key",
7209 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007210 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007211 }
7212
7213 apex_key {
7214 name: "myapex.key",
7215 public_key: "testkey.avbpubkey",
7216 private_key: "testkey.pem",
7217 }
7218
7219 cc_library {
7220 name: "mylib",
7221 srcs: ["mylib.cpp"],
7222 system_shared_libs: [],
7223 stl: "none",
7224 required: ["a", "b"],
7225 host_required: ["c", "d"],
7226 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007227 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007228 }
7229 `)
7230
7231 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007232 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007233 name := apexBundle.BaseModuleName()
7234 prefix := "TARGET_"
7235 var builder strings.Builder
7236 data.Custom(&builder, name, prefix, "", data)
7237 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007238 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 -08007239 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7240 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007241}
7242
Jiyong Park7cd10e32020-01-14 09:22:18 +09007243func TestSymlinksFromApexToSystem(t *testing.T) {
7244 bp := `
7245 apex {
7246 name: "myapex",
7247 key: "myapex.key",
7248 native_shared_libs: ["mylib"],
7249 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007250 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007251 }
7252
Jiyong Park9d677202020-02-19 16:29:35 +09007253 apex {
7254 name: "myapex.updatable",
7255 key: "myapex.key",
7256 native_shared_libs: ["mylib"],
7257 java_libs: ["myjar"],
7258 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007259 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007260 }
7261
Jiyong Park7cd10e32020-01-14 09:22:18 +09007262 apex_key {
7263 name: "myapex.key",
7264 public_key: "testkey.avbpubkey",
7265 private_key: "testkey.pem",
7266 }
7267
7268 cc_library {
7269 name: "mylib",
7270 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007271 shared_libs: [
7272 "myotherlib",
7273 "myotherlib_ext",
7274 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007275 system_shared_libs: [],
7276 stl: "none",
7277 apex_available: [
7278 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007279 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007280 "//apex_available:platform",
7281 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007282 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007283 }
7284
7285 cc_library {
7286 name: "myotherlib",
7287 srcs: ["mylib.cpp"],
7288 system_shared_libs: [],
7289 stl: "none",
7290 apex_available: [
7291 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007292 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007293 "//apex_available:platform",
7294 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007295 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007296 }
7297
Jiyong Parkce243632023-02-17 18:22:25 +09007298 cc_library {
7299 name: "myotherlib_ext",
7300 srcs: ["mylib.cpp"],
7301 system_shared_libs: [],
7302 system_ext_specific: true,
7303 stl: "none",
7304 apex_available: [
7305 "myapex",
7306 "myapex.updatable",
7307 "//apex_available:platform",
7308 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007309 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007310 }
7311
Jiyong Park7cd10e32020-01-14 09:22:18 +09007312 java_library {
7313 name: "myjar",
7314 srcs: ["foo/bar/MyClass.java"],
7315 sdk_version: "none",
7316 system_modules: "none",
7317 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007318 apex_available: [
7319 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007320 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007321 "//apex_available:platform",
7322 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007323 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007324 }
7325
7326 java_library {
7327 name: "myotherjar",
7328 srcs: ["foo/bar/MyClass.java"],
7329 sdk_version: "none",
7330 system_modules: "none",
7331 apex_available: [
7332 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007333 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007334 "//apex_available:platform",
7335 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007336 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007337 }
7338 `
7339
7340 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7341 for _, f := range files {
7342 if f.path == file {
7343 if f.isLink {
7344 t.Errorf("%q is not a real file", file)
7345 }
7346 return
7347 }
7348 }
7349 t.Errorf("%q is not found", file)
7350 }
7351
Jiyong Parkce243632023-02-17 18:22:25 +09007352 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007353 for _, f := range files {
7354 if f.path == file {
7355 if !f.isLink {
7356 t.Errorf("%q is not a symlink", file)
7357 }
Jiyong Parkce243632023-02-17 18:22:25 +09007358 if f.src != target {
7359 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7360 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007361 return
7362 }
7363 }
7364 t.Errorf("%q is not found", file)
7365 }
7366
Jiyong Park9d677202020-02-19 16:29:35 +09007367 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7368 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007369 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007370 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007371 ensureRealfileExists(t, files, "javalib/myjar.jar")
7372 ensureRealfileExists(t, files, "lib64/mylib.so")
7373 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007374 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007375
Jiyong Park9d677202020-02-19 16:29:35 +09007376 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7377 ensureRealfileExists(t, files, "javalib/myjar.jar")
7378 ensureRealfileExists(t, files, "lib64/mylib.so")
7379 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007380 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007381
7382 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007383 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007384 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007385 ensureRealfileExists(t, files, "javalib/myjar.jar")
7386 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007387 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7388 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007389
7390 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7391 ensureRealfileExists(t, files, "javalib/myjar.jar")
7392 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007393 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7394 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007395}
7396
Yo Chiange8128052020-07-23 20:09:18 +08007397func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007398 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007399 apex {
7400 name: "myapex",
7401 key: "myapex.key",
7402 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007403 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007404 }
7405
7406 apex_key {
7407 name: "myapex.key",
7408 public_key: "testkey.avbpubkey",
7409 private_key: "testkey.pem",
7410 }
7411
7412 cc_library_shared {
7413 name: "mylib",
7414 srcs: ["mylib.cpp"],
7415 shared_libs: ["myotherlib"],
7416 system_shared_libs: [],
7417 stl: "none",
7418 apex_available: [
7419 "myapex",
7420 "//apex_available:platform",
7421 ],
7422 }
7423
7424 cc_prebuilt_library_shared {
7425 name: "myotherlib",
7426 srcs: ["prebuilt.so"],
7427 system_shared_libs: [],
7428 stl: "none",
7429 apex_available: [
7430 "myapex",
7431 "//apex_available:platform",
7432 ],
7433 }
7434 `)
7435
Prerana Patilb1896c82022-11-09 18:14:34 +00007436 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007437 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007438 var builder strings.Builder
7439 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7440 androidMk := builder.String()
7441 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007442 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007443 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7444 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7445 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007446 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 +08007447}
7448
Jooyung Han643adc42020-02-27 13:50:06 +09007449func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007450 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007451 apex {
7452 name: "myapex",
7453 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007454 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007455 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007456 }
7457
7458 apex_key {
7459 name: "myapex.key",
7460 public_key: "testkey.avbpubkey",
7461 private_key: "testkey.pem",
7462 }
7463
7464 cc_library {
7465 name: "mylib",
7466 srcs: ["mylib.cpp"],
7467 shared_libs: ["mylib2"],
7468 system_shared_libs: [],
7469 stl: "none",
7470 apex_available: [ "myapex" ],
7471 }
7472
7473 cc_library {
7474 name: "mylib2",
7475 srcs: ["mylib.cpp"],
7476 system_shared_libs: [],
7477 stl: "none",
7478 apex_available: [ "myapex" ],
7479 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007480
7481 rust_ffi_shared {
7482 name: "libfoo.rust",
7483 crate_name: "foo",
7484 srcs: ["foo.rs"],
7485 shared_libs: ["libfoo.shared_from_rust"],
7486 prefer_rlib: true,
7487 apex_available: ["myapex"],
7488 }
7489
7490 cc_library_shared {
7491 name: "libfoo.shared_from_rust",
7492 srcs: ["mylib.cpp"],
7493 system_shared_libs: [],
7494 stl: "none",
7495 stubs: {
7496 versions: ["10", "11", "12"],
7497 },
7498 }
7499
Jooyung Han643adc42020-02-27 13:50:06 +09007500 `)
7501
7502 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7503 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007504 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007505 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7506 "lib64/mylib.so",
7507 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007508 "lib64/libfoo.rust.so",
7509 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7510 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007511 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007512
7513 // b/220397949
7514 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007515}
7516
Jooyung Han49f67012020-04-17 13:43:10 +09007517func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007518 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007519 apex {
7520 name: "myapex",
7521 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007522 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007523 }
7524 apex_key {
7525 name: "myapex.key",
7526 public_key: "testkey.avbpubkey",
7527 private_key: "testkey.pem",
7528 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007529 `,
7530 android.FixtureModifyConfig(func(config android.Config) {
7531 delete(config.Targets, android.Android)
7532 config.AndroidCommonTarget = android.Target{}
7533 }),
7534 )
Jooyung Han49f67012020-04-17 13:43:10 +09007535
7536 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7537 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7538 }
7539}
7540
Jiyong Parkbd159612020-02-28 15:22:21 +09007541func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007542 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007543 apex {
7544 name: "myapex",
7545 key: "myapex.key",
7546 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007547 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007548 }
7549
7550 apex_key {
7551 name: "myapex.key",
7552 public_key: "testkey.avbpubkey",
7553 private_key: "testkey.pem",
7554 }
7555
7556 android_app {
7557 name: "AppFoo",
7558 srcs: ["foo/bar/MyClass.java"],
7559 sdk_version: "none",
7560 system_modules: "none",
7561 apex_available: [ "myapex" ],
7562 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007563 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007564
Colin Crosscf371cc2020-11-13 11:48:42 -08007565 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007566 content := bundleConfigRule.Args["content"]
7567
7568 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007569 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 +09007570}
7571
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007572func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007573 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007574 apex {
7575 name: "myapex",
7576 key: "myapex.key",
7577 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007578 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007579 }
7580
7581 apex_key {
7582 name: "myapex.key",
7583 public_key: "testkey.avbpubkey",
7584 private_key: "testkey.pem",
7585 }
7586
7587 android_app_set {
7588 name: "AppSet",
7589 set: "AppSet.apks",
7590 }`)
7591 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007592 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007593 content := bundleConfigRule.Args["content"]
7594 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7595 s := mod.Rule("apexRule").Args["copy_commands"]
7596 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007597 if len(copyCmds) != 4 {
7598 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007599 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007600 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7601 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007602 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7603 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007604
7605 // Ensure that canned_fs_config has an entry for the app set zip file
7606 generateFsRule := mod.Rule("generateFsConfig")
7607 cmd := generateFsRule.RuleParams.Command
7608 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007609}
7610
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007611func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007612 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007613 apex_set {
7614 name: "myapex",
7615 filename: "foo_v2.apex",
7616 sanitized: {
7617 none: { set: "myapex.apks", },
7618 hwaddress: { set: "myapex.hwasan.apks", },
7619 },
Paul Duffin24704672021-04-06 16:09:30 +01007620 }
7621 `
7622 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007623
Paul Duffin24704672021-04-06 16:09:30 +01007624 // Check that the extractor produces the correct output file from the correct input file.
7625 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007626
Paul Duffin24704672021-04-06 16:09:30 +01007627 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7628 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007629
Paul Duffin24704672021-04-06 16:09:30 +01007630 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7631
7632 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007633 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7634 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007635
7636 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007637}
7638
Pranav Guptaeba03b02022-09-27 00:27:08 +00007639func TestApexSetApksModuleAssignment(t *testing.T) {
7640 ctx := testApex(t, `
7641 apex_set {
7642 name: "myapex",
7643 set: ":myapex_apks_file",
7644 }
7645
7646 filegroup {
7647 name: "myapex_apks_file",
7648 srcs: ["myapex.apks"],
7649 }
7650 `)
7651
7652 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7653
7654 // Check that the extractor produces the correct apks file from the input module
7655 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7656 extractedApex := m.Output(extractorOutput)
7657
7658 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7659}
7660
Paul Duffin89f570a2021-06-16 01:42:33 +01007661func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007662 t.Helper()
7663
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007664 bp := `
7665 java_library {
7666 name: "some-updatable-apex-lib",
7667 srcs: ["a.java"],
7668 sdk_version: "current",
7669 apex_available: [
7670 "some-updatable-apex",
7671 ],
satayevabcd5972021-08-06 17:49:46 +01007672 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007673 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007674 }
7675
7676 java_library {
7677 name: "some-non-updatable-apex-lib",
7678 srcs: ["a.java"],
7679 apex_available: [
7680 "some-non-updatable-apex",
7681 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007682 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007683 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007684 }
7685
7686 bootclasspath_fragment {
7687 name: "some-non-updatable-fragment",
7688 contents: ["some-non-updatable-apex-lib"],
7689 apex_available: [
7690 "some-non-updatable-apex",
7691 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007692 hidden_api: {
7693 split_packages: ["*"],
7694 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007695 }
7696
7697 java_library {
7698 name: "some-platform-lib",
7699 srcs: ["a.java"],
7700 sdk_version: "current",
7701 installable: true,
7702 }
7703
7704 java_library {
7705 name: "some-art-lib",
7706 srcs: ["a.java"],
7707 sdk_version: "current",
7708 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007709 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007710 ],
7711 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007712 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007713 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007714 }
7715
7716 apex {
7717 name: "some-updatable-apex",
7718 key: "some-updatable-apex.key",
7719 java_libs: ["some-updatable-apex-lib"],
7720 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007721 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007722 }
7723
7724 apex {
7725 name: "some-non-updatable-apex",
7726 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007727 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007728 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007729 }
7730
7731 apex_key {
7732 name: "some-updatable-apex.key",
7733 }
7734
7735 apex_key {
7736 name: "some-non-updatable-apex.key",
7737 }
7738
7739 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007740 name: "com.android.art.debug",
7741 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007742 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007743 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007744 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007745 }
7746
Paul Duffinf23bc472021-04-27 12:42:20 +01007747 bootclasspath_fragment {
7748 name: "art-bootclasspath-fragment",
7749 image_name: "art",
7750 contents: ["some-art-lib"],
7751 apex_available: [
7752 "com.android.art.debug",
7753 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007754 hidden_api: {
7755 split_packages: ["*"],
7756 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007757 }
7758
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007759 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007760 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007761 }
7762
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007763 filegroup {
7764 name: "some-updatable-apex-file_contexts",
7765 srcs: [
7766 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7767 ],
7768 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007769
7770 filegroup {
7771 name: "some-non-updatable-apex-file_contexts",
7772 srcs: [
7773 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7774 ],
7775 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007776 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007777
Paul Duffin89f570a2021-06-16 01:42:33 +01007778 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007779}
7780
Paul Duffin89f570a2021-06-16 01:42:33 +01007781func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007782 t.Helper()
7783
Paul Duffin55607122021-03-30 23:32:51 +01007784 fs := android.MockFS{
7785 "a.java": nil,
7786 "a.jar": nil,
7787 "apex_manifest.json": nil,
7788 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007789 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007790 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7791 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7792 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007793 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007794 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007795
Paul Duffin55607122021-03-30 23:32:51 +01007796 errorHandler := android.FixtureExpectsNoErrors
7797 if errmsg != "" {
7798 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007799 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007800
Paul Duffin55607122021-03-30 23:32:51 +01007801 result := android.GroupFixturePreparers(
7802 cc.PrepareForTestWithCcDefaultModules,
7803 java.PrepareForTestWithHiddenApiBuildComponents,
7804 java.PrepareForTestWithJavaDefaultModules,
7805 java.PrepareForTestWithJavaSdkLibraryFiles,
7806 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007807 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007808 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007809 android.FixtureModifyMockFS(func(fs android.MockFS) {
7810 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7811 insert := ""
7812 for _, fragment := range fragments {
7813 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7814 }
7815 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7816 platform_bootclasspath {
7817 name: "platform-bootclasspath",
7818 fragments: [
7819 %s
7820 ],
7821 }
7822 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007823 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007824 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007825 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007826 ).
7827 ExtendWithErrorHandler(errorHandler).
7828 RunTestWithBp(t, bp)
7829
7830 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007831}
7832
Paul Duffin5556c5f2022-06-09 17:32:21 +00007833func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007834 preparers := android.GroupFixturePreparers(
7835 java.PrepareForTestWithJavaDefaultModules,
7836 PrepareForTestWithApexBuildComponents,
7837 ).
7838 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7839 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7840
7841 bpBase := `
7842 apex_set {
7843 name: "com.android.myapex",
7844 installable: true,
7845 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7846 set: "myapex.apks",
7847 }
7848
7849 apex_set {
7850 name: "com.mycompany.android.myapex",
7851 apex_name: "com.android.myapex",
7852 installable: true,
7853 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7854 set: "company-myapex.apks",
7855 }
7856
7857 prebuilt_bootclasspath_fragment {
7858 name: "my-bootclasspath-fragment",
7859 apex_available: ["com.android.myapex"],
7860 %s
7861 }
7862 `
7863
7864 t.Run("java_import", func(t *testing.T) {
7865 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7866 java_import {
7867 name: "libfoo",
7868 jars: ["libfoo.jar"],
7869 apex_available: ["com.android.myapex"],
7870 }
7871 `)
7872 })
7873
7874 t.Run("java_sdk_library_import", func(t *testing.T) {
7875 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7876 java_sdk_library_import {
7877 name: "libfoo",
7878 public: {
7879 jars: ["libbar.jar"],
7880 },
7881 apex_available: ["com.android.myapex"],
7882 }
7883 `)
7884 })
7885
7886 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7887 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7888 image_name: "art",
7889 contents: ["libfoo"],
7890 `)+`
7891 java_sdk_library_import {
7892 name: "libfoo",
7893 public: {
7894 jars: ["libbar.jar"],
7895 },
7896 apex_available: ["com.android.myapex"],
7897 }
7898 `)
7899 })
7900}
7901
Paul Duffin5556c5f2022-06-09 17:32:21 +00007902func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7903 preparers := android.GroupFixturePreparers(
7904 java.PrepareForTestWithJavaDefaultModules,
7905 PrepareForTestWithApexBuildComponents,
7906 )
7907
7908 bpBase := `
7909 apex_set {
7910 name: "com.android.myapex",
7911 installable: true,
7912 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7913 set: "myapex.apks",
7914 }
7915
7916 apex_set {
7917 name: "com.android.myapex_compressed",
7918 apex_name: "com.android.myapex",
7919 installable: true,
7920 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7921 set: "myapex_compressed.apks",
7922 }
7923
7924 prebuilt_bootclasspath_fragment {
7925 name: "my-bootclasspath-fragment",
7926 apex_available: [
7927 "com.android.myapex",
7928 "com.android.myapex_compressed",
7929 ],
7930 hidden_api: {
7931 annotation_flags: "annotation-flags.csv",
7932 metadata: "metadata.csv",
7933 index: "index.csv",
7934 signature_patterns: "signature_patterns.csv",
7935 },
7936 %s
7937 }
7938 `
7939
7940 t.Run("java_import", func(t *testing.T) {
7941 result := preparers.RunTestWithBp(t,
7942 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7943 java_import {
7944 name: "libfoo",
7945 jars: ["libfoo.jar"],
7946 apex_available: [
7947 "com.android.myapex",
7948 "com.android.myapex_compressed",
7949 ],
7950 }
7951 `)
7952
7953 module := result.Module("libfoo", "android_common_com.android.myapex")
7954 usesLibraryDep := module.(java.UsesLibraryDependency)
7955 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7956 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7957 usesLibraryDep.DexJarBuildPath().Path())
7958 })
7959
7960 t.Run("java_sdk_library_import", func(t *testing.T) {
7961 result := preparers.RunTestWithBp(t,
7962 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7963 java_sdk_library_import {
7964 name: "libfoo",
7965 public: {
7966 jars: ["libbar.jar"],
7967 },
7968 apex_available: [
7969 "com.android.myapex",
7970 "com.android.myapex_compressed",
7971 ],
7972 compile_dex: true,
7973 }
7974 `)
7975
7976 module := result.Module("libfoo", "android_common_com.android.myapex")
7977 usesLibraryDep := module.(java.UsesLibraryDependency)
7978 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7979 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7980 usesLibraryDep.DexJarBuildPath().Path())
7981 })
7982
7983 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7984 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7985 image_name: "art",
7986 contents: ["libfoo"],
7987 `)+`
7988 java_sdk_library_import {
7989 name: "libfoo",
7990 public: {
7991 jars: ["libbar.jar"],
7992 },
7993 apex_available: [
7994 "com.android.myapex",
7995 "com.android.myapex_compressed",
7996 ],
7997 compile_dex: true,
7998 }
7999 `)
8000 })
8001}
8002
Jooyung Han548640b2020-04-27 12:10:30 +09008003func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8004 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8005 apex {
8006 name: "myapex",
8007 key: "myapex.key",
8008 updatable: true,
8009 }
8010
8011 apex_key {
8012 name: "myapex.key",
8013 public_key: "testkey.avbpubkey",
8014 private_key: "testkey.pem",
8015 }
8016 `)
8017}
8018
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008019func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8020 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8021 apex {
8022 name: "myapex",
8023 key: "myapex.key",
8024 }
8025
8026 apex_key {
8027 name: "myapex.key",
8028 public_key: "testkey.avbpubkey",
8029 private_key: "testkey.pem",
8030 }
8031 `)
8032}
8033
Jooyung Handfc864c2023-03-20 18:19:07 +09008034func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8035 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008036 apex {
8037 name: "myapex",
8038 key: "myapex.key",
8039 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008040 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008041 soc_specific: true,
8042 }
8043
8044 apex_key {
8045 name: "myapex.key",
8046 public_key: "testkey.avbpubkey",
8047 private_key: "testkey.pem",
8048 }
8049 `)
8050}
8051
Jooyung Han02873da2023-03-22 17:41:03 +09008052func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8053 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8054 apex {
8055 name: "myapex",
8056 key: "myapex.key",
8057 updatable: false,
8058 min_sdk_version: "29",
8059 use_vndk_as_stable: true,
8060 vendor: true,
8061 }
8062
8063 apex_key {
8064 name: "myapex.key",
8065 public_key: "testkey.avbpubkey",
8066 private_key: "testkey.pem",
8067 }
8068 `)
8069}
8070
Jooyung Handfc864c2023-03-20 18:19:07 +09008071func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8072 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8073 apex {
8074 name: "myapex",
8075 key: "myapex.key",
8076 updatable: false,
8077 use_vndk_as_stable: true,
8078 }
8079
8080 apex_key {
8081 name: "myapex.key",
8082 public_key: "testkey.avbpubkey",
8083 private_key: "testkey.pem",
8084 }
8085 `)
8086}
8087
satayevb98371c2021-06-15 16:49:50 +01008088func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8089 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8090 apex {
8091 name: "myapex",
8092 key: "myapex.key",
8093 systemserverclasspath_fragments: [
8094 "mysystemserverclasspathfragment",
8095 ],
8096 min_sdk_version: "29",
8097 updatable: true,
8098 }
8099
8100 apex_key {
8101 name: "myapex.key",
8102 public_key: "testkey.avbpubkey",
8103 private_key: "testkey.pem",
8104 }
8105
8106 java_library {
8107 name: "foo",
8108 srcs: ["b.java"],
8109 min_sdk_version: "29",
8110 installable: true,
8111 apex_available: [
8112 "myapex",
8113 ],
8114 }
8115
8116 systemserverclasspath_fragment {
8117 name: "mysystemserverclasspathfragment",
8118 generate_classpaths_proto: false,
8119 contents: [
8120 "foo",
8121 ],
8122 apex_available: [
8123 "myapex",
8124 ],
8125 }
satayevabcd5972021-08-06 17:49:46 +01008126 `,
8127 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8128 )
satayevb98371c2021-06-15 16:49:50 +01008129}
8130
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008131func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008132 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8133 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8134 // modules to be included in the BootJars.
8135 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8136 return android.GroupFixturePreparers(
8137 dexpreopt.FixtureSetBootJars(bootJars...),
8138 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8139 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8140 }),
8141 )
8142 }
8143
8144 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8145 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8146 // specified in the ArtApexJars configuration.
8147 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8148 return android.GroupFixturePreparers(
8149 dexpreopt.FixtureSetArtBootJars(bootJars...),
8150 dexpreopt.FixtureSetBootJars(bootJars...),
8151 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8152 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8153 }),
8154 )
8155 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008156
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008157 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008158 preparer := android.GroupFixturePreparers(
8159 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8160 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8161 )
8162 fragments := []java.ApexVariantReference{
8163 {
8164 Apex: proptools.StringPtr("com.android.art.debug"),
8165 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8166 },
8167 {
8168 Apex: proptools.StringPtr("some-non-updatable-apex"),
8169 Module: proptools.StringPtr("some-non-updatable-fragment"),
8170 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008171 }
satayevabcd5972021-08-06 17:49:46 +01008172 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008173 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008174
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008175 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008176 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8177 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008178 preparer := android.GroupFixturePreparers(
8179 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8180 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8181 )
Paul Duffin60264a02021-04-12 20:02:36 +01008182 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008183 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008184
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008185 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 +01008186 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 +01008187 // Update the dexpreopt ArtApexJars directly.
8188 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8189 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008190 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008191
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008192 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 +01008193 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 +01008194 // Update the dexpreopt ArtApexJars directly.
8195 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8196 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008197 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008198
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008199 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 +01008200 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 +01008201 preparer := android.GroupFixturePreparers(
8202 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8203 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8204 )
Paul Duffin60264a02021-04-12 20:02:36 +01008205 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008206 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008207
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008208 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 +01008209 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008210 fragment := java.ApexVariantReference{
8211 Apex: proptools.StringPtr("some-non-updatable-apex"),
8212 Module: proptools.StringPtr("some-non-updatable-fragment"),
8213 }
8214 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008215 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008216
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008217 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008218 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008219 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8220 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008221 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008222
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008223 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008224 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008225 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8226 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008227 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008228
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008229 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008230 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008231 // Update the dexpreopt ArtApexJars directly.
8232 preparer := prepareSetArtJars("platform:some-platform-lib")
8233 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008234 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008235
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008236 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008237 preparer := android.GroupFixturePreparers(
8238 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8239 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8240 )
8241 fragments := []java.ApexVariantReference{
8242 {
8243 Apex: proptools.StringPtr("some-non-updatable-apex"),
8244 Module: proptools.StringPtr("some-non-updatable-fragment"),
8245 },
8246 }
8247 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008248 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008249}
8250
8251func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008252 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008253 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008254 fragment := java.ApexVariantReference{
8255 Apex: proptools.StringPtr("myapex"),
8256 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8257 }
8258
Paul Duffin064b70c2020-11-02 17:32:38 +00008259 testDexpreoptWithApexes(t, `
8260 prebuilt_apex {
8261 name: "myapex" ,
8262 arch: {
8263 arm64: {
8264 src: "myapex-arm64.apex",
8265 },
8266 arm: {
8267 src: "myapex-arm.apex",
8268 },
8269 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008270 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8271 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008272
Paul Duffin89f570a2021-06-16 01:42:33 +01008273 prebuilt_bootclasspath_fragment {
8274 name: "my-bootclasspath-fragment",
8275 contents: ["libfoo"],
8276 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008277 hidden_api: {
8278 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8279 metadata: "my-bootclasspath-fragment/metadata.csv",
8280 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008281 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8282 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8283 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008284 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008285 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008286
Paul Duffin89f570a2021-06-16 01:42:33 +01008287 java_import {
8288 name: "libfoo",
8289 jars: ["libfoo.jar"],
8290 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008291 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008292 }
8293 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008294 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008295}
8296
Spandan Dasf14e2542021-11-12 00:01:37 +00008297func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008298 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008299 bp += `
8300 apex_key {
8301 name: "myapex.key",
8302 public_key: "testkey.avbpubkey",
8303 private_key: "testkey.pem",
8304 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008305 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008306 "lib1/src/A.java": nil,
8307 "lib2/src/B.java": nil,
8308 "system/sepolicy/apex/myapex-file_contexts": nil,
8309 }
8310
Paul Duffin45338f02021-03-30 23:07:52 +01008311 errorHandler := android.FixtureExpectsNoErrors
8312 if errmsg != "" {
8313 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008314 }
Colin Crossae8600b2020-10-29 17:09:13 -07008315
Paul Duffin45338f02021-03-30 23:07:52 +01008316 android.GroupFixturePreparers(
8317 android.PrepareForTestWithAndroidBuildComponents,
8318 java.PrepareForTestWithJavaBuildComponents,
8319 PrepareForTestWithApexBuildComponents,
8320 android.PrepareForTestWithNeverallowRules(rules),
8321 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008322 apexBootJars := make([]string, 0, len(bootJars))
8323 for _, apexBootJar := range bootJars {
8324 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008325 }
satayevd604b212021-07-21 14:23:52 +01008326 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008327 }),
8328 fs.AddToFixture(),
8329 ).
8330 ExtendWithErrorHandler(errorHandler).
8331 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008332}
8333
8334func TestApexPermittedPackagesRules(t *testing.T) {
8335 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008336 name string
8337 expectedError string
8338 bp string
8339 bootJars []string
8340 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008341 }{
8342
8343 {
8344 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8345 expectedError: "",
8346 bp: `
8347 java_library {
8348 name: "bcp_lib1",
8349 srcs: ["lib1/src/*.java"],
8350 permitted_packages: ["foo.bar"],
8351 apex_available: ["myapex"],
8352 sdk_version: "none",
8353 system_modules: "none",
8354 }
8355 java_library {
8356 name: "nonbcp_lib2",
8357 srcs: ["lib2/src/*.java"],
8358 apex_available: ["myapex"],
8359 permitted_packages: ["a.b"],
8360 sdk_version: "none",
8361 system_modules: "none",
8362 }
8363 apex {
8364 name: "myapex",
8365 key: "myapex.key",
8366 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008367 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008368 }`,
8369 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008370 bcpPermittedPackages: map[string][]string{
8371 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008372 "foo.bar",
8373 },
8374 },
8375 },
8376 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008377 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008378 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 +01008379 bp: `
8380 java_library {
8381 name: "bcp_lib1",
8382 srcs: ["lib1/src/*.java"],
8383 apex_available: ["myapex"],
8384 permitted_packages: ["foo.bar"],
8385 sdk_version: "none",
8386 system_modules: "none",
8387 }
8388 java_library {
8389 name: "bcp_lib2",
8390 srcs: ["lib2/src/*.java"],
8391 apex_available: ["myapex"],
8392 permitted_packages: ["foo.bar", "bar.baz"],
8393 sdk_version: "none",
8394 system_modules: "none",
8395 }
8396 apex {
8397 name: "myapex",
8398 key: "myapex.key",
8399 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008400 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008401 }
8402 `,
8403 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008404 bcpPermittedPackages: map[string][]string{
8405 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008406 "foo.bar",
8407 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008408 "bcp_lib2": []string{
8409 "foo.bar",
8410 },
8411 },
8412 },
8413 {
8414 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8415 expectedError: "",
8416 bp: `
8417 java_library {
8418 name: "bcp_lib_restricted",
8419 srcs: ["lib1/src/*.java"],
8420 apex_available: ["myapex"],
8421 permitted_packages: ["foo.bar"],
8422 sdk_version: "none",
8423 min_sdk_version: "29",
8424 system_modules: "none",
8425 }
8426 java_library {
8427 name: "bcp_lib_unrestricted",
8428 srcs: ["lib2/src/*.java"],
8429 apex_available: ["myapex"],
8430 permitted_packages: ["foo.bar", "bar.baz"],
8431 sdk_version: "none",
8432 min_sdk_version: "29",
8433 system_modules: "none",
8434 }
8435 apex {
8436 name: "myapex",
8437 key: "myapex.key",
8438 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8439 updatable: true,
8440 min_sdk_version: "29",
8441 }
8442 `,
8443 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8444 bcpPermittedPackages: map[string][]string{
8445 "bcp_lib1_non_updateable": []string{
8446 "foo.bar",
8447 },
8448 // 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 +01008449 },
8450 },
8451 }
8452 for _, tc := range testcases {
8453 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008454 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8455 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008456 })
8457 }
8458}
8459
Jiyong Park62304bb2020-04-13 16:19:48 +09008460func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008461 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008462 apex {
8463 name: "myapex",
8464 key: "myapex.key",
8465 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008466 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008467 }
8468
8469 apex_key {
8470 name: "myapex.key",
8471 public_key: "testkey.avbpubkey",
8472 private_key: "testkey.pem",
8473 }
8474
8475 cc_library {
8476 name: "mylib",
8477 srcs: ["mylib.cpp"],
8478 system_shared_libs: [],
8479 stl: "none",
8480 stubs: {
8481 versions: ["1"],
8482 },
8483 apex_available: ["myapex"],
8484 }
8485
8486 cc_library {
8487 name: "myprivlib",
8488 srcs: ["mylib.cpp"],
8489 system_shared_libs: [],
8490 stl: "none",
8491 apex_available: ["myapex"],
8492 }
8493
8494
8495 cc_test {
8496 name: "mytest",
8497 gtest: false,
8498 srcs: ["mylib.cpp"],
8499 system_shared_libs: [],
8500 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008501 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008502 test_for: ["myapex"]
8503 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008504
8505 cc_library {
8506 name: "mytestlib",
8507 srcs: ["mylib.cpp"],
8508 system_shared_libs: [],
8509 shared_libs: ["mylib", "myprivlib"],
8510 stl: "none",
8511 test_for: ["myapex"],
8512 }
8513
8514 cc_benchmark {
8515 name: "mybench",
8516 srcs: ["mylib.cpp"],
8517 system_shared_libs: [],
8518 shared_libs: ["mylib", "myprivlib"],
8519 stl: "none",
8520 test_for: ["myapex"],
8521 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008522 `)
8523
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008524 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008525 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008526 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8527 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8528 }
8529
8530 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008531 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008532 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8533 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8534 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8535}
Jiyong Park46a512f2020-12-04 18:02:13 +09008536
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008537func TestIndirectTestFor(t *testing.T) {
8538 ctx := testApex(t, `
8539 apex {
8540 name: "myapex",
8541 key: "myapex.key",
8542 native_shared_libs: ["mylib", "myprivlib"],
8543 updatable: false,
8544 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008545
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008546 apex_key {
8547 name: "myapex.key",
8548 public_key: "testkey.avbpubkey",
8549 private_key: "testkey.pem",
8550 }
8551
8552 cc_library {
8553 name: "mylib",
8554 srcs: ["mylib.cpp"],
8555 system_shared_libs: [],
8556 stl: "none",
8557 stubs: {
8558 versions: ["1"],
8559 },
8560 apex_available: ["myapex"],
8561 }
8562
8563 cc_library {
8564 name: "myprivlib",
8565 srcs: ["mylib.cpp"],
8566 system_shared_libs: [],
8567 stl: "none",
8568 shared_libs: ["mylib"],
8569 apex_available: ["myapex"],
8570 }
8571
8572 cc_library {
8573 name: "mytestlib",
8574 srcs: ["mylib.cpp"],
8575 system_shared_libs: [],
8576 shared_libs: ["myprivlib"],
8577 stl: "none",
8578 test_for: ["myapex"],
8579 }
8580 `)
8581
8582 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008583 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008584 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8585 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8586 }
8587
8588 // The platform variant of mytestlib links to the platform variant of the
8589 // internal myprivlib.
8590 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8591
8592 // The platform variant of myprivlib links to the platform variant of mylib
8593 // and bypasses its stubs.
8594 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 +09008595}
8596
Martin Stjernholmec009002021-03-27 15:18:31 +00008597func TestTestForForLibInOtherApex(t *testing.T) {
8598 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8599 _ = testApex(t, `
8600 apex {
8601 name: "com.android.art",
8602 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008603 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008604 updatable: false,
8605 }
8606
8607 apex {
8608 name: "com.android.art.debug",
8609 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008610 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008611 updatable: false,
8612 }
8613
8614 apex_key {
8615 name: "myapex.key",
8616 public_key: "testkey.avbpubkey",
8617 private_key: "testkey.pem",
8618 }
8619
8620 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008621 name: "libnativebridge",
8622 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008623 system_shared_libs: [],
8624 stl: "none",
8625 stubs: {
8626 versions: ["1"],
8627 },
8628 apex_available: ["com.android.art", "com.android.art.debug"],
8629 }
8630
8631 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008632 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008633 srcs: ["mylib.cpp"],
8634 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008635 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008636 stl: "none",
8637 apex_available: ["com.android.art.debug"],
8638 test_for: ["com.android.art"],
8639 }
8640 `,
8641 android.MockFS{
8642 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8643 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8644 }.AddToFixture())
8645}
8646
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008647// TODO(jungjw): Move this to proptools
8648func intPtr(i int) *int {
8649 return &i
8650}
8651
8652func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008653 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008654 apex_set {
8655 name: "myapex",
8656 set: "myapex.apks",
8657 filename: "foo_v2.apex",
8658 overrides: ["foo"],
8659 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008660 `,
8661 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8662 variables.Platform_sdk_version = intPtr(30)
8663 }),
8664 android.FixtureModifyConfig(func(config android.Config) {
8665 config.Targets[android.Android] = []android.Target{
8666 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8667 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8668 }
8669 }),
8670 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008671
Paul Duffin24704672021-04-06 16:09:30 +01008672 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008673
8674 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008675 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008676 actual := extractedApex.Args["abis"]
8677 expected := "ARMEABI_V7A,ARM64_V8A"
8678 if actual != expected {
8679 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8680 }
8681 actual = extractedApex.Args["sdk-version"]
8682 expected = "30"
8683 if actual != expected {
8684 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8685 }
8686
Paul Duffin6717d882021-06-15 19:09:41 +01008687 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008688 a := m.Module().(*ApexSet)
8689 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008690 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008691 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8692 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8693 }
8694}
8695
Anton Hansson805e0a52022-11-25 14:06:46 +00008696func TestApexSet_NativeBridge(t *testing.T) {
8697 ctx := testApex(t, `
8698 apex_set {
8699 name: "myapex",
8700 set: "myapex.apks",
8701 filename: "foo_v2.apex",
8702 overrides: ["foo"],
8703 }
8704 `,
8705 android.FixtureModifyConfig(func(config android.Config) {
8706 config.Targets[android.Android] = []android.Target{
8707 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8708 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8709 }
8710 }),
8711 )
8712
8713 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8714
8715 // Check extract_apks tool parameters. No native bridge arch expected
8716 extractedApex := m.Output("extracted/myapex.apks")
8717 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8718}
8719
Jiyong Park7d95a512020-05-10 15:16:24 +09008720func TestNoStaticLinkingToStubsLib(t *testing.T) {
8721 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8722 apex {
8723 name: "myapex",
8724 key: "myapex.key",
8725 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008726 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008727 }
8728
8729 apex_key {
8730 name: "myapex.key",
8731 public_key: "testkey.avbpubkey",
8732 private_key: "testkey.pem",
8733 }
8734
8735 cc_library {
8736 name: "mylib",
8737 srcs: ["mylib.cpp"],
8738 static_libs: ["otherlib"],
8739 system_shared_libs: [],
8740 stl: "none",
8741 apex_available: [ "myapex" ],
8742 }
8743
8744 cc_library {
8745 name: "otherlib",
8746 srcs: ["mylib.cpp"],
8747 system_shared_libs: [],
8748 stl: "none",
8749 stubs: {
8750 versions: ["1", "2", "3"],
8751 },
8752 apex_available: [ "myapex" ],
8753 }
8754 `)
8755}
8756
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008757func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008758 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008759 apex {
8760 name: "myapex",
8761 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008762 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008763 custom_sign_tool: "sign_myapex",
8764 }
8765
8766 apex_key {
8767 name: "myapex.key",
8768 public_key: "testkey.avbpubkey",
8769 private_key: "testkey.pem",
8770 }
8771 `)
8772
8773 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8774 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8775 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"`)
8776}
8777
8778func TestApexKeysTxtOverrides(t *testing.T) {
8779 ctx := testApex(t, `
8780 apex {
8781 name: "myapex",
8782 key: "myapex.key",
8783 updatable: false,
8784 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008785 }
8786
8787 apex_key {
8788 name: "myapex.key",
8789 public_key: "testkey.avbpubkey",
8790 private_key: "testkey.pem",
8791 }
8792
8793 prebuilt_apex {
8794 name: "myapex",
8795 prefer: true,
8796 arch: {
8797 arm64: {
8798 src: "myapex-arm64.apex",
8799 },
8800 arm: {
8801 src: "myapex-arm.apex",
8802 },
8803 },
8804 }
8805
8806 apex_set {
8807 name: "myapex_set",
8808 set: "myapex.apks",
8809 filename: "myapex_set.apex",
8810 overrides: ["myapex"],
8811 }
8812 `)
8813
8814 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8815 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8816 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 +09008817 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 +09008818}
8819
Jooyung Han938b5932020-06-20 12:47:47 +09008820func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008821 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008822 apex {
8823 name: "myapex",
8824 key: "myapex.key",
8825 apps: ["app"],
8826 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008827 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008828 }
8829
8830 apex_key {
8831 name: "myapex.key",
8832 public_key: "testkey.avbpubkey",
8833 private_key: "testkey.pem",
8834 }
8835
8836 android_app {
8837 name: "app",
8838 srcs: ["foo/bar/MyClass.java"],
8839 package_name: "foo",
8840 sdk_version: "none",
8841 system_modules: "none",
8842 apex_available: [ "myapex" ],
8843 }
8844 `, withFiles(map[string][]byte{
8845 "sub/Android.bp": []byte(`
8846 override_apex {
8847 name: "override_myapex",
8848 base: "myapex",
8849 apps: ["override_app"],
8850 allowed_files: ":allowed",
8851 }
8852 // Overridable "path" property should be referenced indirectly
8853 filegroup {
8854 name: "allowed",
8855 srcs: ["allowed.txt"],
8856 }
8857 override_android_app {
8858 name: "override_app",
8859 base: "app",
8860 package_name: "bar",
8861 }
8862 `),
8863 }))
8864
8865 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8866 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8867 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8868 }
8869
8870 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8871 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8872 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8873 }
8874}
8875
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008876func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008877 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008878 apex {
8879 name: "myapex",
8880 key: "myapex.key",
8881 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008882 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008883 }
8884
8885 apex_key {
8886 name: "myapex.key",
8887 public_key: "testkey.avbpubkey",
8888 private_key: "testkey.pem",
8889 }
8890
8891 cc_library {
8892 name: "mylib",
8893 srcs: ["mylib.cpp"],
8894 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008895 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008896 },
8897 apex_available: ["myapex"],
8898 }
8899
8900 cc_prebuilt_library_shared {
8901 name: "mylib",
8902 prefer: false,
8903 srcs: ["prebuilt.so"],
8904 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008905 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008906 },
8907 apex_available: ["myapex"],
8908 }
8909 `)
8910}
8911
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008912func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008913 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008914 apex {
8915 name: "myapex",
8916 key: "myapex.key",
8917 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008918 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008919 }
8920 apex_key {
8921 name: "myapex.key",
8922 public_key: "testkey.avbpubkey",
8923 private_key: "testkey.pem",
8924 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008925 `,
8926 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8927 variables.CompressedApex = proptools.BoolPtr(true)
8928 }),
8929 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008930
8931 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8932 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8933
8934 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8935 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8936
8937 // Make sure output of bundle is .capex
8938 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8939 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8940
8941 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008942 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008943 var builder strings.Builder
8944 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8945 androidMk := builder.String()
8946 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8947}
8948
Martin Stjernholm2856c662020-12-02 15:03:42 +00008949func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008950 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008951 apex {
8952 name: "myapex",
8953 key: "myapex.key",
8954 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008955 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008956 }
8957
8958 apex_key {
8959 name: "myapex.key",
8960 public_key: "testkey.avbpubkey",
8961 private_key: "testkey.pem",
8962 }
8963
8964 cc_library {
8965 name: "mylib",
8966 srcs: ["mylib.cpp"],
8967 apex_available: ["myapex"],
8968 shared_libs: ["otherlib"],
8969 system_shared_libs: [],
8970 }
8971
8972 cc_library {
8973 name: "otherlib",
8974 srcs: ["mylib.cpp"],
8975 stubs: {
8976 versions: ["current"],
8977 },
8978 }
8979
8980 cc_prebuilt_library_shared {
8981 name: "otherlib",
8982 prefer: true,
8983 srcs: ["prebuilt.so"],
8984 stubs: {
8985 versions: ["current"],
8986 },
8987 }
8988 `)
8989
8990 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008991 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008992 var builder strings.Builder
8993 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8994 androidMk := builder.String()
8995
8996 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8997 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008998 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 +00008999}
9000
Jiyong Parke3867542020-12-03 17:28:25 +09009001func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009002 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009003 apex {
9004 name: "myapex",
9005 key: "myapex.key",
9006 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009007 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009008 }
9009
9010 apex_key {
9011 name: "myapex.key",
9012 public_key: "testkey.avbpubkey",
9013 private_key: "testkey.pem",
9014 }
9015
9016 cc_library {
9017 name: "mylib",
9018 srcs: ["mylib.cpp"],
9019 system_shared_libs: [],
9020 stl: "none",
9021 apex_available: ["myapex"],
9022 shared_libs: ["mylib2"],
9023 target: {
9024 apex: {
9025 exclude_shared_libs: ["mylib2"],
9026 },
9027 },
9028 }
9029
9030 cc_library {
9031 name: "mylib2",
9032 srcs: ["mylib.cpp"],
9033 system_shared_libs: [],
9034 stl: "none",
9035 }
9036 `)
9037
9038 // Check if mylib is linked to mylib2 for the non-apex target
9039 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9040 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9041
9042 // Make sure that the link doesn't occur for the apex target
9043 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9044 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9045
9046 // It shouldn't appear in the copy cmd as well.
9047 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9048 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9049}
9050
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009051func TestPrebuiltStubLibDep(t *testing.T) {
9052 bpBase := `
9053 apex {
9054 name: "myapex",
9055 key: "myapex.key",
9056 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009057 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009058 }
9059 apex_key {
9060 name: "myapex.key",
9061 public_key: "testkey.avbpubkey",
9062 private_key: "testkey.pem",
9063 }
9064 cc_library {
9065 name: "mylib",
9066 srcs: ["mylib.cpp"],
9067 apex_available: ["myapex"],
9068 shared_libs: ["stublib"],
9069 system_shared_libs: [],
9070 }
9071 apex {
9072 name: "otherapex",
9073 enabled: %s,
9074 key: "myapex.key",
9075 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009076 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009077 }
9078 `
9079
9080 stublibSourceBp := `
9081 cc_library {
9082 name: "stublib",
9083 srcs: ["mylib.cpp"],
9084 apex_available: ["otherapex"],
9085 system_shared_libs: [],
9086 stl: "none",
9087 stubs: {
9088 versions: ["1"],
9089 },
9090 }
9091 `
9092
9093 stublibPrebuiltBp := `
9094 cc_prebuilt_library_shared {
9095 name: "stublib",
9096 srcs: ["prebuilt.so"],
9097 apex_available: ["otherapex"],
9098 stubs: {
9099 versions: ["1"],
9100 },
9101 %s
9102 }
9103 `
9104
9105 tests := []struct {
9106 name string
9107 stublibBp string
9108 usePrebuilt bool
9109 modNames []string // Modules to collect AndroidMkEntries for
9110 otherApexEnabled []string
9111 }{
9112 {
9113 name: "only_source",
9114 stublibBp: stublibSourceBp,
9115 usePrebuilt: false,
9116 modNames: []string{"stublib"},
9117 otherApexEnabled: []string{"true", "false"},
9118 },
9119 {
9120 name: "source_preferred",
9121 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9122 usePrebuilt: false,
9123 modNames: []string{"stublib", "prebuilt_stublib"},
9124 otherApexEnabled: []string{"true", "false"},
9125 },
9126 {
9127 name: "prebuilt_preferred",
9128 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9129 usePrebuilt: true,
9130 modNames: []string{"stublib", "prebuilt_stublib"},
9131 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9132 },
9133 {
9134 name: "only_prebuilt",
9135 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9136 usePrebuilt: true,
9137 modNames: []string{"stublib"},
9138 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9139 },
9140 }
9141
9142 for _, test := range tests {
9143 t.Run(test.name, func(t *testing.T) {
9144 for _, otherApexEnabled := range test.otherApexEnabled {
9145 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009146 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009147
9148 type modAndMkEntries struct {
9149 mod *cc.Module
9150 mkEntries android.AndroidMkEntries
9151 }
9152 entries := []*modAndMkEntries{}
9153
9154 // Gather shared lib modules that are installable
9155 for _, modName := range test.modNames {
9156 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9157 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9158 continue
9159 }
9160 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009161 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009162 continue
9163 }
Colin Crossaa255532020-07-03 13:18:24 -07009164 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009165 if ent.Disabled {
9166 continue
9167 }
9168 entries = append(entries, &modAndMkEntries{
9169 mod: mod,
9170 mkEntries: ent,
9171 })
9172 }
9173 }
9174 }
9175
9176 var entry *modAndMkEntries = nil
9177 for _, ent := range entries {
9178 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9179 if entry != nil {
9180 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9181 } else {
9182 entry = ent
9183 }
9184 }
9185 }
9186
9187 if entry == nil {
9188 t.Errorf("AndroidMk entry for \"stublib\" missing")
9189 } else {
9190 isPrebuilt := entry.mod.Prebuilt() != nil
9191 if isPrebuilt != test.usePrebuilt {
9192 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9193 }
9194 if !entry.mod.IsStubs() {
9195 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9196 }
9197 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9198 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9199 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009200 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009201 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009202 if !android.InList(expected, cflags) {
9203 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9204 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009205 }
9206 })
9207 }
9208 })
9209 }
9210}
9211
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009212func TestHostApexInHostOnlyBuild(t *testing.T) {
9213 testApex(t, `
9214 apex {
9215 name: "myapex",
9216 host_supported: true,
9217 key: "myapex.key",
9218 updatable: false,
9219 payload_type: "zip",
9220 }
9221 apex_key {
9222 name: "myapex.key",
9223 public_key: "testkey.avbpubkey",
9224 private_key: "testkey.pem",
9225 }
9226 `,
9227 android.FixtureModifyConfig(func(config android.Config) {
9228 // We may not have device targets in all builds, e.g. in
9229 // prebuilts/build-tools/build-prebuilts.sh
9230 config.Targets[android.Android] = []android.Target{}
9231 }))
9232}
9233
Colin Crossc33e5212021-05-25 18:16:02 -07009234func TestApexJavaCoverage(t *testing.T) {
9235 bp := `
9236 apex {
9237 name: "myapex",
9238 key: "myapex.key",
9239 java_libs: ["mylib"],
9240 bootclasspath_fragments: ["mybootclasspathfragment"],
9241 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9242 updatable: false,
9243 }
9244
9245 apex_key {
9246 name: "myapex.key",
9247 public_key: "testkey.avbpubkey",
9248 private_key: "testkey.pem",
9249 }
9250
9251 java_library {
9252 name: "mylib",
9253 srcs: ["mylib.java"],
9254 apex_available: ["myapex"],
9255 compile_dex: true,
9256 }
9257
9258 bootclasspath_fragment {
9259 name: "mybootclasspathfragment",
9260 contents: ["mybootclasspathlib"],
9261 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009262 hidden_api: {
9263 split_packages: ["*"],
9264 },
Colin Crossc33e5212021-05-25 18:16:02 -07009265 }
9266
9267 java_library {
9268 name: "mybootclasspathlib",
9269 srcs: ["mybootclasspathlib.java"],
9270 apex_available: ["myapex"],
9271 compile_dex: true,
9272 }
9273
9274 systemserverclasspath_fragment {
9275 name: "mysystemserverclasspathfragment",
9276 contents: ["mysystemserverclasspathlib"],
9277 apex_available: ["myapex"],
9278 }
9279
9280 java_library {
9281 name: "mysystemserverclasspathlib",
9282 srcs: ["mysystemserverclasspathlib.java"],
9283 apex_available: ["myapex"],
9284 compile_dex: true,
9285 }
9286 `
9287
9288 result := android.GroupFixturePreparers(
9289 PrepareForTestWithApexBuildComponents,
9290 prepareForTestWithMyapex,
9291 java.PrepareForTestWithJavaDefaultModules,
9292 android.PrepareForTestWithAndroidBuildComponents,
9293 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009294 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9295 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009296 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009297 ).RunTest(t)
9298
9299 // Make sure jacoco ran on both mylib and mybootclasspathlib
9300 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9301 t.Errorf("Failed to find jacoco rule for mylib")
9302 }
9303 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9304 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9305 }
9306 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9307 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9308 }
9309}
9310
Jiyong Park192600a2021-08-03 07:52:17 +00009311func TestProhibitStaticExecutable(t *testing.T) {
9312 testApexError(t, `executable mybin is static`, `
9313 apex {
9314 name: "myapex",
9315 key: "myapex.key",
9316 binaries: ["mybin"],
9317 min_sdk_version: "29",
9318 }
9319
9320 apex_key {
9321 name: "myapex.key",
9322 public_key: "testkey.avbpubkey",
9323 private_key: "testkey.pem",
9324 }
9325
9326 cc_binary {
9327 name: "mybin",
9328 srcs: ["mylib.cpp"],
9329 relative_install_path: "foo/bar",
9330 static_executable: true,
9331 system_shared_libs: [],
9332 stl: "none",
9333 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009334 min_sdk_version: "29",
9335 }
9336 `)
9337
9338 testApexError(t, `executable mybin.rust is static`, `
9339 apex {
9340 name: "myapex",
9341 key: "myapex.key",
9342 binaries: ["mybin.rust"],
9343 min_sdk_version: "29",
9344 }
9345
9346 apex_key {
9347 name: "myapex.key",
9348 public_key: "testkey.avbpubkey",
9349 private_key: "testkey.pem",
9350 }
9351
9352 rust_binary {
9353 name: "mybin.rust",
9354 srcs: ["foo.rs"],
9355 static_executable: true,
9356 apex_available: ["myapex"],
9357 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009358 }
9359 `)
9360}
9361
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009362func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9363 ctx := testApex(t, `
9364 apex {
9365 name: "myapex",
9366 key: "myapex.key",
9367 updatable: false,
9368 java_libs: ["foo"],
9369 }
9370
9371 apex_key {
9372 name: "myapex.key",
9373 public_key: "testkey.avbpubkey",
9374 private_key: "testkey.pem",
9375 }
9376
9377 java_library {
9378 name: "foo",
9379 srcs: ["foo.java"],
9380 apex_available: ["myapex"],
9381 installable: true,
9382 }
9383 `,
9384 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9385 )
9386
9387 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9388 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9389 var builder strings.Builder
9390 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9391 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009392 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 +00009393}
9394
9395func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9396 ctx := testApex(t, `
9397 prebuilt_apex {
9398 name: "myapex",
9399 arch: {
9400 arm64: {
9401 src: "myapex-arm64.apex",
9402 },
9403 arm: {
9404 src: "myapex-arm.apex",
9405 },
9406 },
9407 exported_java_libs: ["foo"],
9408 }
9409
9410 java_import {
9411 name: "foo",
9412 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009413 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009414 }
9415 `,
9416 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9417 )
9418
9419 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9420 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9421 mainModuleEntries := entriesList[0]
9422 android.AssertArrayString(t,
9423 "LOCAL_REQUIRED_MODULES",
9424 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9425 []string{
9426 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9427 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9428 })
9429}
9430
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009431func TestAndroidMk_RequiredModules(t *testing.T) {
9432 ctx := testApex(t, `
9433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 updatable: false,
9437 java_libs: ["foo"],
9438 required: ["otherapex"],
9439 }
9440
9441 apex {
9442 name: "otherapex",
9443 key: "myapex.key",
9444 updatable: false,
9445 java_libs: ["foo"],
9446 required: ["otherapex"],
9447 }
9448
9449 apex_key {
9450 name: "myapex.key",
9451 public_key: "testkey.avbpubkey",
9452 private_key: "testkey.pem",
9453 }
9454
9455 java_library {
9456 name: "foo",
9457 srcs: ["foo.java"],
9458 apex_available: ["myapex", "otherapex"],
9459 installable: true,
9460 }
9461 `)
9462
9463 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9464 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9465 var builder strings.Builder
9466 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9467 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009468 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009469}
9470
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009471func TestAndroidMk_RequiredDeps(t *testing.T) {
9472 ctx := testApex(t, `
9473 apex {
9474 name: "myapex",
9475 key: "myapex.key",
9476 updatable: false,
9477 }
9478
9479 apex_key {
9480 name: "myapex.key",
9481 public_key: "testkey.avbpubkey",
9482 private_key: "testkey.pem",
9483 }
9484 `)
9485
9486 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009487 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009488 data := android.AndroidMkDataForTest(t, ctx, bundle)
9489 var builder strings.Builder
9490 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9491 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009492 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009493
9494 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009495 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009496 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9497 var flattenedBuilder strings.Builder
9498 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9499 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009500 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009501}
9502
Jooyung Hana6d36672022-02-24 13:58:07 +09009503func TestApexOutputFileProducer(t *testing.T) {
9504 for _, tc := range []struct {
9505 name string
9506 ref string
9507 expected_data []string
9508 }{
9509 {
9510 name: "test_using_output",
9511 ref: ":myapex",
9512 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9513 },
9514 {
9515 name: "test_using_apex",
9516 ref: ":myapex{.apex}",
9517 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9518 },
9519 } {
9520 t.Run(tc.name, func(t *testing.T) {
9521 ctx := testApex(t, `
9522 apex {
9523 name: "myapex",
9524 key: "myapex.key",
9525 compressible: true,
9526 updatable: false,
9527 }
9528
9529 apex_key {
9530 name: "myapex.key",
9531 public_key: "testkey.avbpubkey",
9532 private_key: "testkey.pem",
9533 }
9534
9535 java_test {
9536 name: "`+tc.name+`",
9537 srcs: ["a.java"],
9538 data: ["`+tc.ref+`"],
9539 }
9540 `,
9541 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9542 variables.CompressedApex = proptools.BoolPtr(true)
9543 }))
9544 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9545 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9546 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9547 })
9548 }
9549}
9550
satayev758968a2021-12-06 11:42:40 +00009551func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9552 preparer := android.GroupFixturePreparers(
9553 PrepareForTestWithApexBuildComponents,
9554 prepareForTestWithMyapex,
9555 java.PrepareForTestWithJavaSdkLibraryFiles,
9556 java.PrepareForTestWithJavaDefaultModules,
9557 android.PrepareForTestWithAndroidBuildComponents,
9558 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9559 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9560 )
9561
9562 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9563 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9564 preparer.RunTestWithBp(t, `
9565 apex {
9566 name: "myapex",
9567 key: "myapex.key",
9568 bootclasspath_fragments: ["mybootclasspathfragment"],
9569 min_sdk_version: "30",
9570 updatable: false,
9571 }
9572
9573 apex_key {
9574 name: "myapex.key",
9575 public_key: "testkey.avbpubkey",
9576 private_key: "testkey.pem",
9577 }
9578
9579 bootclasspath_fragment {
9580 name: "mybootclasspathfragment",
9581 contents: ["mybootclasspathlib"],
9582 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009583 hidden_api: {
9584 split_packages: ["*"],
9585 },
satayev758968a2021-12-06 11:42:40 +00009586 }
9587
9588 java_sdk_library {
9589 name: "mybootclasspathlib",
9590 srcs: ["mybootclasspathlib.java"],
9591 apex_available: ["myapex"],
9592 compile_dex: true,
9593 unsafe_ignore_missing_latest_api: true,
9594 min_sdk_version: "31",
9595 static_libs: ["util"],
9596 }
9597
9598 java_library {
9599 name: "util",
9600 srcs: ["a.java"],
9601 apex_available: ["myapex"],
9602 min_sdk_version: "31",
9603 static_libs: ["another_util"],
9604 }
9605
9606 java_library {
9607 name: "another_util",
9608 srcs: ["a.java"],
9609 min_sdk_version: "31",
9610 apex_available: ["myapex"],
9611 }
9612 `)
9613 })
9614
9615 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9616 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9617 preparer.RunTestWithBp(t, `
9618 apex {
9619 name: "myapex",
9620 key: "myapex.key",
9621 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9622 min_sdk_version: "30",
9623 updatable: false,
9624 }
9625
9626 apex_key {
9627 name: "myapex.key",
9628 public_key: "testkey.avbpubkey",
9629 private_key: "testkey.pem",
9630 }
9631
9632 systemserverclasspath_fragment {
9633 name: "mysystemserverclasspathfragment",
9634 contents: ["mysystemserverclasspathlib"],
9635 apex_available: ["myapex"],
9636 }
9637
9638 java_sdk_library {
9639 name: "mysystemserverclasspathlib",
9640 srcs: ["mysystemserverclasspathlib.java"],
9641 apex_available: ["myapex"],
9642 compile_dex: true,
9643 min_sdk_version: "32",
9644 unsafe_ignore_missing_latest_api: true,
9645 static_libs: ["util"],
9646 }
9647
9648 java_library {
9649 name: "util",
9650 srcs: ["a.java"],
9651 apex_available: ["myapex"],
9652 min_sdk_version: "31",
9653 static_libs: ["another_util"],
9654 }
9655
9656 java_library {
9657 name: "another_util",
9658 srcs: ["a.java"],
9659 min_sdk_version: "31",
9660 apex_available: ["myapex"],
9661 }
9662 `)
9663 })
9664
9665 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9666 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9667 RunTestWithBp(t, `
9668 apex {
9669 name: "myapex",
9670 key: "myapex.key",
9671 bootclasspath_fragments: ["mybootclasspathfragment"],
9672 min_sdk_version: "30",
9673 updatable: false,
9674 }
9675
9676 apex_key {
9677 name: "myapex.key",
9678 public_key: "testkey.avbpubkey",
9679 private_key: "testkey.pem",
9680 }
9681
9682 bootclasspath_fragment {
9683 name: "mybootclasspathfragment",
9684 contents: ["mybootclasspathlib"],
9685 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009686 hidden_api: {
9687 split_packages: ["*"],
9688 },
satayev758968a2021-12-06 11:42:40 +00009689 }
9690
9691 java_sdk_library {
9692 name: "mybootclasspathlib",
9693 srcs: ["mybootclasspathlib.java"],
9694 apex_available: ["myapex"],
9695 compile_dex: true,
9696 unsafe_ignore_missing_latest_api: true,
9697 }
9698 `)
9699 })
9700
9701 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9702 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9703 RunTestWithBp(t, `
9704 apex {
9705 name: "myapex",
9706 key: "myapex.key",
9707 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9708 min_sdk_version: "30",
9709 updatable: false,
9710 }
9711
9712 apex_key {
9713 name: "myapex.key",
9714 public_key: "testkey.avbpubkey",
9715 private_key: "testkey.pem",
9716 }
9717
9718 systemserverclasspath_fragment {
9719 name: "mysystemserverclasspathfragment",
9720 contents: ["mysystemserverclasspathlib"],
9721 apex_available: ["myapex"],
9722 }
9723
9724 java_sdk_library {
9725 name: "mysystemserverclasspathlib",
9726 srcs: ["mysystemserverclasspathlib.java"],
9727 apex_available: ["myapex"],
9728 compile_dex: true,
9729 unsafe_ignore_missing_latest_api: true,
9730 }
9731 `)
9732 })
9733}
9734
Jiakai Zhang6decef92022-01-12 17:56:19 +00009735// Verifies that the APEX depends on all the Make modules in the list.
9736func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9737 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9738 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009739 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009740 }
9741}
9742
9743// Verifies that the APEX does not depend on any of the Make modules in the list.
9744func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9745 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9746 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009747 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009748 }
9749}
9750
Cole Faust1021ccd2023-02-26 21:15:25 -08009751// TODO(b/193460475): Re-enable this test
9752//func TestApexStrictUpdtabilityLint(t *testing.T) {
9753// bpTemplate := `
9754// apex {
9755// name: "myapex",
9756// key: "myapex.key",
9757// java_libs: ["myjavalib"],
9758// updatable: %v,
9759// min_sdk_version: "29",
9760// }
9761// apex_key {
9762// name: "myapex.key",
9763// }
9764// java_library {
9765// name: "myjavalib",
9766// srcs: ["MyClass.java"],
9767// apex_available: [ "myapex" ],
9768// lint: {
9769// strict_updatability_linting: %v,
9770// },
9771// sdk_version: "current",
9772// min_sdk_version: "29",
9773// }
9774// `
9775// fs := android.MockFS{
9776// "lint-baseline.xml": nil,
9777// }
9778//
9779// testCases := []struct {
9780// testCaseName string
9781// apexUpdatable bool
9782// javaStrictUpdtabilityLint bool
9783// lintFileExists bool
9784// disallowedFlagExpected bool
9785// }{
9786// {
9787// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9788// apexUpdatable: true,
9789// javaStrictUpdtabilityLint: true,
9790// lintFileExists: false,
9791// disallowedFlagExpected: false,
9792// },
9793// {
9794// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9795// apexUpdatable: false,
9796// javaStrictUpdtabilityLint: false,
9797// lintFileExists: true,
9798// disallowedFlagExpected: false,
9799// },
9800// {
9801// testCaseName: "non-updatable apex respects strict updatability of javalib",
9802// apexUpdatable: false,
9803// javaStrictUpdtabilityLint: true,
9804// lintFileExists: true,
9805// disallowedFlagExpected: true,
9806// },
9807// {
9808// testCaseName: "updatable apex sets strict updatability of javalib to true",
9809// apexUpdatable: true,
9810// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9811// lintFileExists: true,
9812// disallowedFlagExpected: true,
9813// },
9814// }
9815//
9816// for _, testCase := range testCases {
9817// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9818// fixtures := []android.FixturePreparer{}
9819// if testCase.lintFileExists {
9820// fixtures = append(fixtures, fs.AddToFixture())
9821// }
9822//
9823// result := testApex(t, bp, fixtures...)
9824// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9825// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9826// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9827//
9828// if disallowedFlagActual != testCase.disallowedFlagExpected {
9829// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9830// }
9831// }
9832//}
9833//
9834//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9835// bp := `
9836// apex {
9837// name: "myapex",
9838// key: "myapex.key",
9839// java_libs: ["myjavalib"],
9840// updatable: true,
9841// min_sdk_version: "29",
9842// }
9843// apex_key {
9844// name: "myapex.key",
9845// }
9846// java_library {
9847// name: "myjavalib",
9848// srcs: ["MyClass.java"],
9849// apex_available: [ "myapex" ],
9850// sdk_version: "current",
9851// min_sdk_version: "29",
9852// }
9853// `
9854//
9855// testCases := []struct {
9856// testCaseName string
9857// moduleDirectory string
9858// disallowedFlagExpected bool
9859// }{
9860// {
9861// testCaseName: "lintable module defined outside libcore",
9862// moduleDirectory: "",
9863// disallowedFlagExpected: true,
9864// },
9865// {
9866// testCaseName: "lintable module defined in libcore root directory",
9867// moduleDirectory: "libcore/",
9868// disallowedFlagExpected: false,
9869// },
9870// {
9871// testCaseName: "lintable module defined in libcore child directory",
9872// moduleDirectory: "libcore/childdir/",
9873// disallowedFlagExpected: true,
9874// },
9875// }
9876//
9877// for _, testCase := range testCases {
9878// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9879// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9880// result := testApex(t, "", lintFileCreator, bpFileCreator)
9881// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9882// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9883// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9884// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9885//
9886// if disallowedFlagActual != testCase.disallowedFlagExpected {
9887// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9888// }
9889// }
9890//}
9891//
9892//// checks transtive deps of an apex coming from bootclasspath_fragment
9893//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9894// bp := `
9895// apex {
9896// name: "myapex",
9897// key: "myapex.key",
9898// bootclasspath_fragments: ["mybootclasspathfragment"],
9899// updatable: true,
9900// min_sdk_version: "29",
9901// }
9902// apex_key {
9903// name: "myapex.key",
9904// }
9905// bootclasspath_fragment {
9906// name: "mybootclasspathfragment",
9907// contents: ["myjavalib"],
9908// apex_available: ["myapex"],
9909// hidden_api: {
9910// split_packages: ["*"],
9911// },
9912// }
9913// java_library {
9914// name: "myjavalib",
9915// srcs: ["MyClass.java"],
9916// apex_available: [ "myapex" ],
9917// sdk_version: "current",
9918// min_sdk_version: "29",
9919// compile_dex: true,
9920// }
9921// `
9922// fs := android.MockFS{
9923// "lint-baseline.xml": nil,
9924// }
9925//
9926// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9927// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9928// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9929// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9930// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9931// }
9932//}
Spandan Das66773252022-01-15 00:23:18 +00009933
Spandan Das42e89502022-05-06 22:12:55 +00009934// updatable apexes should propagate updatable=true to its apps
9935func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9936 bp := `
9937 apex {
9938 name: "myapex",
9939 key: "myapex.key",
9940 updatable: %v,
9941 apps: [
9942 "myapp",
9943 ],
9944 min_sdk_version: "30",
9945 }
9946 apex_key {
9947 name: "myapex.key",
9948 }
9949 android_app {
9950 name: "myapp",
9951 updatable: %v,
9952 apex_available: [
9953 "myapex",
9954 ],
9955 sdk_version: "current",
9956 min_sdk_version: "30",
9957 }
9958 `
9959 testCases := []struct {
9960 name string
9961 apex_is_updatable_bp bool
9962 app_is_updatable_bp bool
9963 app_is_updatable_expected bool
9964 }{
9965 {
9966 name: "Non-updatable apex respects updatable property of non-updatable app",
9967 apex_is_updatable_bp: false,
9968 app_is_updatable_bp: false,
9969 app_is_updatable_expected: false,
9970 },
9971 {
9972 name: "Non-updatable apex respects updatable property of updatable app",
9973 apex_is_updatable_bp: false,
9974 app_is_updatable_bp: true,
9975 app_is_updatable_expected: true,
9976 },
9977 {
9978 name: "Updatable apex respects updatable property of updatable app",
9979 apex_is_updatable_bp: true,
9980 app_is_updatable_bp: true,
9981 app_is_updatable_expected: true,
9982 },
9983 {
9984 name: "Updatable apex sets updatable=true on non-updatable app",
9985 apex_is_updatable_bp: true,
9986 app_is_updatable_bp: false,
9987 app_is_updatable_expected: true,
9988 },
9989 }
9990 for _, testCase := range testCases {
9991 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9992 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9993 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9994 }
9995}
9996
Kiyoung Kim487689e2022-07-26 09:48:22 +09009997func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9998 bp := `
9999 apex {
10000 name: "myapex",
10001 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010002 native_shared_libs: ["libbaz"],
10003 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010004 min_sdk_version: "29",
10005 }
10006 apex_key {
10007 name: "myapex.key",
10008 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010009 cc_binary {
10010 name: "binfoo",
10011 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010012 apex_available: ["myapex"],
10013 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010014 recovery_available: false,
10015 }
10016 cc_library {
10017 name: "libbar",
10018 srcs: ["libbar.cc"],
10019 stubs: {
10020 symbol_file: "libbar.map.txt",
10021 versions: [
10022 "29",
10023 ],
10024 },
10025 }
10026 cc_library {
10027 name: "libbaz",
10028 srcs: ["libbaz.cc"],
10029 apex_available: ["myapex"],
10030 min_sdk_version: "29",
10031 stubs: {
10032 symbol_file: "libbaz.map.txt",
10033 versions: [
10034 "29",
10035 ],
10036 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010037 }
10038 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010039 name: "libbar",
10040 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010041 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010042 variants: ["apex.29"],
10043 }
10044 cc_api_variant {
10045 name: "libbar",
10046 variant: "apex",
10047 version: "29",
10048 src: "libbar_apex_29.so",
10049 }
10050 cc_api_library {
10051 name: "libbaz",
10052 src: "libbaz_stub.so",
10053 min_sdk_version: "29",
10054 variants: ["apex.29"],
10055 }
10056 cc_api_variant {
10057 name: "libbaz",
10058 variant: "apex",
10059 version: "29",
10060 src: "libbaz_apex_29.so",
10061 }
10062 cc_api_library {
10063 name: "libqux",
10064 src: "libqux_stub.so",
10065 min_sdk_version: "29",
10066 variants: ["apex.29"],
10067 }
10068 cc_api_variant {
10069 name: "libqux",
10070 variant: "apex",
10071 version: "29",
10072 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010073 }
10074 api_imports {
10075 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010076 apex_shared_libs: [
10077 "libbar",
10078 "libbaz",
10079 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010080 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010081 }
10082 `
10083 result := testApex(t, bp)
10084
10085 hasDep := func(m android.Module, wantDep android.Module) bool {
10086 t.Helper()
10087 var found bool
10088 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10089 if dep == wantDep {
10090 found = true
10091 }
10092 })
10093 return found
10094 }
10095
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010096 // Library defines stubs and cc_api_library should be used with cc_api_library
10097 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10098 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10099 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010100
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010101 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10102 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010103
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010104 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10105 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10106 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10107 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10108
10109 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10110 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10111 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10112 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10113 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10114
10115 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10116 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10117 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10118
10119 // cc_api_library defined without original library should be linked with cc_api_library
10120 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10121 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10122 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10123}
10124
10125func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10126 bp := `
10127 apex {
10128 name: "myapex",
10129 key: "myapex.key",
10130 native_shared_libs: ["libbar"],
10131 min_sdk_version: "29",
10132 }
10133 apex_key {
10134 name: "myapex.key",
10135 }
10136 cc_binary {
10137 name: "binfoo",
10138 shared_libs: ["libbar"],
10139 recovery_available: false,
10140 }
10141 cc_library {
10142 name: "libbar",
10143 srcs: ["libbar.cc"],
10144 apex_available: ["myapex"],
10145 min_sdk_version: "29",
10146 stubs: {
10147 symbol_file: "libbar.map.txt",
10148 versions: [
10149 "29",
10150 ],
10151 },
10152 }
10153 cc_api_library {
10154 name: "libbar",
10155 src: "libbar_stub.so",
10156 variants: ["apex.29"],
10157 }
10158 cc_api_variant {
10159 name: "libbar",
10160 variant: "apex",
10161 version: "29",
10162 src: "libbar_apex_29.so",
10163 }
10164 api_imports {
10165 name: "api_imports",
10166 apex_shared_libs: [
10167 "libbar",
10168 ],
10169 }
10170 `
10171
10172 result := testApex(t, bp)
10173
10174 hasDep := func(m android.Module, wantDep android.Module) bool {
10175 t.Helper()
10176 var found bool
10177 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10178 if dep == wantDep {
10179 found = true
10180 }
10181 })
10182 return found
10183 }
10184
10185 // Library defines stubs and cc_api_library should be used with cc_api_library
10186 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10187 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10188 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10189
10190 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10191 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10192
10193 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10194 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10195 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10196 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010197}
Dennis Shend4f5d932023-01-31 20:27:21 +000010198
10199func TestTrimmedApex(t *testing.T) {
10200 bp := `
10201 apex {
10202 name: "myapex",
10203 key: "myapex.key",
10204 native_shared_libs: ["libfoo","libbaz"],
10205 min_sdk_version: "29",
10206 trim_against: "mydcla",
10207 }
10208 apex {
10209 name: "mydcla",
10210 key: "myapex.key",
10211 native_shared_libs: ["libfoo","libbar"],
10212 min_sdk_version: "29",
10213 file_contexts: ":myapex-file_contexts",
10214 dynamic_common_lib_apex: true,
10215 }
10216 apex_key {
10217 name: "myapex.key",
10218 }
10219 cc_library {
10220 name: "libfoo",
10221 shared_libs: ["libc"],
10222 apex_available: ["myapex","mydcla"],
10223 min_sdk_version: "29",
10224 }
10225 cc_library {
10226 name: "libbar",
10227 shared_libs: ["libc"],
10228 apex_available: ["myapex","mydcla"],
10229 min_sdk_version: "29",
10230 }
10231 cc_library {
10232 name: "libbaz",
10233 shared_libs: ["libc"],
10234 apex_available: ["myapex","mydcla"],
10235 min_sdk_version: "29",
10236 }
10237 cc_api_library {
10238 name: "libc",
10239 src: "libc.so",
10240 min_sdk_version: "29",
10241 recovery_available: true,
10242 }
10243 api_imports {
10244 name: "api_imports",
10245 shared_libs: [
10246 "libc",
10247 ],
10248 header_libs: [],
10249 }
10250 `
10251 ctx := testApex(t, bp)
10252 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10253 apexRule := module.MaybeRule("apexRule")
10254 if apexRule.Rule == nil {
10255 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10256 }
10257
10258 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10259 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10260 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10261 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10262 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10263 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10264}
Jingwen Chendea7a642023-03-28 11:30:50 +000010265
10266func TestCannedFsConfig(t *testing.T) {
10267 ctx := testApex(t, `
10268 apex {
10269 name: "myapex",
10270 key: "myapex.key",
10271 updatable: false,
10272 }
10273
10274 apex_key {
10275 name: "myapex.key",
10276 public_key: "testkey.avbpubkey",
10277 private_key: "testkey.pem",
10278 }`)
10279 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10280 generateFsRule := mod.Rule("generateFsConfig")
10281 cmd := generateFsRule.RuleParams.Command
10282
10283 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10284}
10285
10286func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10287 ctx := testApex(t, `
10288 apex {
10289 name: "myapex",
10290 key: "myapex.key",
10291 canned_fs_config: "my_config",
10292 updatable: false,
10293 }
10294
10295 apex_key {
10296 name: "myapex.key",
10297 public_key: "testkey.avbpubkey",
10298 private_key: "testkey.pem",
10299 }`)
10300 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10301 generateFsRule := mod.Rule("generateFsConfig")
10302 cmd := generateFsRule.RuleParams.Command
10303
10304 // Ensure that canned_fs_config has "cat my_config" at the end
10305 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10306}
Spandan Das20fce2d2023-04-12 17:21:39 +000010307
10308func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10309 testCases := []struct {
10310 desc string
10311 hasStubs bool
10312 apexAvailable string
10313 expectedError string
10314 }{
10315 {
10316 desc: "non-stub library can have multiple apex_available",
10317 hasStubs: false,
10318 apexAvailable: `["myapex", "otherapex"]`,
10319 },
10320 {
10321 desc: "stub library should not be available to anyapex",
10322 hasStubs: true,
10323 apexAvailable: `["//apex_available:anyapex"]`,
10324 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10325 },
10326 {
10327 desc: "stub library should not be available to multiple apexes",
10328 hasStubs: true,
10329 apexAvailable: `["myapex", "otherapex"]`,
10330 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10331 },
10332 {
10333 desc: "stub library can be available to a core apex and a test apex",
10334 hasStubs: true,
10335 apexAvailable: `["myapex", "test_myapex"]`,
10336 },
10337 }
10338 bpTemplate := `
10339 cc_library {
10340 name: "libfoo",
10341 %v
10342 apex_available: %v,
10343 }
10344 apex {
10345 name: "myapex",
10346 key: "apex.key",
10347 updatable: false,
10348 native_shared_libs: ["libfoo"],
10349 }
10350 apex {
10351 name: "otherapex",
10352 key: "apex.key",
10353 updatable: false,
10354 }
10355 apex_test {
10356 name: "test_myapex",
10357 key: "apex.key",
10358 updatable: false,
10359 native_shared_libs: ["libfoo"],
10360 }
10361 apex_key {
10362 name: "apex.key",
10363 }
10364 `
10365 for _, tc := range testCases {
10366 stubs := ""
10367 if tc.hasStubs {
10368 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10369 }
10370 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10371 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10372 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10373 })
10374 if tc.expectedError == "" {
10375 testApex(t, bp, mockFsFixturePreparer)
10376 } else {
10377 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10378 }
10379 }
10380}