blob: 3ba4d8d55369401c224b80427227305233528c84 [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,
Colin Cross094cde42020-02-15 10:38:00 -08006048 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006049 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006050 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006051
6052 cc_library_shared {
6053 name: "libjni",
6054 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006055 shared_libs: ["libfoo"],
6056 stl: "none",
6057 system_shared_libs: [],
6058 apex_available: [ "myapex" ],
6059 sdk_version: "current",
6060 }
6061
6062 cc_library_shared {
6063 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006064 stl: "none",
6065 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006066 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006067 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006068 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006069 `)
6070
Sundong Ahnabb64432019-10-22 13:58:29 +09006071 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006072 apexRule := module.Rule("apexRule")
6073 copyCmds := apexRule.Args["copy_commands"]
6074
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006075 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6076 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006077
Colin Crossaede88c2020-08-11 12:17:01 -07006078 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006079 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006080 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006081 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006082 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006083 // JNI libraries including transitive deps are
6084 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006085 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006086 // ... embedded inside APK (jnilibs.zip)
6087 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6088 // ... and not directly inside the APEX
6089 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6090 }
Dario Frenicde2a032019-10-27 00:29:22 +01006091}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006092
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006093func TestApexWithAppImportBuildId(t *testing.T) {
6094 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6095 for _, id := range invalidBuildIds {
6096 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6097 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6098 variables.BuildId = proptools.StringPtr(id)
6099 })
6100 testApexError(t, message, `apex {
6101 name: "myapex",
6102 key: "myapex.key",
6103 apps: ["AppFooPrebuilt"],
6104 updatable: false,
6105 }
6106
6107 apex_key {
6108 name: "myapex.key",
6109 public_key: "testkey.avbpubkey",
6110 private_key: "testkey.pem",
6111 }
6112
6113 android_app_import {
6114 name: "AppFooPrebuilt",
6115 apk: "PrebuiltAppFoo.apk",
6116 presigned: true,
6117 apex_available: ["myapex"],
6118 }
6119 `, fixture)
6120 }
6121}
6122
Dario Frenicde2a032019-10-27 00:29:22 +01006123func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006124 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006125 apex {
6126 name: "myapex",
6127 key: "myapex.key",
6128 apps: [
6129 "AppFooPrebuilt",
6130 "AppFooPrivPrebuilt",
6131 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006132 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006133 }
6134
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
6140
6141 android_app_import {
6142 name: "AppFooPrebuilt",
6143 apk: "PrebuiltAppFoo.apk",
6144 presigned: true,
6145 dex_preopt: {
6146 enabled: false,
6147 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006148 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006149 }
6150
6151 android_app_import {
6152 name: "AppFooPrivPrebuilt",
6153 apk: "PrebuiltAppFooPriv.apk",
6154 privileged: true,
6155 presigned: true,
6156 dex_preopt: {
6157 enabled: false,
6158 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006159 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006160 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006161 }
6162 `)
6163
Sundong Ahnabb64432019-10-22 13:58:29 +09006164 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01006165 apexRule := module.Rule("apexRule")
6166 copyCmds := apexRule.Args["copy_commands"]
6167
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006168 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6169 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006170}
6171
6172func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006173 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006174 apex {
6175 name: "myapex",
6176 key: "myapex.key",
6177 apps: [
6178 "AppFoo",
6179 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006180 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006181 }
6182
6183 apex_key {
6184 name: "myapex.key",
6185 public_key: "testkey.avbpubkey",
6186 private_key: "testkey.pem",
6187 }
6188
6189 android_app {
6190 name: "AppFoo",
6191 srcs: ["foo/bar/MyClass.java"],
6192 sdk_version: "none",
6193 system_modules: "none",
6194 apex_available: [ "myapex" ],
6195 }
6196
6197 android_app_import {
6198 name: "AppFoo",
6199 apk: "AppFooPrebuilt.apk",
6200 filename: "AppFooPrebuilt.apk",
6201 presigned: true,
6202 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006203 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006204 }
6205 `, withFiles(map[string][]byte{
6206 "AppFooPrebuilt.apk": nil,
6207 }))
6208
6209 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006210 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006211 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006212}
6213
Dario Freni6f3937c2019-12-20 22:58:03 +00006214func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006215 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006216 apex {
6217 name: "myapex",
6218 key: "myapex.key",
6219 apps: [
6220 "TesterHelpAppFoo",
6221 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006222 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 android_test_helper_app {
6232 name: "TesterHelpAppFoo",
6233 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006234 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006235 }
6236
6237 `)
6238
6239 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6240 apexRule := module.Rule("apexRule")
6241 copyCmds := apexRule.Args["copy_commands"]
6242
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006243 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006244}
6245
Jooyung Han18020ea2019-11-13 10:50:48 +09006246func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6247 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006248 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006249 apex {
6250 name: "myapex",
6251 key: "myapex.key",
6252 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006253 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006254 }
6255
6256 apex_key {
6257 name: "myapex.key",
6258 public_key: "testkey.avbpubkey",
6259 private_key: "testkey.pem",
6260 }
6261
6262 apex {
6263 name: "otherapex",
6264 key: "myapex.key",
6265 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006266 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006267 }
6268
6269 cc_defaults {
6270 name: "libfoo-defaults",
6271 apex_available: ["otherapex"],
6272 }
6273
6274 cc_library {
6275 name: "libfoo",
6276 defaults: ["libfoo-defaults"],
6277 stl: "none",
6278 system_shared_libs: [],
6279 }`)
6280}
6281
Paul Duffine52e66f2020-03-30 17:54:29 +01006282func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006283 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006284 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006285 apex {
6286 name: "myapex",
6287 key: "myapex.key",
6288 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006289 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006290 }
6291
6292 apex_key {
6293 name: "myapex.key",
6294 public_key: "testkey.avbpubkey",
6295 private_key: "testkey.pem",
6296 }
6297
6298 apex {
6299 name: "otherapex",
6300 key: "otherapex.key",
6301 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006302 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006303 }
6304
6305 apex_key {
6306 name: "otherapex.key",
6307 public_key: "testkey.avbpubkey",
6308 private_key: "testkey.pem",
6309 }
6310
6311 cc_library {
6312 name: "libfoo",
6313 stl: "none",
6314 system_shared_libs: [],
6315 apex_available: ["otherapex"],
6316 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006317}
Jiyong Park127b40b2019-09-30 16:04:35 +09006318
Paul Duffine52e66f2020-03-30 17:54:29 +01006319func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006320 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006321 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006322.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006323.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006324.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006325.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006326.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006327.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006328 apex {
6329 name: "myapex",
6330 key: "myapex.key",
6331 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006332 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006333 }
6334
6335 apex_key {
6336 name: "myapex.key",
6337 public_key: "testkey.avbpubkey",
6338 private_key: "testkey.pem",
6339 }
6340
Jiyong Park127b40b2019-09-30 16:04:35 +09006341 cc_library {
6342 name: "libfoo",
6343 stl: "none",
6344 shared_libs: ["libbar"],
6345 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006346 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006347 }
6348
6349 cc_library {
6350 name: "libbar",
6351 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006352 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006353 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006354 apex_available: ["myapex"],
6355 }
6356
6357 cc_library {
6358 name: "libbaz",
6359 stl: "none",
6360 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006361 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006362}
Jiyong Park127b40b2019-09-30 16:04:35 +09006363
Paul Duffine52e66f2020-03-30 17:54:29 +01006364func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006365 testApexError(t, "\"otherapex\" is not a valid module name", `
6366 apex {
6367 name: "myapex",
6368 key: "myapex.key",
6369 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006370 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006371 }
6372
6373 apex_key {
6374 name: "myapex.key",
6375 public_key: "testkey.avbpubkey",
6376 private_key: "testkey.pem",
6377 }
6378
6379 cc_library {
6380 name: "libfoo",
6381 stl: "none",
6382 system_shared_libs: [],
6383 apex_available: ["otherapex"],
6384 }`)
6385
Paul Duffine52e66f2020-03-30 17:54:29 +01006386 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006387 apex {
6388 name: "myapex",
6389 key: "myapex.key",
6390 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006391 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006392 }
6393
6394 apex_key {
6395 name: "myapex.key",
6396 public_key: "testkey.avbpubkey",
6397 private_key: "testkey.pem",
6398 }
6399
6400 cc_library {
6401 name: "libfoo",
6402 stl: "none",
6403 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006404 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006405 apex_available: ["myapex"],
6406 }
6407
6408 cc_library {
6409 name: "libbar",
6410 stl: "none",
6411 system_shared_libs: [],
6412 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006413 }
6414
6415 cc_library {
6416 name: "libbaz",
6417 stl: "none",
6418 system_shared_libs: [],
6419 stubs: {
6420 versions: ["10", "20", "30"],
6421 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006422 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006423}
Jiyong Park127b40b2019-09-30 16:04:35 +09006424
Jiyong Park89e850a2020-04-07 16:37:39 +09006425func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006426 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006427 apex {
6428 name: "myapex",
6429 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006430 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006431 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006432 }
6433
6434 apex_key {
6435 name: "myapex.key",
6436 public_key: "testkey.avbpubkey",
6437 private_key: "testkey.pem",
6438 }
6439
6440 cc_library {
6441 name: "libfoo",
6442 stl: "none",
6443 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006444 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006445 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006446 }
6447
6448 cc_library {
6449 name: "libfoo2",
6450 stl: "none",
6451 system_shared_libs: [],
6452 shared_libs: ["libbaz"],
6453 apex_available: ["//apex_available:platform"],
6454 }
6455
6456 cc_library {
6457 name: "libbar",
6458 stl: "none",
6459 system_shared_libs: [],
6460 apex_available: ["myapex"],
6461 }
6462
6463 cc_library {
6464 name: "libbaz",
6465 stl: "none",
6466 system_shared_libs: [],
6467 apex_available: ["myapex"],
6468 stubs: {
6469 versions: ["1"],
6470 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006471 }`)
6472
Jiyong Park89e850a2020-04-07 16:37:39 +09006473 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6474 // because it depends on libbar which isn't available to platform
6475 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6476 if libfoo.NotAvailableForPlatform() != true {
6477 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6478 }
6479
6480 // libfoo2 however can be available to platform because it depends on libbaz which provides
6481 // stubs
6482 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6483 if libfoo2.NotAvailableForPlatform() == true {
6484 t.Errorf("%q should be available to platform", libfoo2.String())
6485 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006486}
Jiyong Parka90ca002019-10-07 15:47:24 +09006487
Paul Duffine52e66f2020-03-30 17:54:29 +01006488func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006489 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006490 apex {
6491 name: "myapex",
6492 key: "myapex.key",
6493 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006494 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 cc_library {
6504 name: "libfoo",
6505 stl: "none",
6506 system_shared_libs: [],
6507 apex_available: ["myapex"],
6508 static: {
6509 apex_available: ["//apex_available:platform"],
6510 },
6511 }`)
6512
Jiyong Park89e850a2020-04-07 16:37:39 +09006513 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6514 if libfooShared.NotAvailableForPlatform() != true {
6515 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6516 }
6517 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6518 if libfooStatic.NotAvailableForPlatform() != false {
6519 t.Errorf("%q should be available to platform", libfooStatic.String())
6520 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006521}
6522
Jiyong Park5d790c32019-11-15 18:40:32 +09006523func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006524 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006529 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006530 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006531 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006532 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006533 }
6534
6535 override_apex {
6536 name: "override_myapex",
6537 base: "myapex",
6538 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006539 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006540 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006541 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006542 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006543 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006544 key: "mynewapex.key",
6545 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006546 }
6547
6548 apex_key {
6549 name: "myapex.key",
6550 public_key: "testkey.avbpubkey",
6551 private_key: "testkey.pem",
6552 }
6553
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006554 apex_key {
6555 name: "mynewapex.key",
6556 public_key: "testkey2.avbpubkey",
6557 private_key: "testkey2.pem",
6558 }
6559
6560 android_app_certificate {
6561 name: "myapex.certificate",
6562 certificate: "testkey",
6563 }
6564
Jiyong Park5d790c32019-11-15 18:40:32 +09006565 android_app {
6566 name: "app",
6567 srcs: ["foo/bar/MyClass.java"],
6568 package_name: "foo",
6569 sdk_version: "none",
6570 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006571 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006572 }
6573
6574 override_android_app {
6575 name: "override_app",
6576 base: "app",
6577 package_name: "bar",
6578 }
markchien7c803b82021-08-26 22:10:06 +08006579
6580 bpf {
6581 name: "bpf",
6582 srcs: ["bpf.c"],
6583 }
6584
6585 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006586 name: "overrideBpf",
6587 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006588 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006589
6590 prebuilt_etc {
6591 name: "myetc",
6592 src: "myprebuilt",
6593 }
6594
6595 prebuilt_etc {
6596 name: "override_myetc",
6597 src: "override_myprebuilt",
6598 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006599 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006600
Jiyong Park317645e2019-12-05 13:20:58 +09006601 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6602 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6603 if originalVariant.GetOverriddenBy() != "" {
6604 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6605 }
6606 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6607 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6608 }
6609
Jiyong Park5d790c32019-11-15 18:40:32 +09006610 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6611 apexRule := module.Rule("apexRule")
6612 copyCmds := apexRule.Args["copy_commands"]
6613
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006614 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6615 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006616
markchien7c803b82021-08-26 22:10:06 +08006617 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006618 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006619
Daniel Norman5a3ce132021-08-26 15:44:43 -07006620 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6621 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6622
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006623 apexBundle := module.Module().(*apexBundle)
6624 name := apexBundle.Name()
6625 if name != "override_myapex" {
6626 t.Errorf("name should be \"override_myapex\", but was %q", name)
6627 }
6628
Baligh Uddin004d7172020-02-19 21:29:28 -08006629 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6630 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6631 }
6632
Jiyong Park20bacab2020-03-03 11:45:41 +09006633 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006634 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006635 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6636
6637 signApkRule := module.Rule("signapk")
6638 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006639
Colin Crossaa255532020-07-03 13:18:24 -07006640 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006641 var builder strings.Builder
6642 data.Custom(&builder, name, "TARGET_", "", data)
6643 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006644 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6645 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6646 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006647 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006648 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006649 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006650 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006651 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006652 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6653 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006654}
6655
Albert Martineefabcf2022-03-21 20:11:16 +00006656func TestMinSdkVersionOverride(t *testing.T) {
6657 // Override from 29 to 31
6658 minSdkOverride31 := "31"
6659 ctx := testApex(t, `
6660 apex {
6661 name: "myapex",
6662 key: "myapex.key",
6663 native_shared_libs: ["mylib"],
6664 updatable: true,
6665 min_sdk_version: "29"
6666 }
6667
6668 override_apex {
6669 name: "override_myapex",
6670 base: "myapex",
6671 logging_parent: "com.foo.bar",
6672 package_name: "test.overridden.package"
6673 }
6674
6675 apex_key {
6676 name: "myapex.key",
6677 public_key: "testkey.avbpubkey",
6678 private_key: "testkey.pem",
6679 }
6680
6681 cc_library {
6682 name: "mylib",
6683 srcs: ["mylib.cpp"],
6684 runtime_libs: ["libbar"],
6685 system_shared_libs: [],
6686 stl: "none",
6687 apex_available: [ "myapex" ],
6688 min_sdk_version: "apex_inherit"
6689 }
6690
6691 cc_library {
6692 name: "libbar",
6693 srcs: ["mylib.cpp"],
6694 system_shared_libs: [],
6695 stl: "none",
6696 apex_available: [ "myapex" ],
6697 min_sdk_version: "apex_inherit"
6698 }
6699
6700 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6701
6702 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6703 copyCmds := apexRule.Args["copy_commands"]
6704
6705 // Ensure that direct non-stubs dep is always included
6706 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6707
6708 // Ensure that runtime_libs dep in included
6709 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6710
6711 // Ensure libraries target overridden min_sdk_version value
6712 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6713}
6714
6715func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6716 // Attempt to override from 31 to 29, should be a NOOP
6717 minSdkOverride29 := "29"
6718 ctx := testApex(t, `
6719 apex {
6720 name: "myapex",
6721 key: "myapex.key",
6722 native_shared_libs: ["mylib"],
6723 updatable: true,
6724 min_sdk_version: "31"
6725 }
6726
6727 override_apex {
6728 name: "override_myapex",
6729 base: "myapex",
6730 logging_parent: "com.foo.bar",
6731 package_name: "test.overridden.package"
6732 }
6733
6734 apex_key {
6735 name: "myapex.key",
6736 public_key: "testkey.avbpubkey",
6737 private_key: "testkey.pem",
6738 }
6739
6740 cc_library {
6741 name: "mylib",
6742 srcs: ["mylib.cpp"],
6743 runtime_libs: ["libbar"],
6744 system_shared_libs: [],
6745 stl: "none",
6746 apex_available: [ "myapex" ],
6747 min_sdk_version: "apex_inherit"
6748 }
6749
6750 cc_library {
6751 name: "libbar",
6752 srcs: ["mylib.cpp"],
6753 system_shared_libs: [],
6754 stl: "none",
6755 apex_available: [ "myapex" ],
6756 min_sdk_version: "apex_inherit"
6757 }
6758
6759 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6760
6761 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6762 copyCmds := apexRule.Args["copy_commands"]
6763
6764 // Ensure that direct non-stubs dep is always included
6765 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6766
6767 // Ensure that runtime_libs dep in included
6768 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6769
6770 // Ensure libraries target the original min_sdk_version value rather than the overridden
6771 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6772}
6773
Jooyung Han214bf372019-11-12 13:03:50 +09006774func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006775 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006776 apex {
6777 name: "myapex",
6778 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006779 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006780 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006781 }
6782
6783 apex_key {
6784 name: "myapex.key",
6785 public_key: "testkey.avbpubkey",
6786 private_key: "testkey.pem",
6787 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006788
6789 cc_library {
6790 name: "mylib",
6791 srcs: ["mylib.cpp"],
6792 stl: "libc++",
6793 system_shared_libs: [],
6794 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006795 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006796 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006797 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006798
6799 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6800 args := module.Rule("apexRule").Args
6801 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006802 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006803
6804 // The copies of the libraries in the apex should have one more dependency than
6805 // the ones outside the apex, namely the unwinder. Ideally we should check
6806 // the dependency names directly here but for some reason the names are blank in
6807 // this test.
6808 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006809 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006810 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6811 if len(apexImplicits) != len(nonApexImplicits)+1 {
6812 t.Errorf("%q missing unwinder dep", lib)
6813 }
6814 }
Jooyung Han214bf372019-11-12 13:03:50 +09006815}
6816
Paul Duffine05480a2021-03-08 15:07:14 +00006817var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006818 "api/current.txt": nil,
6819 "api/removed.txt": nil,
6820 "api/system-current.txt": nil,
6821 "api/system-removed.txt": nil,
6822 "api/test-current.txt": nil,
6823 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006824
Anton Hanssondff2c782020-12-21 17:10:01 +00006825 "100/public/api/foo.txt": nil,
6826 "100/public/api/foo-removed.txt": nil,
6827 "100/system/api/foo.txt": nil,
6828 "100/system/api/foo-removed.txt": nil,
6829
Paul Duffineedc5d52020-06-12 17:46:39 +01006830 // For java_sdk_library_import
6831 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006832}
6833
Jooyung Han58f26ab2019-12-18 15:34:32 +09006834func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006835 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006836 apex {
6837 name: "myapex",
6838 key: "myapex.key",
6839 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006840 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006841 }
6842
6843 apex_key {
6844 name: "myapex.key",
6845 public_key: "testkey.avbpubkey",
6846 private_key: "testkey.pem",
6847 }
6848
6849 java_sdk_library {
6850 name: "foo",
6851 srcs: ["a.java"],
6852 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006853 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006854 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006855
6856 prebuilt_apis {
6857 name: "sdk",
6858 api_dirs: ["100"],
6859 }
Paul Duffin9b879592020-05-26 13:21:35 +01006860 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006861
6862 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006863 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006864 "javalib/foo.jar",
6865 "etc/permissions/foo.xml",
6866 })
6867 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006868 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006869 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 +09006870}
6871
Paul Duffin9b879592020-05-26 13:21:35 +01006872func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006873 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006874 apex {
6875 name: "myapex",
6876 key: "myapex.key",
6877 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006878 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006879 }
6880
6881 apex_key {
6882 name: "myapex.key",
6883 public_key: "testkey.avbpubkey",
6884 private_key: "testkey.pem",
6885 }
6886
6887 java_sdk_library {
6888 name: "foo",
6889 srcs: ["a.java"],
6890 api_packages: ["foo"],
6891 apex_available: ["myapex"],
6892 sdk_version: "none",
6893 system_modules: "none",
6894 }
6895
6896 java_library {
6897 name: "bar",
6898 srcs: ["a.java"],
6899 libs: ["foo"],
6900 apex_available: ["myapex"],
6901 sdk_version: "none",
6902 system_modules: "none",
6903 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006904
6905 prebuilt_apis {
6906 name: "sdk",
6907 api_dirs: ["100"],
6908 }
Paul Duffin9b879592020-05-26 13:21:35 +01006909 `, withFiles(filesForSdkLibrary))
6910
6911 // java_sdk_library installs both impl jar and permission XML
6912 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6913 "javalib/bar.jar",
6914 "javalib/foo.jar",
6915 "etc/permissions/foo.xml",
6916 })
6917
6918 // The bar library should depend on the implementation jar.
6919 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006920 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006921 t.Errorf("expected %q, found %#q", expected, actual)
6922 }
6923}
6924
6925func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006926 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006927 apex {
6928 name: "myapex",
6929 key: "myapex.key",
6930 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006931 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006932 }
6933
6934 apex_key {
6935 name: "myapex.key",
6936 public_key: "testkey.avbpubkey",
6937 private_key: "testkey.pem",
6938 }
6939
6940 java_sdk_library {
6941 name: "foo",
6942 srcs: ["a.java"],
6943 api_packages: ["foo"],
6944 apex_available: ["myapex"],
6945 sdk_version: "none",
6946 system_modules: "none",
6947 }
6948
6949 java_library {
6950 name: "bar",
6951 srcs: ["a.java"],
6952 libs: ["foo"],
6953 sdk_version: "none",
6954 system_modules: "none",
6955 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006956
6957 prebuilt_apis {
6958 name: "sdk",
6959 api_dirs: ["100"],
6960 }
Paul Duffin9b879592020-05-26 13:21:35 +01006961 `, withFiles(filesForSdkLibrary))
6962
6963 // java_sdk_library installs both impl jar and permission XML
6964 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6965 "javalib/foo.jar",
6966 "etc/permissions/foo.xml",
6967 })
6968
6969 // The bar library should depend on the stubs jar.
6970 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006971 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006972 t.Errorf("expected %q, found %#q", expected, actual)
6973 }
6974}
6975
Paul Duffineedc5d52020-06-12 17:46:39 +01006976func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006977 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006978 prebuilt_apis {
6979 name: "sdk",
6980 api_dirs: ["100"],
6981 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006982 withFiles(map[string][]byte{
6983 "apex/a.java": nil,
6984 "apex/apex_manifest.json": nil,
6985 "apex/Android.bp": []byte(`
6986 package {
6987 default_visibility: ["//visibility:private"],
6988 }
6989
6990 apex {
6991 name: "myapex",
6992 key: "myapex.key",
6993 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006994 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006995 }
6996
6997 apex_key {
6998 name: "myapex.key",
6999 public_key: "testkey.avbpubkey",
7000 private_key: "testkey.pem",
7001 }
7002
7003 java_library {
7004 name: "bar",
7005 srcs: ["a.java"],
7006 libs: ["foo"],
7007 apex_available: ["myapex"],
7008 sdk_version: "none",
7009 system_modules: "none",
7010 }
7011`),
7012 "source/a.java": nil,
7013 "source/api/current.txt": nil,
7014 "source/api/removed.txt": nil,
7015 "source/Android.bp": []byte(`
7016 package {
7017 default_visibility: ["//visibility:private"],
7018 }
7019
7020 java_sdk_library {
7021 name: "foo",
7022 visibility: ["//apex"],
7023 srcs: ["a.java"],
7024 api_packages: ["foo"],
7025 apex_available: ["myapex"],
7026 sdk_version: "none",
7027 system_modules: "none",
7028 public: {
7029 enabled: true,
7030 },
7031 }
7032`),
7033 "prebuilt/a.jar": nil,
7034 "prebuilt/Android.bp": []byte(`
7035 package {
7036 default_visibility: ["//visibility:private"],
7037 }
7038
7039 java_sdk_library_import {
7040 name: "foo",
7041 visibility: ["//apex", "//source"],
7042 apex_available: ["myapex"],
7043 prefer: true,
7044 public: {
7045 jars: ["a.jar"],
7046 },
7047 }
7048`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007049 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007050 )
7051
7052 // java_sdk_library installs both impl jar and permission XML
7053 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7054 "javalib/bar.jar",
7055 "javalib/foo.jar",
7056 "etc/permissions/foo.xml",
7057 })
7058
7059 // The bar library should depend on the implementation jar.
7060 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007061 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007062 t.Errorf("expected %q, found %#q", expected, actual)
7063 }
7064}
7065
7066func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7067 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7068 apex {
7069 name: "myapex",
7070 key: "myapex.key",
7071 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007072 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007073 }
7074
7075 apex_key {
7076 name: "myapex.key",
7077 public_key: "testkey.avbpubkey",
7078 private_key: "testkey.pem",
7079 }
7080
7081 java_sdk_library_import {
7082 name: "foo",
7083 apex_available: ["myapex"],
7084 prefer: true,
7085 public: {
7086 jars: ["a.jar"],
7087 },
7088 }
7089
7090 `, withFiles(filesForSdkLibrary))
7091}
7092
atrost6e126252020-01-27 17:01:16 +00007093func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007094 result := android.GroupFixturePreparers(
7095 prepareForApexTest,
7096 java.PrepareForTestWithPlatformCompatConfig,
7097 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007098 apex {
7099 name: "myapex",
7100 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007101 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007102 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007103 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007104 }
7105
7106 apex_key {
7107 name: "myapex.key",
7108 public_key: "testkey.avbpubkey",
7109 private_key: "testkey.pem",
7110 }
7111
7112 platform_compat_config {
7113 name: "myjar-platform-compat-config",
7114 src: ":myjar",
7115 }
7116
7117 java_library {
7118 name: "myjar",
7119 srcs: ["foo/bar/MyClass.java"],
7120 sdk_version: "none",
7121 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007122 apex_available: [ "myapex" ],
7123 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007124
7125 // Make sure that a preferred prebuilt does not affect the apex contents.
7126 prebuilt_platform_compat_config {
7127 name: "myjar-platform-compat-config",
7128 metadata: "compat-config/metadata.xml",
7129 prefer: true,
7130 }
atrost6e126252020-01-27 17:01:16 +00007131 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007132 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00007133 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7134 "etc/compatconfig/myjar-platform-compat-config.xml",
7135 "javalib/myjar.jar",
7136 })
7137}
7138
Jooyung Han862c0d62022-12-21 10:15:37 +09007139func TestNoDupeApexFiles(t *testing.T) {
7140 android.GroupFixturePreparers(
7141 android.PrepareForTestWithAndroidBuildComponents,
7142 PrepareForTestWithApexBuildComponents,
7143 prepareForTestWithMyapex,
7144 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7145 ).
7146 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7147 RunTestWithBp(t, `
7148 apex {
7149 name: "myapex",
7150 key: "myapex.key",
7151 prebuilts: ["foo", "bar"],
7152 updatable: false,
7153 }
7154
7155 apex_key {
7156 name: "myapex.key",
7157 public_key: "testkey.avbpubkey",
7158 private_key: "testkey.pem",
7159 }
7160
7161 prebuilt_etc {
7162 name: "foo",
7163 src: "myprebuilt",
7164 filename_from_src: true,
7165 }
7166
7167 prebuilt_etc {
7168 name: "bar",
7169 src: "myprebuilt",
7170 filename_from_src: true,
7171 }
7172 `)
7173}
7174
Jiyong Park479321d2019-12-16 11:47:12 +09007175func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7176 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7177 apex {
7178 name: "myapex",
7179 key: "myapex.key",
7180 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007181 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007182 }
7183
7184 apex_key {
7185 name: "myapex.key",
7186 public_key: "testkey.avbpubkey",
7187 private_key: "testkey.pem",
7188 }
7189
7190 java_library {
7191 name: "myjar",
7192 srcs: ["foo/bar/MyClass.java"],
7193 sdk_version: "none",
7194 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007195 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007196 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007197 }
7198 `)
7199}
7200
Jiyong Park7afd1072019-12-30 16:56:33 +09007201func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007202 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007203 apex {
7204 name: "myapex",
7205 key: "myapex.key",
7206 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007207 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007208 }
7209
7210 apex_key {
7211 name: "myapex.key",
7212 public_key: "testkey.avbpubkey",
7213 private_key: "testkey.pem",
7214 }
7215
7216 cc_library {
7217 name: "mylib",
7218 srcs: ["mylib.cpp"],
7219 system_shared_libs: [],
7220 stl: "none",
7221 required: ["a", "b"],
7222 host_required: ["c", "d"],
7223 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007224 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007225 }
7226 `)
7227
7228 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007229 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007230 name := apexBundle.BaseModuleName()
7231 prefix := "TARGET_"
7232 var builder strings.Builder
7233 data.Custom(&builder, name, prefix, "", data)
7234 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007235 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 -08007236 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7237 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007238}
7239
Jiyong Park7cd10e32020-01-14 09:22:18 +09007240func TestSymlinksFromApexToSystem(t *testing.T) {
7241 bp := `
7242 apex {
7243 name: "myapex",
7244 key: "myapex.key",
7245 native_shared_libs: ["mylib"],
7246 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007247 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007248 }
7249
Jiyong Park9d677202020-02-19 16:29:35 +09007250 apex {
7251 name: "myapex.updatable",
7252 key: "myapex.key",
7253 native_shared_libs: ["mylib"],
7254 java_libs: ["myjar"],
7255 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007256 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007257 }
7258
Jiyong Park7cd10e32020-01-14 09:22:18 +09007259 apex_key {
7260 name: "myapex.key",
7261 public_key: "testkey.avbpubkey",
7262 private_key: "testkey.pem",
7263 }
7264
7265 cc_library {
7266 name: "mylib",
7267 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007268 shared_libs: [
7269 "myotherlib",
7270 "myotherlib_ext",
7271 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007272 system_shared_libs: [],
7273 stl: "none",
7274 apex_available: [
7275 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007276 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007277 "//apex_available:platform",
7278 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007279 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007280 }
7281
7282 cc_library {
7283 name: "myotherlib",
7284 srcs: ["mylib.cpp"],
7285 system_shared_libs: [],
7286 stl: "none",
7287 apex_available: [
7288 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007289 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007290 "//apex_available:platform",
7291 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007292 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007293 }
7294
Jiyong Parkce243632023-02-17 18:22:25 +09007295 cc_library {
7296 name: "myotherlib_ext",
7297 srcs: ["mylib.cpp"],
7298 system_shared_libs: [],
7299 system_ext_specific: true,
7300 stl: "none",
7301 apex_available: [
7302 "myapex",
7303 "myapex.updatable",
7304 "//apex_available:platform",
7305 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007306 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007307 }
7308
Jiyong Park7cd10e32020-01-14 09:22:18 +09007309 java_library {
7310 name: "myjar",
7311 srcs: ["foo/bar/MyClass.java"],
7312 sdk_version: "none",
7313 system_modules: "none",
7314 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007315 apex_available: [
7316 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007317 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007318 "//apex_available:platform",
7319 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007320 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007321 }
7322
7323 java_library {
7324 name: "myotherjar",
7325 srcs: ["foo/bar/MyClass.java"],
7326 sdk_version: "none",
7327 system_modules: "none",
7328 apex_available: [
7329 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007330 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007331 "//apex_available:platform",
7332 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007333 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007334 }
7335 `
7336
7337 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7338 for _, f := range files {
7339 if f.path == file {
7340 if f.isLink {
7341 t.Errorf("%q is not a real file", file)
7342 }
7343 return
7344 }
7345 }
7346 t.Errorf("%q is not found", file)
7347 }
7348
Jiyong Parkce243632023-02-17 18:22:25 +09007349 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007350 for _, f := range files {
7351 if f.path == file {
7352 if !f.isLink {
7353 t.Errorf("%q is not a symlink", file)
7354 }
Jiyong Parkce243632023-02-17 18:22:25 +09007355 if f.src != target {
7356 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7357 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007358 return
7359 }
7360 }
7361 t.Errorf("%q is not found", file)
7362 }
7363
Jiyong Park9d677202020-02-19 16:29:35 +09007364 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7365 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007366 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007367 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007368 ensureRealfileExists(t, files, "javalib/myjar.jar")
7369 ensureRealfileExists(t, files, "lib64/mylib.so")
7370 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007371 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007372
Jiyong Park9d677202020-02-19 16:29:35 +09007373 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7374 ensureRealfileExists(t, files, "javalib/myjar.jar")
7375 ensureRealfileExists(t, files, "lib64/mylib.so")
7376 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007377 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007378
7379 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007380 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007381 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007382 ensureRealfileExists(t, files, "javalib/myjar.jar")
7383 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007384 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7385 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007386
7387 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7388 ensureRealfileExists(t, files, "javalib/myjar.jar")
7389 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007390 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7391 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007392}
7393
Yo Chiange8128052020-07-23 20:09:18 +08007394func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007395 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007396 apex {
7397 name: "myapex",
7398 key: "myapex.key",
7399 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007400 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007401 }
7402
7403 apex_key {
7404 name: "myapex.key",
7405 public_key: "testkey.avbpubkey",
7406 private_key: "testkey.pem",
7407 }
7408
7409 cc_library_shared {
7410 name: "mylib",
7411 srcs: ["mylib.cpp"],
7412 shared_libs: ["myotherlib"],
7413 system_shared_libs: [],
7414 stl: "none",
7415 apex_available: [
7416 "myapex",
7417 "//apex_available:platform",
7418 ],
7419 }
7420
7421 cc_prebuilt_library_shared {
7422 name: "myotherlib",
7423 srcs: ["prebuilt.so"],
7424 system_shared_libs: [],
7425 stl: "none",
7426 apex_available: [
7427 "myapex",
7428 "//apex_available:platform",
7429 ],
7430 }
7431 `)
7432
Prerana Patilb1896c82022-11-09 18:14:34 +00007433 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007434 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007435 var builder strings.Builder
7436 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7437 androidMk := builder.String()
7438 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007439 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007440 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7441 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7442 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007443 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 +08007444}
7445
Jooyung Han643adc42020-02-27 13:50:06 +09007446func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007447 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007448 apex {
7449 name: "myapex",
7450 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007451 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007452 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007453 }
7454
7455 apex_key {
7456 name: "myapex.key",
7457 public_key: "testkey.avbpubkey",
7458 private_key: "testkey.pem",
7459 }
7460
7461 cc_library {
7462 name: "mylib",
7463 srcs: ["mylib.cpp"],
7464 shared_libs: ["mylib2"],
7465 system_shared_libs: [],
7466 stl: "none",
7467 apex_available: [ "myapex" ],
7468 }
7469
7470 cc_library {
7471 name: "mylib2",
7472 srcs: ["mylib.cpp"],
7473 system_shared_libs: [],
7474 stl: "none",
7475 apex_available: [ "myapex" ],
7476 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007477
7478 rust_ffi_shared {
7479 name: "libfoo.rust",
7480 crate_name: "foo",
7481 srcs: ["foo.rs"],
7482 shared_libs: ["libfoo.shared_from_rust"],
7483 prefer_rlib: true,
7484 apex_available: ["myapex"],
7485 }
7486
7487 cc_library_shared {
7488 name: "libfoo.shared_from_rust",
7489 srcs: ["mylib.cpp"],
7490 system_shared_libs: [],
7491 stl: "none",
7492 stubs: {
7493 versions: ["10", "11", "12"],
7494 },
7495 }
7496
Jooyung Han643adc42020-02-27 13:50:06 +09007497 `)
7498
7499 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7500 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007501 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007502 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7503 "lib64/mylib.so",
7504 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007505 "lib64/libfoo.rust.so",
7506 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7507 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007508 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007509
7510 // b/220397949
7511 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007512}
7513
Jooyung Han49f67012020-04-17 13:43:10 +09007514func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007515 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007516 apex {
7517 name: "myapex",
7518 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007519 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007520 }
7521 apex_key {
7522 name: "myapex.key",
7523 public_key: "testkey.avbpubkey",
7524 private_key: "testkey.pem",
7525 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007526 `,
7527 android.FixtureModifyConfig(func(config android.Config) {
7528 delete(config.Targets, android.Android)
7529 config.AndroidCommonTarget = android.Target{}
7530 }),
7531 )
Jooyung Han49f67012020-04-17 13:43:10 +09007532
7533 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7534 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7535 }
7536}
7537
Jiyong Parkbd159612020-02-28 15:22:21 +09007538func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007539 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007540 apex {
7541 name: "myapex",
7542 key: "myapex.key",
7543 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007544 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007545 }
7546
7547 apex_key {
7548 name: "myapex.key",
7549 public_key: "testkey.avbpubkey",
7550 private_key: "testkey.pem",
7551 }
7552
7553 android_app {
7554 name: "AppFoo",
7555 srcs: ["foo/bar/MyClass.java"],
7556 sdk_version: "none",
7557 system_modules: "none",
7558 apex_available: [ "myapex" ],
7559 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007560 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007561
Colin Crosscf371cc2020-11-13 11:48:42 -08007562 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007563 content := bundleConfigRule.Args["content"]
7564
7565 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007566 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 +09007567}
7568
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007569func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007570 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007571 apex {
7572 name: "myapex",
7573 key: "myapex.key",
7574 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007575 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007576 }
7577
7578 apex_key {
7579 name: "myapex.key",
7580 public_key: "testkey.avbpubkey",
7581 private_key: "testkey.pem",
7582 }
7583
7584 android_app_set {
7585 name: "AppSet",
7586 set: "AppSet.apks",
7587 }`)
7588 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007589 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007590 content := bundleConfigRule.Args["content"]
7591 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7592 s := mod.Rule("apexRule").Args["copy_commands"]
7593 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007594 if len(copyCmds) != 4 {
7595 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007596 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007597 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7598 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007599 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7600 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007601
7602 // Ensure that canned_fs_config has an entry for the app set zip file
7603 generateFsRule := mod.Rule("generateFsConfig")
7604 cmd := generateFsRule.RuleParams.Command
7605 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007606}
7607
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007608func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007609 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007610 apex_set {
7611 name: "myapex",
7612 filename: "foo_v2.apex",
7613 sanitized: {
7614 none: { set: "myapex.apks", },
7615 hwaddress: { set: "myapex.hwasan.apks", },
7616 },
Paul Duffin24704672021-04-06 16:09:30 +01007617 }
7618 `
7619 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007620
Paul Duffin24704672021-04-06 16:09:30 +01007621 // Check that the extractor produces the correct output file from the correct input file.
7622 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007623
Paul Duffin24704672021-04-06 16:09:30 +01007624 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7625 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007626
Paul Duffin24704672021-04-06 16:09:30 +01007627 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7628
7629 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007630 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7631 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007632
7633 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007634}
7635
Pranav Guptaeba03b02022-09-27 00:27:08 +00007636func TestApexSetApksModuleAssignment(t *testing.T) {
7637 ctx := testApex(t, `
7638 apex_set {
7639 name: "myapex",
7640 set: ":myapex_apks_file",
7641 }
7642
7643 filegroup {
7644 name: "myapex_apks_file",
7645 srcs: ["myapex.apks"],
7646 }
7647 `)
7648
7649 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7650
7651 // Check that the extractor produces the correct apks file from the input module
7652 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7653 extractedApex := m.Output(extractorOutput)
7654
7655 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7656}
7657
Paul Duffin89f570a2021-06-16 01:42:33 +01007658func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007659 t.Helper()
7660
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007661 bp := `
7662 java_library {
7663 name: "some-updatable-apex-lib",
7664 srcs: ["a.java"],
7665 sdk_version: "current",
7666 apex_available: [
7667 "some-updatable-apex",
7668 ],
satayevabcd5972021-08-06 17:49:46 +01007669 permitted_packages: ["some.updatable.apex.lib"],
Spandan Dascc9d9422023-04-06 18:07:43 +00007670 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007671 }
7672
7673 java_library {
7674 name: "some-non-updatable-apex-lib",
7675 srcs: ["a.java"],
7676 apex_available: [
7677 "some-non-updatable-apex",
7678 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007679 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007680 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007681 }
7682
7683 bootclasspath_fragment {
7684 name: "some-non-updatable-fragment",
7685 contents: ["some-non-updatable-apex-lib"],
7686 apex_available: [
7687 "some-non-updatable-apex",
7688 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007689 hidden_api: {
7690 split_packages: ["*"],
7691 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007692 }
7693
7694 java_library {
7695 name: "some-platform-lib",
7696 srcs: ["a.java"],
7697 sdk_version: "current",
7698 installable: true,
7699 }
7700
7701 java_library {
7702 name: "some-art-lib",
7703 srcs: ["a.java"],
7704 sdk_version: "current",
7705 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007706 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007707 ],
7708 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007709 compile_dex: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007710 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007711 }
7712
7713 apex {
7714 name: "some-updatable-apex",
7715 key: "some-updatable-apex.key",
7716 java_libs: ["some-updatable-apex-lib"],
7717 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007718 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007719 }
7720
7721 apex {
7722 name: "some-non-updatable-apex",
7723 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007724 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007725 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007726 }
7727
7728 apex_key {
7729 name: "some-updatable-apex.key",
7730 }
7731
7732 apex_key {
7733 name: "some-non-updatable-apex.key",
7734 }
7735
7736 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007737 name: "com.android.art.debug",
7738 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007739 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007740 updatable: true,
Spandan Dascc9d9422023-04-06 18:07:43 +00007741 min_sdk_version: "33",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007742 }
7743
Paul Duffinf23bc472021-04-27 12:42:20 +01007744 bootclasspath_fragment {
7745 name: "art-bootclasspath-fragment",
7746 image_name: "art",
7747 contents: ["some-art-lib"],
7748 apex_available: [
7749 "com.android.art.debug",
7750 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007751 hidden_api: {
7752 split_packages: ["*"],
7753 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007754 }
7755
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007756 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007757 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007758 }
7759
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007760 filegroup {
7761 name: "some-updatable-apex-file_contexts",
7762 srcs: [
7763 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7764 ],
7765 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007766
7767 filegroup {
7768 name: "some-non-updatable-apex-file_contexts",
7769 srcs: [
7770 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7771 ],
7772 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007773 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007774
Paul Duffin89f570a2021-06-16 01:42:33 +01007775 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007776}
7777
Paul Duffin89f570a2021-06-16 01:42:33 +01007778func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007779 t.Helper()
7780
Paul Duffin55607122021-03-30 23:32:51 +01007781 fs := android.MockFS{
7782 "a.java": nil,
7783 "a.jar": nil,
7784 "apex_manifest.json": nil,
7785 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007786 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007787 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7788 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7789 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007790 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007791 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007792
Paul Duffin55607122021-03-30 23:32:51 +01007793 errorHandler := android.FixtureExpectsNoErrors
7794 if errmsg != "" {
7795 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007796 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007797
Paul Duffin55607122021-03-30 23:32:51 +01007798 result := android.GroupFixturePreparers(
7799 cc.PrepareForTestWithCcDefaultModules,
7800 java.PrepareForTestWithHiddenApiBuildComponents,
7801 java.PrepareForTestWithJavaDefaultModules,
7802 java.PrepareForTestWithJavaSdkLibraryFiles,
7803 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007804 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007805 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007806 android.FixtureModifyMockFS(func(fs android.MockFS) {
7807 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7808 insert := ""
7809 for _, fragment := range fragments {
7810 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7811 }
7812 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7813 platform_bootclasspath {
7814 name: "platform-bootclasspath",
7815 fragments: [
7816 %s
7817 ],
7818 }
7819 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007820 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007821 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007822 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007823 ).
7824 ExtendWithErrorHandler(errorHandler).
7825 RunTestWithBp(t, bp)
7826
7827 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007828}
7829
Paul Duffin5556c5f2022-06-09 17:32:21 +00007830func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007831 preparers := android.GroupFixturePreparers(
7832 java.PrepareForTestWithJavaDefaultModules,
7833 PrepareForTestWithApexBuildComponents,
7834 ).
7835 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7836 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7837
7838 bpBase := `
7839 apex_set {
7840 name: "com.android.myapex",
7841 installable: true,
7842 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7843 set: "myapex.apks",
7844 }
7845
7846 apex_set {
7847 name: "com.mycompany.android.myapex",
7848 apex_name: "com.android.myapex",
7849 installable: true,
7850 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7851 set: "company-myapex.apks",
7852 }
7853
7854 prebuilt_bootclasspath_fragment {
7855 name: "my-bootclasspath-fragment",
7856 apex_available: ["com.android.myapex"],
7857 %s
7858 }
7859 `
7860
7861 t.Run("java_import", func(t *testing.T) {
7862 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7863 java_import {
7864 name: "libfoo",
7865 jars: ["libfoo.jar"],
7866 apex_available: ["com.android.myapex"],
7867 }
7868 `)
7869 })
7870
7871 t.Run("java_sdk_library_import", func(t *testing.T) {
7872 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7873 java_sdk_library_import {
7874 name: "libfoo",
7875 public: {
7876 jars: ["libbar.jar"],
7877 },
7878 apex_available: ["com.android.myapex"],
7879 }
7880 `)
7881 })
7882
7883 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7884 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7885 image_name: "art",
7886 contents: ["libfoo"],
7887 `)+`
7888 java_sdk_library_import {
7889 name: "libfoo",
7890 public: {
7891 jars: ["libbar.jar"],
7892 },
7893 apex_available: ["com.android.myapex"],
7894 }
7895 `)
7896 })
7897}
7898
Paul Duffin5556c5f2022-06-09 17:32:21 +00007899func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7900 preparers := android.GroupFixturePreparers(
7901 java.PrepareForTestWithJavaDefaultModules,
7902 PrepareForTestWithApexBuildComponents,
7903 )
7904
7905 bpBase := `
7906 apex_set {
7907 name: "com.android.myapex",
7908 installable: true,
7909 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7910 set: "myapex.apks",
7911 }
7912
7913 apex_set {
7914 name: "com.android.myapex_compressed",
7915 apex_name: "com.android.myapex",
7916 installable: true,
7917 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7918 set: "myapex_compressed.apks",
7919 }
7920
7921 prebuilt_bootclasspath_fragment {
7922 name: "my-bootclasspath-fragment",
7923 apex_available: [
7924 "com.android.myapex",
7925 "com.android.myapex_compressed",
7926 ],
7927 hidden_api: {
7928 annotation_flags: "annotation-flags.csv",
7929 metadata: "metadata.csv",
7930 index: "index.csv",
7931 signature_patterns: "signature_patterns.csv",
7932 },
7933 %s
7934 }
7935 `
7936
7937 t.Run("java_import", func(t *testing.T) {
7938 result := preparers.RunTestWithBp(t,
7939 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7940 java_import {
7941 name: "libfoo",
7942 jars: ["libfoo.jar"],
7943 apex_available: [
7944 "com.android.myapex",
7945 "com.android.myapex_compressed",
7946 ],
7947 }
7948 `)
7949
7950 module := result.Module("libfoo", "android_common_com.android.myapex")
7951 usesLibraryDep := module.(java.UsesLibraryDependency)
7952 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7953 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7954 usesLibraryDep.DexJarBuildPath().Path())
7955 })
7956
7957 t.Run("java_sdk_library_import", func(t *testing.T) {
7958 result := preparers.RunTestWithBp(t,
7959 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7960 java_sdk_library_import {
7961 name: "libfoo",
7962 public: {
7963 jars: ["libbar.jar"],
7964 },
7965 apex_available: [
7966 "com.android.myapex",
7967 "com.android.myapex_compressed",
7968 ],
7969 compile_dex: true,
7970 }
7971 `)
7972
7973 module := result.Module("libfoo", "android_common_com.android.myapex")
7974 usesLibraryDep := module.(java.UsesLibraryDependency)
7975 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7976 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7977 usesLibraryDep.DexJarBuildPath().Path())
7978 })
7979
7980 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7981 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7982 image_name: "art",
7983 contents: ["libfoo"],
7984 `)+`
7985 java_sdk_library_import {
7986 name: "libfoo",
7987 public: {
7988 jars: ["libbar.jar"],
7989 },
7990 apex_available: [
7991 "com.android.myapex",
7992 "com.android.myapex_compressed",
7993 ],
7994 compile_dex: true,
7995 }
7996 `)
7997 })
7998}
7999
Jooyung Han548640b2020-04-27 12:10:30 +09008000func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8001 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8002 apex {
8003 name: "myapex",
8004 key: "myapex.key",
8005 updatable: true,
8006 }
8007
8008 apex_key {
8009 name: "myapex.key",
8010 public_key: "testkey.avbpubkey",
8011 private_key: "testkey.pem",
8012 }
8013 `)
8014}
8015
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008016func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8017 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8018 apex {
8019 name: "myapex",
8020 key: "myapex.key",
8021 }
8022
8023 apex_key {
8024 name: "myapex.key",
8025 public_key: "testkey.avbpubkey",
8026 private_key: "testkey.pem",
8027 }
8028 `)
8029}
8030
Jooyung Handfc864c2023-03-20 18:19:07 +09008031func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8032 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008033 apex {
8034 name: "myapex",
8035 key: "myapex.key",
8036 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008037 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008038 soc_specific: true,
8039 }
8040
8041 apex_key {
8042 name: "myapex.key",
8043 public_key: "testkey.avbpubkey",
8044 private_key: "testkey.pem",
8045 }
8046 `)
8047}
8048
Jooyung Han02873da2023-03-22 17:41:03 +09008049func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8050 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8051 apex {
8052 name: "myapex",
8053 key: "myapex.key",
8054 updatable: false,
8055 min_sdk_version: "29",
8056 use_vndk_as_stable: true,
8057 vendor: true,
8058 }
8059
8060 apex_key {
8061 name: "myapex.key",
8062 public_key: "testkey.avbpubkey",
8063 private_key: "testkey.pem",
8064 }
8065 `)
8066}
8067
Jooyung Handfc864c2023-03-20 18:19:07 +09008068func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8069 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8070 apex {
8071 name: "myapex",
8072 key: "myapex.key",
8073 updatable: false,
8074 use_vndk_as_stable: true,
8075 }
8076
8077 apex_key {
8078 name: "myapex.key",
8079 public_key: "testkey.avbpubkey",
8080 private_key: "testkey.pem",
8081 }
8082 `)
8083}
8084
satayevb98371c2021-06-15 16:49:50 +01008085func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8086 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8087 apex {
8088 name: "myapex",
8089 key: "myapex.key",
8090 systemserverclasspath_fragments: [
8091 "mysystemserverclasspathfragment",
8092 ],
8093 min_sdk_version: "29",
8094 updatable: true,
8095 }
8096
8097 apex_key {
8098 name: "myapex.key",
8099 public_key: "testkey.avbpubkey",
8100 private_key: "testkey.pem",
8101 }
8102
8103 java_library {
8104 name: "foo",
8105 srcs: ["b.java"],
8106 min_sdk_version: "29",
8107 installable: true,
8108 apex_available: [
8109 "myapex",
8110 ],
8111 }
8112
8113 systemserverclasspath_fragment {
8114 name: "mysystemserverclasspathfragment",
8115 generate_classpaths_proto: false,
8116 contents: [
8117 "foo",
8118 ],
8119 apex_available: [
8120 "myapex",
8121 ],
8122 }
satayevabcd5972021-08-06 17:49:46 +01008123 `,
8124 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8125 )
satayevb98371c2021-06-15 16:49:50 +01008126}
8127
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008128func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008129 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
8130 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
8131 // modules to be included in the BootJars.
8132 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
8133 return android.GroupFixturePreparers(
8134 dexpreopt.FixtureSetBootJars(bootJars...),
8135 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8136 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8137 }),
8138 )
8139 }
8140
8141 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
8142 // same value. This can result in an invalid configuration as it allows non art apex jars to be
8143 // specified in the ArtApexJars configuration.
8144 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
8145 return android.GroupFixturePreparers(
8146 dexpreopt.FixtureSetArtBootJars(bootJars...),
8147 dexpreopt.FixtureSetBootJars(bootJars...),
8148 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8149 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
8150 }),
8151 )
8152 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008153
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008154 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008155 preparer := android.GroupFixturePreparers(
8156 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
8157 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8158 )
8159 fragments := []java.ApexVariantReference{
8160 {
8161 Apex: proptools.StringPtr("com.android.art.debug"),
8162 Module: proptools.StringPtr("art-bootclasspath-fragment"),
8163 },
8164 {
8165 Apex: proptools.StringPtr("some-non-updatable-apex"),
8166 Module: proptools.StringPtr("some-non-updatable-fragment"),
8167 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008168 }
satayevabcd5972021-08-06 17:49:46 +01008169 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008170 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008171
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008172 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01008173 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
8174 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01008175 preparer := android.GroupFixturePreparers(
8176 prepareSetBootJars("com.android.art.debug:some-art-lib"),
8177 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8178 )
Paul Duffin60264a02021-04-12 20:02:36 +01008179 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008180 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008181
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008182 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 +01008183 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 +01008184 // Update the dexpreopt ArtApexJars directly.
8185 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
8186 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008187 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008188
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008189 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 +01008190 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 +01008191 // Update the dexpreopt ArtApexJars directly.
8192 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
8193 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008194 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008195
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008196 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 +01008197 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 +01008198 preparer := android.GroupFixturePreparers(
8199 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
8200 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8201 )
Paul Duffin60264a02021-04-12 20:02:36 +01008202 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008203 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008204
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008205 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 +01008206 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01008207 fragment := java.ApexVariantReference{
8208 Apex: proptools.StringPtr("some-non-updatable-apex"),
8209 Module: proptools.StringPtr("some-non-updatable-fragment"),
8210 }
8211 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008212 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008213
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008214 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008215 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008216 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8217 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008218 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008219
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008220 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008221 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008222 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8223 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008224 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008225
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008226 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008227 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008228 // Update the dexpreopt ArtApexJars directly.
8229 preparer := prepareSetArtJars("platform:some-platform-lib")
8230 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008231 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008232
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008233 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008234 preparer := android.GroupFixturePreparers(
8235 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8236 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8237 )
8238 fragments := []java.ApexVariantReference{
8239 {
8240 Apex: proptools.StringPtr("some-non-updatable-apex"),
8241 Module: proptools.StringPtr("some-non-updatable-fragment"),
8242 },
8243 }
8244 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008245 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008246}
8247
8248func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008249 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008250 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008251 fragment := java.ApexVariantReference{
8252 Apex: proptools.StringPtr("myapex"),
8253 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8254 }
8255
Paul Duffin064b70c2020-11-02 17:32:38 +00008256 testDexpreoptWithApexes(t, `
8257 prebuilt_apex {
8258 name: "myapex" ,
8259 arch: {
8260 arm64: {
8261 src: "myapex-arm64.apex",
8262 },
8263 arm: {
8264 src: "myapex-arm.apex",
8265 },
8266 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008267 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8268 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008269
Paul Duffin89f570a2021-06-16 01:42:33 +01008270 prebuilt_bootclasspath_fragment {
8271 name: "my-bootclasspath-fragment",
8272 contents: ["libfoo"],
8273 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008274 hidden_api: {
8275 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8276 metadata: "my-bootclasspath-fragment/metadata.csv",
8277 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008278 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8279 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8280 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008281 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008282 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008283
Paul Duffin89f570a2021-06-16 01:42:33 +01008284 java_import {
8285 name: "libfoo",
8286 jars: ["libfoo.jar"],
8287 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008288 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008289 }
8290 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008291 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008292}
8293
Spandan Dasf14e2542021-11-12 00:01:37 +00008294func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008295 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008296 bp += `
8297 apex_key {
8298 name: "myapex.key",
8299 public_key: "testkey.avbpubkey",
8300 private_key: "testkey.pem",
8301 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008302 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008303 "lib1/src/A.java": nil,
8304 "lib2/src/B.java": nil,
8305 "system/sepolicy/apex/myapex-file_contexts": nil,
8306 }
8307
Paul Duffin45338f02021-03-30 23:07:52 +01008308 errorHandler := android.FixtureExpectsNoErrors
8309 if errmsg != "" {
8310 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008311 }
Colin Crossae8600b2020-10-29 17:09:13 -07008312
Paul Duffin45338f02021-03-30 23:07:52 +01008313 android.GroupFixturePreparers(
8314 android.PrepareForTestWithAndroidBuildComponents,
8315 java.PrepareForTestWithJavaBuildComponents,
8316 PrepareForTestWithApexBuildComponents,
8317 android.PrepareForTestWithNeverallowRules(rules),
8318 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008319 apexBootJars := make([]string, 0, len(bootJars))
8320 for _, apexBootJar := range bootJars {
8321 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008322 }
satayevd604b212021-07-21 14:23:52 +01008323 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008324 }),
8325 fs.AddToFixture(),
8326 ).
8327 ExtendWithErrorHandler(errorHandler).
8328 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008329}
8330
8331func TestApexPermittedPackagesRules(t *testing.T) {
8332 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008333 name string
8334 expectedError string
8335 bp string
8336 bootJars []string
8337 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008338 }{
8339
8340 {
8341 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8342 expectedError: "",
8343 bp: `
8344 java_library {
8345 name: "bcp_lib1",
8346 srcs: ["lib1/src/*.java"],
8347 permitted_packages: ["foo.bar"],
8348 apex_available: ["myapex"],
8349 sdk_version: "none",
8350 system_modules: "none",
8351 }
8352 java_library {
8353 name: "nonbcp_lib2",
8354 srcs: ["lib2/src/*.java"],
8355 apex_available: ["myapex"],
8356 permitted_packages: ["a.b"],
8357 sdk_version: "none",
8358 system_modules: "none",
8359 }
8360 apex {
8361 name: "myapex",
8362 key: "myapex.key",
8363 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008364 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008365 }`,
8366 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008367 bcpPermittedPackages: map[string][]string{
8368 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008369 "foo.bar",
8370 },
8371 },
8372 },
8373 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008374 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008375 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 +01008376 bp: `
8377 java_library {
8378 name: "bcp_lib1",
8379 srcs: ["lib1/src/*.java"],
8380 apex_available: ["myapex"],
8381 permitted_packages: ["foo.bar"],
8382 sdk_version: "none",
8383 system_modules: "none",
8384 }
8385 java_library {
8386 name: "bcp_lib2",
8387 srcs: ["lib2/src/*.java"],
8388 apex_available: ["myapex"],
8389 permitted_packages: ["foo.bar", "bar.baz"],
8390 sdk_version: "none",
8391 system_modules: "none",
8392 }
8393 apex {
8394 name: "myapex",
8395 key: "myapex.key",
8396 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008397 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008398 }
8399 `,
8400 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008401 bcpPermittedPackages: map[string][]string{
8402 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008403 "foo.bar",
8404 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008405 "bcp_lib2": []string{
8406 "foo.bar",
8407 },
8408 },
8409 },
8410 {
8411 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8412 expectedError: "",
8413 bp: `
8414 java_library {
8415 name: "bcp_lib_restricted",
8416 srcs: ["lib1/src/*.java"],
8417 apex_available: ["myapex"],
8418 permitted_packages: ["foo.bar"],
8419 sdk_version: "none",
8420 min_sdk_version: "29",
8421 system_modules: "none",
8422 }
8423 java_library {
8424 name: "bcp_lib_unrestricted",
8425 srcs: ["lib2/src/*.java"],
8426 apex_available: ["myapex"],
8427 permitted_packages: ["foo.bar", "bar.baz"],
8428 sdk_version: "none",
8429 min_sdk_version: "29",
8430 system_modules: "none",
8431 }
8432 apex {
8433 name: "myapex",
8434 key: "myapex.key",
8435 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8436 updatable: true,
8437 min_sdk_version: "29",
8438 }
8439 `,
8440 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8441 bcpPermittedPackages: map[string][]string{
8442 "bcp_lib1_non_updateable": []string{
8443 "foo.bar",
8444 },
8445 // 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 +01008446 },
8447 },
8448 }
8449 for _, tc := range testcases {
8450 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008451 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8452 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008453 })
8454 }
8455}
8456
Jiyong Park62304bb2020-04-13 16:19:48 +09008457func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008458 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008459 apex {
8460 name: "myapex",
8461 key: "myapex.key",
8462 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008463 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008464 }
8465
8466 apex_key {
8467 name: "myapex.key",
8468 public_key: "testkey.avbpubkey",
8469 private_key: "testkey.pem",
8470 }
8471
8472 cc_library {
8473 name: "mylib",
8474 srcs: ["mylib.cpp"],
8475 system_shared_libs: [],
8476 stl: "none",
8477 stubs: {
8478 versions: ["1"],
8479 },
8480 apex_available: ["myapex"],
8481 }
8482
8483 cc_library {
8484 name: "myprivlib",
8485 srcs: ["mylib.cpp"],
8486 system_shared_libs: [],
8487 stl: "none",
8488 apex_available: ["myapex"],
8489 }
8490
8491
8492 cc_test {
8493 name: "mytest",
8494 gtest: false,
8495 srcs: ["mylib.cpp"],
8496 system_shared_libs: [],
8497 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008498 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008499 test_for: ["myapex"]
8500 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008501
8502 cc_library {
8503 name: "mytestlib",
8504 srcs: ["mylib.cpp"],
8505 system_shared_libs: [],
8506 shared_libs: ["mylib", "myprivlib"],
8507 stl: "none",
8508 test_for: ["myapex"],
8509 }
8510
8511 cc_benchmark {
8512 name: "mybench",
8513 srcs: ["mylib.cpp"],
8514 system_shared_libs: [],
8515 shared_libs: ["mylib", "myprivlib"],
8516 stl: "none",
8517 test_for: ["myapex"],
8518 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008519 `)
8520
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008521 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008522 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008523 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8524 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8525 }
8526
8527 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008528 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008529 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8530 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8531 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8532}
Jiyong Park46a512f2020-12-04 18:02:13 +09008533
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008534func TestIndirectTestFor(t *testing.T) {
8535 ctx := testApex(t, `
8536 apex {
8537 name: "myapex",
8538 key: "myapex.key",
8539 native_shared_libs: ["mylib", "myprivlib"],
8540 updatable: false,
8541 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008542
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008543 apex_key {
8544 name: "myapex.key",
8545 public_key: "testkey.avbpubkey",
8546 private_key: "testkey.pem",
8547 }
8548
8549 cc_library {
8550 name: "mylib",
8551 srcs: ["mylib.cpp"],
8552 system_shared_libs: [],
8553 stl: "none",
8554 stubs: {
8555 versions: ["1"],
8556 },
8557 apex_available: ["myapex"],
8558 }
8559
8560 cc_library {
8561 name: "myprivlib",
8562 srcs: ["mylib.cpp"],
8563 system_shared_libs: [],
8564 stl: "none",
8565 shared_libs: ["mylib"],
8566 apex_available: ["myapex"],
8567 }
8568
8569 cc_library {
8570 name: "mytestlib",
8571 srcs: ["mylib.cpp"],
8572 system_shared_libs: [],
8573 shared_libs: ["myprivlib"],
8574 stl: "none",
8575 test_for: ["myapex"],
8576 }
8577 `)
8578
8579 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008580 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008581 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8582 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8583 }
8584
8585 // The platform variant of mytestlib links to the platform variant of the
8586 // internal myprivlib.
8587 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8588
8589 // The platform variant of myprivlib links to the platform variant of mylib
8590 // and bypasses its stubs.
8591 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 +09008592}
8593
Martin Stjernholmec009002021-03-27 15:18:31 +00008594func TestTestForForLibInOtherApex(t *testing.T) {
8595 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8596 _ = testApex(t, `
8597 apex {
8598 name: "com.android.art",
8599 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008600 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008601 updatable: false,
8602 }
8603
8604 apex {
8605 name: "com.android.art.debug",
8606 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008607 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008608 updatable: false,
8609 }
8610
8611 apex_key {
8612 name: "myapex.key",
8613 public_key: "testkey.avbpubkey",
8614 private_key: "testkey.pem",
8615 }
8616
8617 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008618 name: "libnativebridge",
8619 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008620 system_shared_libs: [],
8621 stl: "none",
8622 stubs: {
8623 versions: ["1"],
8624 },
8625 apex_available: ["com.android.art", "com.android.art.debug"],
8626 }
8627
8628 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008629 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008630 srcs: ["mylib.cpp"],
8631 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008632 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008633 stl: "none",
8634 apex_available: ["com.android.art.debug"],
8635 test_for: ["com.android.art"],
8636 }
8637 `,
8638 android.MockFS{
8639 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8640 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8641 }.AddToFixture())
8642}
8643
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008644// TODO(jungjw): Move this to proptools
8645func intPtr(i int) *int {
8646 return &i
8647}
8648
8649func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008650 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008651 apex_set {
8652 name: "myapex",
8653 set: "myapex.apks",
8654 filename: "foo_v2.apex",
8655 overrides: ["foo"],
8656 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008657 `,
8658 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8659 variables.Platform_sdk_version = intPtr(30)
8660 }),
8661 android.FixtureModifyConfig(func(config android.Config) {
8662 config.Targets[android.Android] = []android.Target{
8663 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8664 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8665 }
8666 }),
8667 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008668
Paul Duffin24704672021-04-06 16:09:30 +01008669 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008670
8671 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008672 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008673 actual := extractedApex.Args["abis"]
8674 expected := "ARMEABI_V7A,ARM64_V8A"
8675 if actual != expected {
8676 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8677 }
8678 actual = extractedApex.Args["sdk-version"]
8679 expected = "30"
8680 if actual != expected {
8681 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8682 }
8683
Paul Duffin6717d882021-06-15 19:09:41 +01008684 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008685 a := m.Module().(*ApexSet)
8686 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008687 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008688 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8689 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8690 }
8691}
8692
Anton Hansson805e0a52022-11-25 14:06:46 +00008693func TestApexSet_NativeBridge(t *testing.T) {
8694 ctx := testApex(t, `
8695 apex_set {
8696 name: "myapex",
8697 set: "myapex.apks",
8698 filename: "foo_v2.apex",
8699 overrides: ["foo"],
8700 }
8701 `,
8702 android.FixtureModifyConfig(func(config android.Config) {
8703 config.Targets[android.Android] = []android.Target{
8704 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8705 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8706 }
8707 }),
8708 )
8709
8710 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8711
8712 // Check extract_apks tool parameters. No native bridge arch expected
8713 extractedApex := m.Output("extracted/myapex.apks")
8714 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8715}
8716
Jiyong Park7d95a512020-05-10 15:16:24 +09008717func TestNoStaticLinkingToStubsLib(t *testing.T) {
8718 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8719 apex {
8720 name: "myapex",
8721 key: "myapex.key",
8722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008723 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008724 }
8725
8726 apex_key {
8727 name: "myapex.key",
8728 public_key: "testkey.avbpubkey",
8729 private_key: "testkey.pem",
8730 }
8731
8732 cc_library {
8733 name: "mylib",
8734 srcs: ["mylib.cpp"],
8735 static_libs: ["otherlib"],
8736 system_shared_libs: [],
8737 stl: "none",
8738 apex_available: [ "myapex" ],
8739 }
8740
8741 cc_library {
8742 name: "otherlib",
8743 srcs: ["mylib.cpp"],
8744 system_shared_libs: [],
8745 stl: "none",
8746 stubs: {
8747 versions: ["1", "2", "3"],
8748 },
8749 apex_available: [ "myapex" ],
8750 }
8751 `)
8752}
8753
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008754func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008755 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008756 apex {
8757 name: "myapex",
8758 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008759 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008760 custom_sign_tool: "sign_myapex",
8761 }
8762
8763 apex_key {
8764 name: "myapex.key",
8765 public_key: "testkey.avbpubkey",
8766 private_key: "testkey.pem",
8767 }
8768 `)
8769
8770 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8771 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8772 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"`)
8773}
8774
8775func TestApexKeysTxtOverrides(t *testing.T) {
8776 ctx := testApex(t, `
8777 apex {
8778 name: "myapex",
8779 key: "myapex.key",
8780 updatable: false,
8781 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008782 }
8783
8784 apex_key {
8785 name: "myapex.key",
8786 public_key: "testkey.avbpubkey",
8787 private_key: "testkey.pem",
8788 }
8789
8790 prebuilt_apex {
8791 name: "myapex",
8792 prefer: true,
8793 arch: {
8794 arm64: {
8795 src: "myapex-arm64.apex",
8796 },
8797 arm: {
8798 src: "myapex-arm.apex",
8799 },
8800 },
8801 }
8802
8803 apex_set {
8804 name: "myapex_set",
8805 set: "myapex.apks",
8806 filename: "myapex_set.apex",
8807 overrides: ["myapex"],
8808 }
8809 `)
8810
8811 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8812 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8813 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 +09008814 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 +09008815}
8816
Jooyung Han938b5932020-06-20 12:47:47 +09008817func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008818 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008819 apex {
8820 name: "myapex",
8821 key: "myapex.key",
8822 apps: ["app"],
8823 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008824 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008825 }
8826
8827 apex_key {
8828 name: "myapex.key",
8829 public_key: "testkey.avbpubkey",
8830 private_key: "testkey.pem",
8831 }
8832
8833 android_app {
8834 name: "app",
8835 srcs: ["foo/bar/MyClass.java"],
8836 package_name: "foo",
8837 sdk_version: "none",
8838 system_modules: "none",
8839 apex_available: [ "myapex" ],
8840 }
8841 `, withFiles(map[string][]byte{
8842 "sub/Android.bp": []byte(`
8843 override_apex {
8844 name: "override_myapex",
8845 base: "myapex",
8846 apps: ["override_app"],
8847 allowed_files: ":allowed",
8848 }
8849 // Overridable "path" property should be referenced indirectly
8850 filegroup {
8851 name: "allowed",
8852 srcs: ["allowed.txt"],
8853 }
8854 override_android_app {
8855 name: "override_app",
8856 base: "app",
8857 package_name: "bar",
8858 }
8859 `),
8860 }))
8861
8862 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8863 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8864 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8865 }
8866
8867 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8868 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8869 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8870 }
8871}
8872
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008873func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008874 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008875 apex {
8876 name: "myapex",
8877 key: "myapex.key",
8878 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008879 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008880 }
8881
8882 apex_key {
8883 name: "myapex.key",
8884 public_key: "testkey.avbpubkey",
8885 private_key: "testkey.pem",
8886 }
8887
8888 cc_library {
8889 name: "mylib",
8890 srcs: ["mylib.cpp"],
8891 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008892 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008893 },
8894 apex_available: ["myapex"],
8895 }
8896
8897 cc_prebuilt_library_shared {
8898 name: "mylib",
8899 prefer: false,
8900 srcs: ["prebuilt.so"],
8901 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008902 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008903 },
8904 apex_available: ["myapex"],
8905 }
8906 `)
8907}
8908
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008909func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008910 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008911 apex {
8912 name: "myapex",
8913 key: "myapex.key",
8914 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008915 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008916 }
8917 apex_key {
8918 name: "myapex.key",
8919 public_key: "testkey.avbpubkey",
8920 private_key: "testkey.pem",
8921 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008922 `,
8923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8924 variables.CompressedApex = proptools.BoolPtr(true)
8925 }),
8926 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008927
8928 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8929 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8930
8931 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8932 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8933
8934 // Make sure output of bundle is .capex
8935 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8936 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8937
8938 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008939 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008940 var builder strings.Builder
8941 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8942 androidMk := builder.String()
8943 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8944}
8945
Martin Stjernholm2856c662020-12-02 15:03:42 +00008946func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008947 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008948 apex {
8949 name: "myapex",
8950 key: "myapex.key",
8951 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008952 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008953 }
8954
8955 apex_key {
8956 name: "myapex.key",
8957 public_key: "testkey.avbpubkey",
8958 private_key: "testkey.pem",
8959 }
8960
8961 cc_library {
8962 name: "mylib",
8963 srcs: ["mylib.cpp"],
8964 apex_available: ["myapex"],
8965 shared_libs: ["otherlib"],
8966 system_shared_libs: [],
8967 }
8968
8969 cc_library {
8970 name: "otherlib",
8971 srcs: ["mylib.cpp"],
8972 stubs: {
8973 versions: ["current"],
8974 },
8975 }
8976
8977 cc_prebuilt_library_shared {
8978 name: "otherlib",
8979 prefer: true,
8980 srcs: ["prebuilt.so"],
8981 stubs: {
8982 versions: ["current"],
8983 },
8984 }
8985 `)
8986
8987 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008988 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008989 var builder strings.Builder
8990 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8991 androidMk := builder.String()
8992
8993 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8994 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008995 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 +00008996}
8997
Jiyong Parke3867542020-12-03 17:28:25 +09008998func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008999 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009000 apex {
9001 name: "myapex",
9002 key: "myapex.key",
9003 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009004 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009005 }
9006
9007 apex_key {
9008 name: "myapex.key",
9009 public_key: "testkey.avbpubkey",
9010 private_key: "testkey.pem",
9011 }
9012
9013 cc_library {
9014 name: "mylib",
9015 srcs: ["mylib.cpp"],
9016 system_shared_libs: [],
9017 stl: "none",
9018 apex_available: ["myapex"],
9019 shared_libs: ["mylib2"],
9020 target: {
9021 apex: {
9022 exclude_shared_libs: ["mylib2"],
9023 },
9024 },
9025 }
9026
9027 cc_library {
9028 name: "mylib2",
9029 srcs: ["mylib.cpp"],
9030 system_shared_libs: [],
9031 stl: "none",
9032 }
9033 `)
9034
9035 // Check if mylib is linked to mylib2 for the non-apex target
9036 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9037 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9038
9039 // Make sure that the link doesn't occur for the apex target
9040 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9041 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9042
9043 // It shouldn't appear in the copy cmd as well.
9044 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
9045 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9046}
9047
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009048func TestPrebuiltStubLibDep(t *testing.T) {
9049 bpBase := `
9050 apex {
9051 name: "myapex",
9052 key: "myapex.key",
9053 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009054 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009055 }
9056 apex_key {
9057 name: "myapex.key",
9058 public_key: "testkey.avbpubkey",
9059 private_key: "testkey.pem",
9060 }
9061 cc_library {
9062 name: "mylib",
9063 srcs: ["mylib.cpp"],
9064 apex_available: ["myapex"],
9065 shared_libs: ["stublib"],
9066 system_shared_libs: [],
9067 }
9068 apex {
9069 name: "otherapex",
9070 enabled: %s,
9071 key: "myapex.key",
9072 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009073 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009074 }
9075 `
9076
9077 stublibSourceBp := `
9078 cc_library {
9079 name: "stublib",
9080 srcs: ["mylib.cpp"],
9081 apex_available: ["otherapex"],
9082 system_shared_libs: [],
9083 stl: "none",
9084 stubs: {
9085 versions: ["1"],
9086 },
9087 }
9088 `
9089
9090 stublibPrebuiltBp := `
9091 cc_prebuilt_library_shared {
9092 name: "stublib",
9093 srcs: ["prebuilt.so"],
9094 apex_available: ["otherapex"],
9095 stubs: {
9096 versions: ["1"],
9097 },
9098 %s
9099 }
9100 `
9101
9102 tests := []struct {
9103 name string
9104 stublibBp string
9105 usePrebuilt bool
9106 modNames []string // Modules to collect AndroidMkEntries for
9107 otherApexEnabled []string
9108 }{
9109 {
9110 name: "only_source",
9111 stublibBp: stublibSourceBp,
9112 usePrebuilt: false,
9113 modNames: []string{"stublib"},
9114 otherApexEnabled: []string{"true", "false"},
9115 },
9116 {
9117 name: "source_preferred",
9118 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9119 usePrebuilt: false,
9120 modNames: []string{"stublib", "prebuilt_stublib"},
9121 otherApexEnabled: []string{"true", "false"},
9122 },
9123 {
9124 name: "prebuilt_preferred",
9125 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9126 usePrebuilt: true,
9127 modNames: []string{"stublib", "prebuilt_stublib"},
9128 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9129 },
9130 {
9131 name: "only_prebuilt",
9132 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9133 usePrebuilt: true,
9134 modNames: []string{"stublib"},
9135 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9136 },
9137 }
9138
9139 for _, test := range tests {
9140 t.Run(test.name, func(t *testing.T) {
9141 for _, otherApexEnabled := range test.otherApexEnabled {
9142 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009143 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009144
9145 type modAndMkEntries struct {
9146 mod *cc.Module
9147 mkEntries android.AndroidMkEntries
9148 }
9149 entries := []*modAndMkEntries{}
9150
9151 // Gather shared lib modules that are installable
9152 for _, modName := range test.modNames {
9153 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9154 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9155 continue
9156 }
9157 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009158 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009159 continue
9160 }
Colin Crossaa255532020-07-03 13:18:24 -07009161 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009162 if ent.Disabled {
9163 continue
9164 }
9165 entries = append(entries, &modAndMkEntries{
9166 mod: mod,
9167 mkEntries: ent,
9168 })
9169 }
9170 }
9171 }
9172
9173 var entry *modAndMkEntries = nil
9174 for _, ent := range entries {
9175 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9176 if entry != nil {
9177 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9178 } else {
9179 entry = ent
9180 }
9181 }
9182 }
9183
9184 if entry == nil {
9185 t.Errorf("AndroidMk entry for \"stublib\" missing")
9186 } else {
9187 isPrebuilt := entry.mod.Prebuilt() != nil
9188 if isPrebuilt != test.usePrebuilt {
9189 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9190 }
9191 if !entry.mod.IsStubs() {
9192 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9193 }
9194 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9195 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9196 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009197 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009198 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009199 if !android.InList(expected, cflags) {
9200 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9201 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009202 }
9203 })
9204 }
9205 })
9206 }
9207}
9208
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009209func TestHostApexInHostOnlyBuild(t *testing.T) {
9210 testApex(t, `
9211 apex {
9212 name: "myapex",
9213 host_supported: true,
9214 key: "myapex.key",
9215 updatable: false,
9216 payload_type: "zip",
9217 }
9218 apex_key {
9219 name: "myapex.key",
9220 public_key: "testkey.avbpubkey",
9221 private_key: "testkey.pem",
9222 }
9223 `,
9224 android.FixtureModifyConfig(func(config android.Config) {
9225 // We may not have device targets in all builds, e.g. in
9226 // prebuilts/build-tools/build-prebuilts.sh
9227 config.Targets[android.Android] = []android.Target{}
9228 }))
9229}
9230
Colin Crossc33e5212021-05-25 18:16:02 -07009231func TestApexJavaCoverage(t *testing.T) {
9232 bp := `
9233 apex {
9234 name: "myapex",
9235 key: "myapex.key",
9236 java_libs: ["mylib"],
9237 bootclasspath_fragments: ["mybootclasspathfragment"],
9238 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9239 updatable: false,
9240 }
9241
9242 apex_key {
9243 name: "myapex.key",
9244 public_key: "testkey.avbpubkey",
9245 private_key: "testkey.pem",
9246 }
9247
9248 java_library {
9249 name: "mylib",
9250 srcs: ["mylib.java"],
9251 apex_available: ["myapex"],
9252 compile_dex: true,
9253 }
9254
9255 bootclasspath_fragment {
9256 name: "mybootclasspathfragment",
9257 contents: ["mybootclasspathlib"],
9258 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009259 hidden_api: {
9260 split_packages: ["*"],
9261 },
Colin Crossc33e5212021-05-25 18:16:02 -07009262 }
9263
9264 java_library {
9265 name: "mybootclasspathlib",
9266 srcs: ["mybootclasspathlib.java"],
9267 apex_available: ["myapex"],
9268 compile_dex: true,
9269 }
9270
9271 systemserverclasspath_fragment {
9272 name: "mysystemserverclasspathfragment",
9273 contents: ["mysystemserverclasspathlib"],
9274 apex_available: ["myapex"],
9275 }
9276
9277 java_library {
9278 name: "mysystemserverclasspathlib",
9279 srcs: ["mysystemserverclasspathlib.java"],
9280 apex_available: ["myapex"],
9281 compile_dex: true,
9282 }
9283 `
9284
9285 result := android.GroupFixturePreparers(
9286 PrepareForTestWithApexBuildComponents,
9287 prepareForTestWithMyapex,
9288 java.PrepareForTestWithJavaDefaultModules,
9289 android.PrepareForTestWithAndroidBuildComponents,
9290 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009291 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9292 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009293 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009294 ).RunTest(t)
9295
9296 // Make sure jacoco ran on both mylib and mybootclasspathlib
9297 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9298 t.Errorf("Failed to find jacoco rule for mylib")
9299 }
9300 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9301 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9302 }
9303 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9304 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9305 }
9306}
9307
Jiyong Park192600a2021-08-03 07:52:17 +00009308func TestProhibitStaticExecutable(t *testing.T) {
9309 testApexError(t, `executable mybin is static`, `
9310 apex {
9311 name: "myapex",
9312 key: "myapex.key",
9313 binaries: ["mybin"],
9314 min_sdk_version: "29",
9315 }
9316
9317 apex_key {
9318 name: "myapex.key",
9319 public_key: "testkey.avbpubkey",
9320 private_key: "testkey.pem",
9321 }
9322
9323 cc_binary {
9324 name: "mybin",
9325 srcs: ["mylib.cpp"],
9326 relative_install_path: "foo/bar",
9327 static_executable: true,
9328 system_shared_libs: [],
9329 stl: "none",
9330 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009331 min_sdk_version: "29",
9332 }
9333 `)
9334
9335 testApexError(t, `executable mybin.rust is static`, `
9336 apex {
9337 name: "myapex",
9338 key: "myapex.key",
9339 binaries: ["mybin.rust"],
9340 min_sdk_version: "29",
9341 }
9342
9343 apex_key {
9344 name: "myapex.key",
9345 public_key: "testkey.avbpubkey",
9346 private_key: "testkey.pem",
9347 }
9348
9349 rust_binary {
9350 name: "mybin.rust",
9351 srcs: ["foo.rs"],
9352 static_executable: true,
9353 apex_available: ["myapex"],
9354 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009355 }
9356 `)
9357}
9358
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009359func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9360 ctx := testApex(t, `
9361 apex {
9362 name: "myapex",
9363 key: "myapex.key",
9364 updatable: false,
9365 java_libs: ["foo"],
9366 }
9367
9368 apex_key {
9369 name: "myapex.key",
9370 public_key: "testkey.avbpubkey",
9371 private_key: "testkey.pem",
9372 }
9373
9374 java_library {
9375 name: "foo",
9376 srcs: ["foo.java"],
9377 apex_available: ["myapex"],
9378 installable: true,
9379 }
9380 `,
9381 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9382 )
9383
9384 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9385 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9386 var builder strings.Builder
9387 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9388 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009389 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 +00009390}
9391
9392func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9393 ctx := testApex(t, `
9394 prebuilt_apex {
9395 name: "myapex",
9396 arch: {
9397 arm64: {
9398 src: "myapex-arm64.apex",
9399 },
9400 arm: {
9401 src: "myapex-arm.apex",
9402 },
9403 },
9404 exported_java_libs: ["foo"],
9405 }
9406
9407 java_import {
9408 name: "foo",
9409 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009410 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009411 }
9412 `,
9413 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9414 )
9415
9416 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9417 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9418 mainModuleEntries := entriesList[0]
9419 android.AssertArrayString(t,
9420 "LOCAL_REQUIRED_MODULES",
9421 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9422 []string{
9423 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9424 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9425 })
9426}
9427
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009428func TestAndroidMk_RequiredModules(t *testing.T) {
9429 ctx := testApex(t, `
9430 apex {
9431 name: "myapex",
9432 key: "myapex.key",
9433 updatable: false,
9434 java_libs: ["foo"],
9435 required: ["otherapex"],
9436 }
9437
9438 apex {
9439 name: "otherapex",
9440 key: "myapex.key",
9441 updatable: false,
9442 java_libs: ["foo"],
9443 required: ["otherapex"],
9444 }
9445
9446 apex_key {
9447 name: "myapex.key",
9448 public_key: "testkey.avbpubkey",
9449 private_key: "testkey.pem",
9450 }
9451
9452 java_library {
9453 name: "foo",
9454 srcs: ["foo.java"],
9455 apex_available: ["myapex", "otherapex"],
9456 installable: true,
9457 }
9458 `)
9459
9460 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9461 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9462 var builder strings.Builder
9463 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9464 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009465 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009466}
9467
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009468func TestAndroidMk_RequiredDeps(t *testing.T) {
9469 ctx := testApex(t, `
9470 apex {
9471 name: "myapex",
9472 key: "myapex.key",
9473 updatable: false,
9474 }
9475
9476 apex_key {
9477 name: "myapex.key",
9478 public_key: "testkey.avbpubkey",
9479 private_key: "testkey.pem",
9480 }
9481 `)
9482
9483 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009484 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009485 data := android.AndroidMkDataForTest(t, ctx, bundle)
9486 var builder strings.Builder
9487 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9488 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009489 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009490
9491 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009492 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009493 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9494 var flattenedBuilder strings.Builder
9495 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9496 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009497 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009498}
9499
Jooyung Hana6d36672022-02-24 13:58:07 +09009500func TestApexOutputFileProducer(t *testing.T) {
9501 for _, tc := range []struct {
9502 name string
9503 ref string
9504 expected_data []string
9505 }{
9506 {
9507 name: "test_using_output",
9508 ref: ":myapex",
9509 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9510 },
9511 {
9512 name: "test_using_apex",
9513 ref: ":myapex{.apex}",
9514 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9515 },
9516 } {
9517 t.Run(tc.name, func(t *testing.T) {
9518 ctx := testApex(t, `
9519 apex {
9520 name: "myapex",
9521 key: "myapex.key",
9522 compressible: true,
9523 updatable: false,
9524 }
9525
9526 apex_key {
9527 name: "myapex.key",
9528 public_key: "testkey.avbpubkey",
9529 private_key: "testkey.pem",
9530 }
9531
9532 java_test {
9533 name: "`+tc.name+`",
9534 srcs: ["a.java"],
9535 data: ["`+tc.ref+`"],
9536 }
9537 `,
9538 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9539 variables.CompressedApex = proptools.BoolPtr(true)
9540 }))
9541 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9542 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9543 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9544 })
9545 }
9546}
9547
satayev758968a2021-12-06 11:42:40 +00009548func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9549 preparer := android.GroupFixturePreparers(
9550 PrepareForTestWithApexBuildComponents,
9551 prepareForTestWithMyapex,
9552 java.PrepareForTestWithJavaSdkLibraryFiles,
9553 java.PrepareForTestWithJavaDefaultModules,
9554 android.PrepareForTestWithAndroidBuildComponents,
9555 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9556 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9557 )
9558
9559 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9560 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9561 preparer.RunTestWithBp(t, `
9562 apex {
9563 name: "myapex",
9564 key: "myapex.key",
9565 bootclasspath_fragments: ["mybootclasspathfragment"],
9566 min_sdk_version: "30",
9567 updatable: false,
9568 }
9569
9570 apex_key {
9571 name: "myapex.key",
9572 public_key: "testkey.avbpubkey",
9573 private_key: "testkey.pem",
9574 }
9575
9576 bootclasspath_fragment {
9577 name: "mybootclasspathfragment",
9578 contents: ["mybootclasspathlib"],
9579 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009580 hidden_api: {
9581 split_packages: ["*"],
9582 },
satayev758968a2021-12-06 11:42:40 +00009583 }
9584
9585 java_sdk_library {
9586 name: "mybootclasspathlib",
9587 srcs: ["mybootclasspathlib.java"],
9588 apex_available: ["myapex"],
9589 compile_dex: true,
9590 unsafe_ignore_missing_latest_api: true,
9591 min_sdk_version: "31",
9592 static_libs: ["util"],
9593 }
9594
9595 java_library {
9596 name: "util",
9597 srcs: ["a.java"],
9598 apex_available: ["myapex"],
9599 min_sdk_version: "31",
9600 static_libs: ["another_util"],
9601 }
9602
9603 java_library {
9604 name: "another_util",
9605 srcs: ["a.java"],
9606 min_sdk_version: "31",
9607 apex_available: ["myapex"],
9608 }
9609 `)
9610 })
9611
9612 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9613 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9614 preparer.RunTestWithBp(t, `
9615 apex {
9616 name: "myapex",
9617 key: "myapex.key",
9618 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9619 min_sdk_version: "30",
9620 updatable: false,
9621 }
9622
9623 apex_key {
9624 name: "myapex.key",
9625 public_key: "testkey.avbpubkey",
9626 private_key: "testkey.pem",
9627 }
9628
9629 systemserverclasspath_fragment {
9630 name: "mysystemserverclasspathfragment",
9631 contents: ["mysystemserverclasspathlib"],
9632 apex_available: ["myapex"],
9633 }
9634
9635 java_sdk_library {
9636 name: "mysystemserverclasspathlib",
9637 srcs: ["mysystemserverclasspathlib.java"],
9638 apex_available: ["myapex"],
9639 compile_dex: true,
9640 min_sdk_version: "32",
9641 unsafe_ignore_missing_latest_api: true,
9642 static_libs: ["util"],
9643 }
9644
9645 java_library {
9646 name: "util",
9647 srcs: ["a.java"],
9648 apex_available: ["myapex"],
9649 min_sdk_version: "31",
9650 static_libs: ["another_util"],
9651 }
9652
9653 java_library {
9654 name: "another_util",
9655 srcs: ["a.java"],
9656 min_sdk_version: "31",
9657 apex_available: ["myapex"],
9658 }
9659 `)
9660 })
9661
9662 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9663 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9664 RunTestWithBp(t, `
9665 apex {
9666 name: "myapex",
9667 key: "myapex.key",
9668 bootclasspath_fragments: ["mybootclasspathfragment"],
9669 min_sdk_version: "30",
9670 updatable: false,
9671 }
9672
9673 apex_key {
9674 name: "myapex.key",
9675 public_key: "testkey.avbpubkey",
9676 private_key: "testkey.pem",
9677 }
9678
9679 bootclasspath_fragment {
9680 name: "mybootclasspathfragment",
9681 contents: ["mybootclasspathlib"],
9682 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009683 hidden_api: {
9684 split_packages: ["*"],
9685 },
satayev758968a2021-12-06 11:42:40 +00009686 }
9687
9688 java_sdk_library {
9689 name: "mybootclasspathlib",
9690 srcs: ["mybootclasspathlib.java"],
9691 apex_available: ["myapex"],
9692 compile_dex: true,
9693 unsafe_ignore_missing_latest_api: true,
9694 }
9695 `)
9696 })
9697
9698 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9699 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9700 RunTestWithBp(t, `
9701 apex {
9702 name: "myapex",
9703 key: "myapex.key",
9704 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9705 min_sdk_version: "30",
9706 updatable: false,
9707 }
9708
9709 apex_key {
9710 name: "myapex.key",
9711 public_key: "testkey.avbpubkey",
9712 private_key: "testkey.pem",
9713 }
9714
9715 systemserverclasspath_fragment {
9716 name: "mysystemserverclasspathfragment",
9717 contents: ["mysystemserverclasspathlib"],
9718 apex_available: ["myapex"],
9719 }
9720
9721 java_sdk_library {
9722 name: "mysystemserverclasspathlib",
9723 srcs: ["mysystemserverclasspathlib.java"],
9724 apex_available: ["myapex"],
9725 compile_dex: true,
9726 unsafe_ignore_missing_latest_api: true,
9727 }
9728 `)
9729 })
9730}
9731
Jiakai Zhang6decef92022-01-12 17:56:19 +00009732// Verifies that the APEX depends on all the Make modules in the list.
9733func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9734 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9735 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009736 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009737 }
9738}
9739
9740// Verifies that the APEX does not depend on any of the Make modules in the list.
9741func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9742 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9743 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009744 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009745 }
9746}
9747
Cole Faust1021ccd2023-02-26 21:15:25 -08009748// TODO(b/193460475): Re-enable this test
9749//func TestApexStrictUpdtabilityLint(t *testing.T) {
9750// bpTemplate := `
9751// apex {
9752// name: "myapex",
9753// key: "myapex.key",
9754// java_libs: ["myjavalib"],
9755// updatable: %v,
9756// min_sdk_version: "29",
9757// }
9758// apex_key {
9759// name: "myapex.key",
9760// }
9761// java_library {
9762// name: "myjavalib",
9763// srcs: ["MyClass.java"],
9764// apex_available: [ "myapex" ],
9765// lint: {
9766// strict_updatability_linting: %v,
9767// },
9768// sdk_version: "current",
9769// min_sdk_version: "29",
9770// }
9771// `
9772// fs := android.MockFS{
9773// "lint-baseline.xml": nil,
9774// }
9775//
9776// testCases := []struct {
9777// testCaseName string
9778// apexUpdatable bool
9779// javaStrictUpdtabilityLint bool
9780// lintFileExists bool
9781// disallowedFlagExpected bool
9782// }{
9783// {
9784// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9785// apexUpdatable: true,
9786// javaStrictUpdtabilityLint: true,
9787// lintFileExists: false,
9788// disallowedFlagExpected: false,
9789// },
9790// {
9791// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9792// apexUpdatable: false,
9793// javaStrictUpdtabilityLint: false,
9794// lintFileExists: true,
9795// disallowedFlagExpected: false,
9796// },
9797// {
9798// testCaseName: "non-updatable apex respects strict updatability of javalib",
9799// apexUpdatable: false,
9800// javaStrictUpdtabilityLint: true,
9801// lintFileExists: true,
9802// disallowedFlagExpected: true,
9803// },
9804// {
9805// testCaseName: "updatable apex sets strict updatability of javalib to true",
9806// apexUpdatable: true,
9807// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9808// lintFileExists: true,
9809// disallowedFlagExpected: true,
9810// },
9811// }
9812//
9813// for _, testCase := range testCases {
9814// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9815// fixtures := []android.FixturePreparer{}
9816// if testCase.lintFileExists {
9817// fixtures = append(fixtures, fs.AddToFixture())
9818// }
9819//
9820// result := testApex(t, bp, fixtures...)
9821// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9822// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9823// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9824//
9825// if disallowedFlagActual != testCase.disallowedFlagExpected {
9826// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9827// }
9828// }
9829//}
9830//
9831//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9832// bp := `
9833// apex {
9834// name: "myapex",
9835// key: "myapex.key",
9836// java_libs: ["myjavalib"],
9837// updatable: true,
9838// min_sdk_version: "29",
9839// }
9840// apex_key {
9841// name: "myapex.key",
9842// }
9843// java_library {
9844// name: "myjavalib",
9845// srcs: ["MyClass.java"],
9846// apex_available: [ "myapex" ],
9847// sdk_version: "current",
9848// min_sdk_version: "29",
9849// }
9850// `
9851//
9852// testCases := []struct {
9853// testCaseName string
9854// moduleDirectory string
9855// disallowedFlagExpected bool
9856// }{
9857// {
9858// testCaseName: "lintable module defined outside libcore",
9859// moduleDirectory: "",
9860// disallowedFlagExpected: true,
9861// },
9862// {
9863// testCaseName: "lintable module defined in libcore root directory",
9864// moduleDirectory: "libcore/",
9865// disallowedFlagExpected: false,
9866// },
9867// {
9868// testCaseName: "lintable module defined in libcore child directory",
9869// moduleDirectory: "libcore/childdir/",
9870// disallowedFlagExpected: true,
9871// },
9872// }
9873//
9874// for _, testCase := range testCases {
9875// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9876// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9877// result := testApex(t, "", lintFileCreator, bpFileCreator)
9878// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9879// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9880// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9881// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9882//
9883// if disallowedFlagActual != testCase.disallowedFlagExpected {
9884// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9885// }
9886// }
9887//}
9888//
9889//// checks transtive deps of an apex coming from bootclasspath_fragment
9890//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9891// bp := `
9892// apex {
9893// name: "myapex",
9894// key: "myapex.key",
9895// bootclasspath_fragments: ["mybootclasspathfragment"],
9896// updatable: true,
9897// min_sdk_version: "29",
9898// }
9899// apex_key {
9900// name: "myapex.key",
9901// }
9902// bootclasspath_fragment {
9903// name: "mybootclasspathfragment",
9904// contents: ["myjavalib"],
9905// apex_available: ["myapex"],
9906// hidden_api: {
9907// split_packages: ["*"],
9908// },
9909// }
9910// java_library {
9911// name: "myjavalib",
9912// srcs: ["MyClass.java"],
9913// apex_available: [ "myapex" ],
9914// sdk_version: "current",
9915// min_sdk_version: "29",
9916// compile_dex: true,
9917// }
9918// `
9919// fs := android.MockFS{
9920// "lint-baseline.xml": nil,
9921// }
9922//
9923// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9924// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9925// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9926// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9927// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9928// }
9929//}
Spandan Das66773252022-01-15 00:23:18 +00009930
Spandan Das42e89502022-05-06 22:12:55 +00009931// updatable apexes should propagate updatable=true to its apps
9932func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9933 bp := `
9934 apex {
9935 name: "myapex",
9936 key: "myapex.key",
9937 updatable: %v,
9938 apps: [
9939 "myapp",
9940 ],
9941 min_sdk_version: "30",
9942 }
9943 apex_key {
9944 name: "myapex.key",
9945 }
9946 android_app {
9947 name: "myapp",
9948 updatable: %v,
9949 apex_available: [
9950 "myapex",
9951 ],
9952 sdk_version: "current",
9953 min_sdk_version: "30",
9954 }
9955 `
9956 testCases := []struct {
9957 name string
9958 apex_is_updatable_bp bool
9959 app_is_updatable_bp bool
9960 app_is_updatable_expected bool
9961 }{
9962 {
9963 name: "Non-updatable apex respects updatable property of non-updatable app",
9964 apex_is_updatable_bp: false,
9965 app_is_updatable_bp: false,
9966 app_is_updatable_expected: false,
9967 },
9968 {
9969 name: "Non-updatable apex respects updatable property of updatable app",
9970 apex_is_updatable_bp: false,
9971 app_is_updatable_bp: true,
9972 app_is_updatable_expected: true,
9973 },
9974 {
9975 name: "Updatable apex respects updatable property of updatable app",
9976 apex_is_updatable_bp: true,
9977 app_is_updatable_bp: true,
9978 app_is_updatable_expected: true,
9979 },
9980 {
9981 name: "Updatable apex sets updatable=true on non-updatable app",
9982 apex_is_updatable_bp: true,
9983 app_is_updatable_bp: false,
9984 app_is_updatable_expected: true,
9985 },
9986 }
9987 for _, testCase := range testCases {
9988 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9989 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9990 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9991 }
9992}
9993
Kiyoung Kim487689e2022-07-26 09:48:22 +09009994func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9995 bp := `
9996 apex {
9997 name: "myapex",
9998 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009999 native_shared_libs: ["libbaz"],
10000 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010001 min_sdk_version: "29",
10002 }
10003 apex_key {
10004 name: "myapex.key",
10005 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010006 cc_binary {
10007 name: "binfoo",
10008 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010009 apex_available: ["myapex"],
10010 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010011 recovery_available: false,
10012 }
10013 cc_library {
10014 name: "libbar",
10015 srcs: ["libbar.cc"],
10016 stubs: {
10017 symbol_file: "libbar.map.txt",
10018 versions: [
10019 "29",
10020 ],
10021 },
10022 }
10023 cc_library {
10024 name: "libbaz",
10025 srcs: ["libbaz.cc"],
10026 apex_available: ["myapex"],
10027 min_sdk_version: "29",
10028 stubs: {
10029 symbol_file: "libbaz.map.txt",
10030 versions: [
10031 "29",
10032 ],
10033 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010034 }
10035 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010036 name: "libbar",
10037 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010038 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010039 variants: ["apex.29"],
10040 }
10041 cc_api_variant {
10042 name: "libbar",
10043 variant: "apex",
10044 version: "29",
10045 src: "libbar_apex_29.so",
10046 }
10047 cc_api_library {
10048 name: "libbaz",
10049 src: "libbaz_stub.so",
10050 min_sdk_version: "29",
10051 variants: ["apex.29"],
10052 }
10053 cc_api_variant {
10054 name: "libbaz",
10055 variant: "apex",
10056 version: "29",
10057 src: "libbaz_apex_29.so",
10058 }
10059 cc_api_library {
10060 name: "libqux",
10061 src: "libqux_stub.so",
10062 min_sdk_version: "29",
10063 variants: ["apex.29"],
10064 }
10065 cc_api_variant {
10066 name: "libqux",
10067 variant: "apex",
10068 version: "29",
10069 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010070 }
10071 api_imports {
10072 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010073 apex_shared_libs: [
10074 "libbar",
10075 "libbaz",
10076 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010077 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010078 }
10079 `
10080 result := testApex(t, bp)
10081
10082 hasDep := func(m android.Module, wantDep android.Module) bool {
10083 t.Helper()
10084 var found bool
10085 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10086 if dep == wantDep {
10087 found = true
10088 }
10089 })
10090 return found
10091 }
10092
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010093 // Library defines stubs and cc_api_library should be used with cc_api_library
10094 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10095 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10096 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010097
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010098 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10099 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010100
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010101 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10102 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10103 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10104 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10105
10106 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10107 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10108 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10109 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10110 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10111
10112 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10113 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10114 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10115
10116 // cc_api_library defined without original library should be linked with cc_api_library
10117 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10118 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10119 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10120}
10121
10122func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10123 bp := `
10124 apex {
10125 name: "myapex",
10126 key: "myapex.key",
10127 native_shared_libs: ["libbar"],
10128 min_sdk_version: "29",
10129 }
10130 apex_key {
10131 name: "myapex.key",
10132 }
10133 cc_binary {
10134 name: "binfoo",
10135 shared_libs: ["libbar"],
10136 recovery_available: false,
10137 }
10138 cc_library {
10139 name: "libbar",
10140 srcs: ["libbar.cc"],
10141 apex_available: ["myapex"],
10142 min_sdk_version: "29",
10143 stubs: {
10144 symbol_file: "libbar.map.txt",
10145 versions: [
10146 "29",
10147 ],
10148 },
10149 }
10150 cc_api_library {
10151 name: "libbar",
10152 src: "libbar_stub.so",
10153 variants: ["apex.29"],
10154 }
10155 cc_api_variant {
10156 name: "libbar",
10157 variant: "apex",
10158 version: "29",
10159 src: "libbar_apex_29.so",
10160 }
10161 api_imports {
10162 name: "api_imports",
10163 apex_shared_libs: [
10164 "libbar",
10165 ],
10166 }
10167 `
10168
10169 result := testApex(t, bp)
10170
10171 hasDep := func(m android.Module, wantDep android.Module) bool {
10172 t.Helper()
10173 var found bool
10174 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10175 if dep == wantDep {
10176 found = true
10177 }
10178 })
10179 return found
10180 }
10181
10182 // Library defines stubs and cc_api_library should be used with cc_api_library
10183 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10184 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10185 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10186
10187 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10188 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10189
10190 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10191 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10192 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10193 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010194}
Dennis Shend4f5d932023-01-31 20:27:21 +000010195
10196func TestTrimmedApex(t *testing.T) {
10197 bp := `
10198 apex {
10199 name: "myapex",
10200 key: "myapex.key",
10201 native_shared_libs: ["libfoo","libbaz"],
10202 min_sdk_version: "29",
10203 trim_against: "mydcla",
10204 }
10205 apex {
10206 name: "mydcla",
10207 key: "myapex.key",
10208 native_shared_libs: ["libfoo","libbar"],
10209 min_sdk_version: "29",
10210 file_contexts: ":myapex-file_contexts",
10211 dynamic_common_lib_apex: true,
10212 }
10213 apex_key {
10214 name: "myapex.key",
10215 }
10216 cc_library {
10217 name: "libfoo",
10218 shared_libs: ["libc"],
10219 apex_available: ["myapex","mydcla"],
10220 min_sdk_version: "29",
10221 }
10222 cc_library {
10223 name: "libbar",
10224 shared_libs: ["libc"],
10225 apex_available: ["myapex","mydcla"],
10226 min_sdk_version: "29",
10227 }
10228 cc_library {
10229 name: "libbaz",
10230 shared_libs: ["libc"],
10231 apex_available: ["myapex","mydcla"],
10232 min_sdk_version: "29",
10233 }
10234 cc_api_library {
10235 name: "libc",
10236 src: "libc.so",
10237 min_sdk_version: "29",
10238 recovery_available: true,
10239 }
10240 api_imports {
10241 name: "api_imports",
10242 shared_libs: [
10243 "libc",
10244 ],
10245 header_libs: [],
10246 }
10247 `
10248 ctx := testApex(t, bp)
10249 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10250 apexRule := module.MaybeRule("apexRule")
10251 if apexRule.Rule == nil {
10252 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10253 }
10254
10255 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10256 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10257 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10258 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10259 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10260 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10261}
Jingwen Chendea7a642023-03-28 11:30:50 +000010262
10263func TestCannedFsConfig(t *testing.T) {
10264 ctx := testApex(t, `
10265 apex {
10266 name: "myapex",
10267 key: "myapex.key",
10268 updatable: false,
10269 }
10270
10271 apex_key {
10272 name: "myapex.key",
10273 public_key: "testkey.avbpubkey",
10274 private_key: "testkey.pem",
10275 }`)
10276 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10277 generateFsRule := mod.Rule("generateFsConfig")
10278 cmd := generateFsRule.RuleParams.Command
10279
10280 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10281}
10282
10283func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10284 ctx := testApex(t, `
10285 apex {
10286 name: "myapex",
10287 key: "myapex.key",
10288 canned_fs_config: "my_config",
10289 updatable: false,
10290 }
10291
10292 apex_key {
10293 name: "myapex.key",
10294 public_key: "testkey.avbpubkey",
10295 private_key: "testkey.pem",
10296 }`)
10297 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10298 generateFsRule := mod.Rule("generateFsConfig")
10299 cmd := generateFsRule.RuleParams.Command
10300
10301 // Ensure that canned_fs_config has "cat my_config" at the end
10302 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10303}
Spandan Das20fce2d2023-04-12 17:21:39 +000010304
10305func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10306 testCases := []struct {
10307 desc string
10308 hasStubs bool
10309 apexAvailable string
10310 expectedError string
10311 }{
10312 {
10313 desc: "non-stub library can have multiple apex_available",
10314 hasStubs: false,
10315 apexAvailable: `["myapex", "otherapex"]`,
10316 },
10317 {
10318 desc: "stub library should not be available to anyapex",
10319 hasStubs: true,
10320 apexAvailable: `["//apex_available:anyapex"]`,
10321 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10322 },
10323 {
10324 desc: "stub library should not be available to multiple apexes",
10325 hasStubs: true,
10326 apexAvailable: `["myapex", "otherapex"]`,
10327 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10328 },
10329 {
10330 desc: "stub library can be available to a core apex and a test apex",
10331 hasStubs: true,
10332 apexAvailable: `["myapex", "test_myapex"]`,
10333 },
10334 }
10335 bpTemplate := `
10336 cc_library {
10337 name: "libfoo",
10338 %v
10339 apex_available: %v,
10340 }
10341 apex {
10342 name: "myapex",
10343 key: "apex.key",
10344 updatable: false,
10345 native_shared_libs: ["libfoo"],
10346 }
10347 apex {
10348 name: "otherapex",
10349 key: "apex.key",
10350 updatable: false,
10351 }
10352 apex_test {
10353 name: "test_myapex",
10354 key: "apex.key",
10355 updatable: false,
10356 native_shared_libs: ["libfoo"],
10357 }
10358 apex_key {
10359 name: "apex.key",
10360 }
10361 `
10362 for _, tc := range testCases {
10363 stubs := ""
10364 if tc.hasStubs {
10365 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10366 }
10367 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10368 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10369 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10370 })
10371 if tc.expectedError == "" {
10372 testApex(t, bp, mockFsFixturePreparer)
10373 } else {
10374 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10375 }
10376 }
10377}