blob: 707cc632a887fe58f579c5931904ed406eeb874f [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
1004 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
1005 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")
Jiyong Parkd4a00632022-04-12 12:23:20 +09001080 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").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
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1931 ctx := testApex(t, `
1932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["mylib"],
1936 updatable: false,
1937 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",
1949 vendor_available: true,
1950 system_shared_libs: [],
1951 stl: "none",
1952 apex_available: [ "myapex" ],
1953 min_sdk_version: "29",
1954 }
1955 `)
1956
1957 vendorVariant := "android_vendor.29_arm64_armv8-a"
1958
1959 // First check that the correct variant of crtbegin_so is used.
1960 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1961 crtBegin := names(ldRule.Args["crtBegin"])
1962 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1963
1964 // Ensure that the crtbegin_so used by the APEX is targeting 29
1965 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1966 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1967}
1968
Jooyung Han03b51852020-02-26 22:45:42 +09001969func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001970 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001971 apex {
1972 name: "myapex",
1973 key: "myapex.key",
1974 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001975 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001976 }
1977
1978 apex_key {
1979 name: "myapex.key",
1980 public_key: "testkey.avbpubkey",
1981 private_key: "testkey.pem",
1982 }
1983
1984 cc_library {
1985 name: "libx",
1986 system_shared_libs: [],
1987 stl: "none",
1988 apex_available: [ "myapex" ],
1989 stubs: {
1990 versions: ["1", "2"],
1991 },
1992 }
1993
1994 cc_library {
1995 name: "libz",
1996 shared_libs: ["libx"],
1997 system_shared_libs: [],
1998 stl: "none",
1999 }
2000 `)
2001
2002 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002003 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002004 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2005 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2006 }
2007 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002008 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002009 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2010 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2011 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002012 expectLink("libz", "shared", "libx", "shared_current")
2013 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002014 expectNoLink("libz", "shared", "libz", "shared_1")
2015 expectNoLink("libz", "shared", "libz", "shared")
2016}
2017
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002018var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2019 func(variables android.FixtureProductVariables) {
2020 variables.SanitizeDevice = []string{"hwaddress"}
2021 },
2022)
2023
Jooyung Han75568392020-03-20 04:29:24 +09002024func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002025 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002026 apex {
2027 name: "myapex",
2028 key: "myapex.key",
2029 native_shared_libs: ["libx"],
2030 min_sdk_version: "29",
2031 }
2032
2033 apex_key {
2034 name: "myapex.key",
2035 public_key: "testkey.avbpubkey",
2036 private_key: "testkey.pem",
2037 }
2038
2039 cc_library {
2040 name: "libx",
2041 shared_libs: ["libbar"],
2042 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002043 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002044 }
2045
2046 cc_library {
2047 name: "libbar",
2048 stubs: {
2049 versions: ["29", "30"],
2050 },
2051 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002052 `,
2053 prepareForTestWithSantitizeHwaddress,
2054 )
Jooyung Han03b51852020-02-26 22:45:42 +09002055 expectLink := func(from, from_variant, to, to_variant string) {
2056 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2057 libFlags := ld.Args["libFlags"]
2058 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2059 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002060 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002061}
2062
Jooyung Han75568392020-03-20 04:29:24 +09002063func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002064 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002065 apex {
2066 name: "myapex",
2067 key: "myapex.key",
2068 native_shared_libs: ["libx"],
2069 min_sdk_version: "29",
2070 }
2071
2072 apex_key {
2073 name: "myapex.key",
2074 public_key: "testkey.avbpubkey",
2075 private_key: "testkey.pem",
2076 }
2077
2078 cc_library {
2079 name: "libx",
2080 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002081 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002082 }
Jooyung Han75568392020-03-20 04:29:24 +09002083 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002084
2085 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002086 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002087 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002088 // note that platform variant is not.
2089 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002090 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002091}
2092
Jooyung Han749dc692020-04-15 11:03:39 +09002093func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2094 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002095 apex {
2096 name: "myapex",
2097 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002098 native_shared_libs: ["mylib"],
2099 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002100 }
2101
2102 apex_key {
2103 name: "myapex.key",
2104 public_key: "testkey.avbpubkey",
2105 private_key: "testkey.pem",
2106 }
Jooyung Han749dc692020-04-15 11:03:39 +09002107
2108 cc_library {
2109 name: "mylib",
2110 srcs: ["mylib.cpp"],
2111 system_shared_libs: [],
2112 stl: "none",
2113 apex_available: [
2114 "myapex",
2115 ],
2116 min_sdk_version: "30",
2117 }
2118 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002119
2120 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2121 apex {
2122 name: "myapex",
2123 key: "myapex.key",
2124 native_shared_libs: ["libfoo.ffi"],
2125 min_sdk_version: "29",
2126 }
2127
2128 apex_key {
2129 name: "myapex.key",
2130 public_key: "testkey.avbpubkey",
2131 private_key: "testkey.pem",
2132 }
2133
2134 rust_ffi_shared {
2135 name: "libfoo.ffi",
2136 srcs: ["foo.rs"],
2137 crate_name: "foo",
2138 apex_available: [
2139 "myapex",
2140 ],
2141 min_sdk_version: "30",
2142 }
2143 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002144
2145 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2146 apex {
2147 name: "myapex",
2148 key: "myapex.key",
2149 java_libs: ["libfoo"],
2150 min_sdk_version: "29",
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 java_import {
2160 name: "libfoo",
2161 jars: ["libfoo.jar"],
2162 apex_available: [
2163 "myapex",
2164 ],
2165 min_sdk_version: "30",
2166 }
2167 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002168
2169 // Skip check for modules compiling against core API surface
2170 testApex(t, `
2171 apex {
2172 name: "myapex",
2173 key: "myapex.key",
2174 java_libs: ["libfoo"],
2175 min_sdk_version: "29",
2176 }
2177
2178 apex_key {
2179 name: "myapex.key",
2180 public_key: "testkey.avbpubkey",
2181 private_key: "testkey.pem",
2182 }
2183
2184 java_library {
2185 name: "libfoo",
2186 srcs: ["Foo.java"],
2187 apex_available: [
2188 "myapex",
2189 ],
2190 // Compile against core API surface
2191 sdk_version: "core_current",
2192 min_sdk_version: "30",
2193 }
2194 `)
2195
Jooyung Han749dc692020-04-15 11:03:39 +09002196}
2197
2198func TestApexMinSdkVersion_Okay(t *testing.T) {
2199 testApex(t, `
2200 apex {
2201 name: "myapex",
2202 key: "myapex.key",
2203 native_shared_libs: ["libfoo"],
2204 java_libs: ["libbar"],
2205 min_sdk_version: "29",
2206 }
2207
2208 apex_key {
2209 name: "myapex.key",
2210 public_key: "testkey.avbpubkey",
2211 private_key: "testkey.pem",
2212 }
2213
2214 cc_library {
2215 name: "libfoo",
2216 srcs: ["mylib.cpp"],
2217 shared_libs: ["libfoo_dep"],
2218 apex_available: ["myapex"],
2219 min_sdk_version: "29",
2220 }
2221
2222 cc_library {
2223 name: "libfoo_dep",
2224 srcs: ["mylib.cpp"],
2225 apex_available: ["myapex"],
2226 min_sdk_version: "29",
2227 }
2228
2229 java_library {
2230 name: "libbar",
2231 sdk_version: "current",
2232 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002233 static_libs: [
2234 "libbar_dep",
2235 "libbar_import_dep",
2236 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002237 apex_available: ["myapex"],
2238 min_sdk_version: "29",
2239 }
2240
2241 java_library {
2242 name: "libbar_dep",
2243 sdk_version: "current",
2244 srcs: ["a.java"],
2245 apex_available: ["myapex"],
2246 min_sdk_version: "29",
2247 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002248
2249 java_import {
2250 name: "libbar_import_dep",
2251 jars: ["libbar.jar"],
2252 apex_available: ["myapex"],
2253 min_sdk_version: "29",
2254 }
Jooyung Han03b51852020-02-26 22:45:42 +09002255 `)
2256}
2257
Colin Cross8ca61c12022-10-06 21:00:14 -07002258func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2259 // Tests that an apex dependency with min_sdk_version higher than the
2260 // min_sdk_version of the apex is allowed as long as the dependency's
2261 // min_sdk_version is less than or equal to the api level that the
2262 // architecture was introduced in. In this case, arm64 didn't exist
2263 // until api level 21, so the arm64 code will never need to run on
2264 // an api level 20 device, even if other architectures of the apex
2265 // will.
2266 testApex(t, `
2267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 native_shared_libs: ["libfoo"],
2271 min_sdk_version: "20",
2272 }
2273
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279
2280 cc_library {
2281 name: "libfoo",
2282 srcs: ["mylib.cpp"],
2283 apex_available: ["myapex"],
2284 min_sdk_version: "21",
2285 stl: "none",
2286 }
2287 `)
2288}
2289
Artur Satayev8cf899a2020-04-15 17:29:42 +01002290func TestJavaStableSdkVersion(t *testing.T) {
2291 testCases := []struct {
2292 name string
2293 expectedError string
2294 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002295 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002296 }{
2297 {
2298 name: "Non-updatable apex with non-stable dep",
2299 bp: `
2300 apex {
2301 name: "myapex",
2302 java_libs: ["myjar"],
2303 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002304 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002305 }
2306 apex_key {
2307 name: "myapex.key",
2308 public_key: "testkey.avbpubkey",
2309 private_key: "testkey.pem",
2310 }
2311 java_library {
2312 name: "myjar",
2313 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002314 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002315 apex_available: ["myapex"],
2316 }
2317 `,
2318 },
2319 {
2320 name: "Updatable apex with stable dep",
2321 bp: `
2322 apex {
2323 name: "myapex",
2324 java_libs: ["myjar"],
2325 key: "myapex.key",
2326 updatable: true,
2327 min_sdk_version: "29",
2328 }
2329 apex_key {
2330 name: "myapex.key",
2331 public_key: "testkey.avbpubkey",
2332 private_key: "testkey.pem",
2333 }
2334 java_library {
2335 name: "myjar",
2336 srcs: ["foo/bar/MyClass.java"],
2337 sdk_version: "current",
2338 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002339 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002340 }
2341 `,
2342 },
2343 {
2344 name: "Updatable apex with non-stable dep",
2345 expectedError: "cannot depend on \"myjar\"",
2346 bp: `
2347 apex {
2348 name: "myapex",
2349 java_libs: ["myjar"],
2350 key: "myapex.key",
2351 updatable: true,
2352 }
2353 apex_key {
2354 name: "myapex.key",
2355 public_key: "testkey.avbpubkey",
2356 private_key: "testkey.pem",
2357 }
2358 java_library {
2359 name: "myjar",
2360 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002361 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002362 apex_available: ["myapex"],
2363 }
2364 `,
2365 },
2366 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002367 name: "Updatable apex with non-stable legacy core platform dep",
2368 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2369 bp: `
2370 apex {
2371 name: "myapex",
2372 java_libs: ["myjar-uses-legacy"],
2373 key: "myapex.key",
2374 updatable: true,
2375 }
2376 apex_key {
2377 name: "myapex.key",
2378 public_key: "testkey.avbpubkey",
2379 private_key: "testkey.pem",
2380 }
2381 java_library {
2382 name: "myjar-uses-legacy",
2383 srcs: ["foo/bar/MyClass.java"],
2384 sdk_version: "core_platform",
2385 apex_available: ["myapex"],
2386 }
2387 `,
2388 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2389 },
2390 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002391 name: "Updatable apex with non-stable transitive dep",
2392 // This is not actually detecting that the transitive dependency is unstable, rather it is
2393 // detecting that the transitive dependency is building against a wider API surface than the
2394 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002395 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002396 bp: `
2397 apex {
2398 name: "myapex",
2399 java_libs: ["myjar"],
2400 key: "myapex.key",
2401 updatable: true,
2402 }
2403 apex_key {
2404 name: "myapex.key",
2405 public_key: "testkey.avbpubkey",
2406 private_key: "testkey.pem",
2407 }
2408 java_library {
2409 name: "myjar",
2410 srcs: ["foo/bar/MyClass.java"],
2411 sdk_version: "current",
2412 apex_available: ["myapex"],
2413 static_libs: ["transitive-jar"],
2414 }
2415 java_library {
2416 name: "transitive-jar",
2417 srcs: ["foo/bar/MyClass.java"],
2418 sdk_version: "core_platform",
2419 apex_available: ["myapex"],
2420 }
2421 `,
2422 },
2423 }
2424
2425 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002426 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2427 continue
2428 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002429 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002430 errorHandler := android.FixtureExpectsNoErrors
2431 if test.expectedError != "" {
2432 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002433 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002434 android.GroupFixturePreparers(
2435 java.PrepareForTestWithJavaDefaultModules,
2436 PrepareForTestWithApexBuildComponents,
2437 prepareForTestWithMyapex,
2438 android.OptionalFixturePreparer(test.preparer),
2439 ).
2440 ExtendWithErrorHandler(errorHandler).
2441 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002442 })
2443 }
2444}
2445
Jooyung Han749dc692020-04-15 11:03:39 +09002446func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2447 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2448 apex {
2449 name: "myapex",
2450 key: "myapex.key",
2451 native_shared_libs: ["mylib"],
2452 min_sdk_version: "29",
2453 }
2454
2455 apex_key {
2456 name: "myapex.key",
2457 public_key: "testkey.avbpubkey",
2458 private_key: "testkey.pem",
2459 }
2460
2461 cc_library {
2462 name: "mylib",
2463 srcs: ["mylib.cpp"],
2464 shared_libs: ["mylib2"],
2465 system_shared_libs: [],
2466 stl: "none",
2467 apex_available: [
2468 "myapex",
2469 ],
2470 min_sdk_version: "29",
2471 }
2472
2473 // indirect part of the apex
2474 cc_library {
2475 name: "mylib2",
2476 srcs: ["mylib.cpp"],
2477 system_shared_libs: [],
2478 stl: "none",
2479 apex_available: [
2480 "myapex",
2481 ],
2482 min_sdk_version: "30",
2483 }
2484 `)
2485}
2486
2487func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2488 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2489 apex {
2490 name: "myapex",
2491 key: "myapex.key",
2492 apps: ["AppFoo"],
2493 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002494 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002495 }
2496
2497 apex_key {
2498 name: "myapex.key",
2499 public_key: "testkey.avbpubkey",
2500 private_key: "testkey.pem",
2501 }
2502
2503 android_app {
2504 name: "AppFoo",
2505 srcs: ["foo/bar/MyClass.java"],
2506 sdk_version: "current",
2507 min_sdk_version: "29",
2508 system_modules: "none",
2509 stl: "none",
2510 static_libs: ["bar"],
2511 apex_available: [ "myapex" ],
2512 }
2513
2514 java_library {
2515 name: "bar",
2516 sdk_version: "current",
2517 srcs: ["a.java"],
2518 apex_available: [ "myapex" ],
2519 }
2520 `)
2521}
2522
2523func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002524 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["mylib"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002538 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002539 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2540 cc_library {
2541 name: "mylib",
2542 srcs: ["mylib.cpp"],
2543 shared_libs: ["mylib2"],
2544 system_shared_libs: [],
2545 stl: "none",
2546 apex_available: ["myapex", "otherapex"],
2547 min_sdk_version: "29",
2548 }
2549
2550 cc_library {
2551 name: "mylib2",
2552 srcs: ["mylib.cpp"],
2553 system_shared_libs: [],
2554 stl: "none",
2555 apex_available: ["otherapex"],
2556 stubs: { versions: ["29", "30"] },
2557 min_sdk_version: "30",
2558 }
2559
2560 apex {
2561 name: "otherapex",
2562 key: "myapex.key",
2563 native_shared_libs: ["mylib", "mylib2"],
2564 min_sdk_version: "30",
2565 }
2566 `)
2567 expectLink := func(from, from_variant, to, to_variant string) {
2568 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2569 libFlags := ld.Args["libFlags"]
2570 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2571 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002572 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002573 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002574}
2575
Jooyung Haned124c32021-01-26 11:43:46 +09002576func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002577 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2578 func(variables android.FixtureProductVariables) {
2579 variables.Platform_sdk_codename = proptools.StringPtr("S")
2580 variables.Platform_version_active_codenames = []string{"S"}
2581 },
2582 )
Jooyung Haned124c32021-01-26 11:43:46 +09002583 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2584 apex {
2585 name: "myapex",
2586 key: "myapex.key",
2587 native_shared_libs: ["libfoo"],
2588 min_sdk_version: "S",
2589 }
2590 apex_key {
2591 name: "myapex.key",
2592 public_key: "testkey.avbpubkey",
2593 private_key: "testkey.pem",
2594 }
2595 cc_library {
2596 name: "libfoo",
2597 shared_libs: ["libbar"],
2598 apex_available: ["myapex"],
2599 min_sdk_version: "29",
2600 }
2601 cc_library {
2602 name: "libbar",
2603 apex_available: ["myapex"],
2604 }
2605 `, withSAsActiveCodeNames)
2606}
2607
2608func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002609 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2610 variables.Platform_sdk_codename = proptools.StringPtr("S")
2611 variables.Platform_version_active_codenames = []string{"S", "T"}
2612 })
Colin Cross1c460562021-02-16 17:55:47 -08002613 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002614 apex {
2615 name: "myapex",
2616 key: "myapex.key",
2617 native_shared_libs: ["libfoo"],
2618 min_sdk_version: "S",
2619 }
2620 apex_key {
2621 name: "myapex.key",
2622 public_key: "testkey.avbpubkey",
2623 private_key: "testkey.pem",
2624 }
2625 cc_library {
2626 name: "libfoo",
2627 shared_libs: ["libbar"],
2628 apex_available: ["myapex"],
2629 min_sdk_version: "S",
2630 }
2631 cc_library {
2632 name: "libbar",
2633 stubs: {
2634 symbol_file: "libbar.map.txt",
2635 versions: ["30", "S", "T"],
2636 },
2637 }
2638 `, withSAsActiveCodeNames)
2639
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002640 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002641 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2642 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002643 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002644}
2645
Jiyong Park7c2ee712018-12-07 00:42:25 +09002646func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002647 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002648 apex {
2649 name: "myapex",
2650 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002651 native_shared_libs: ["mylib"],
2652 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002653 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002654 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002655 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002656 }
2657
2658 apex_key {
2659 name: "myapex.key",
2660 public_key: "testkey.avbpubkey",
2661 private_key: "testkey.pem",
2662 }
2663
2664 prebuilt_etc {
2665 name: "myetc",
2666 src: "myprebuilt",
2667 sub_dir: "foo/bar",
2668 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002669
2670 cc_library {
2671 name: "mylib",
2672 srcs: ["mylib.cpp"],
2673 relative_install_path: "foo/bar",
2674 system_shared_libs: [],
2675 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002676 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002677 }
2678
2679 cc_binary {
2680 name: "mybin",
2681 srcs: ["mylib.cpp"],
2682 relative_install_path: "foo/bar",
2683 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002684 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002685 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002686 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002687 `)
2688
Sundong Ahnabb64432019-10-22 13:58:29 +09002689 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002690 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002691
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002692 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002693 ensureContains(t, cmd, "/etc ")
2694 ensureContains(t, cmd, "/etc/foo ")
2695 ensureContains(t, cmd, "/etc/foo/bar ")
2696 ensureContains(t, cmd, "/lib64 ")
2697 ensureContains(t, cmd, "/lib64/foo ")
2698 ensureContains(t, cmd, "/lib64/foo/bar ")
2699 ensureContains(t, cmd, "/lib ")
2700 ensureContains(t, cmd, "/lib/foo ")
2701 ensureContains(t, cmd, "/lib/foo/bar ")
2702 ensureContains(t, cmd, "/bin ")
2703 ensureContains(t, cmd, "/bin/foo ")
2704 ensureContains(t, cmd, "/bin/foo/bar ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002705}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002706
Jooyung Han35155c42020-02-06 17:33:20 +09002707func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002708 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002709 apex {
2710 name: "myapex",
2711 key: "myapex.key",
2712 multilib: {
2713 both: {
2714 native_shared_libs: ["mylib"],
2715 binaries: ["mybin"],
2716 },
2717 },
2718 compile_multilib: "both",
2719 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002720 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002721 }
2722
2723 apex_key {
2724 name: "myapex.key",
2725 public_key: "testkey.avbpubkey",
2726 private_key: "testkey.pem",
2727 }
2728
2729 cc_library {
2730 name: "mylib",
2731 relative_install_path: "foo/bar",
2732 system_shared_libs: [],
2733 stl: "none",
2734 apex_available: [ "myapex" ],
2735 native_bridge_supported: true,
2736 }
2737
2738 cc_binary {
2739 name: "mybin",
2740 relative_install_path: "foo/bar",
2741 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002742 stl: "none",
2743 apex_available: [ "myapex" ],
2744 native_bridge_supported: true,
2745 compile_multilib: "both", // default is "first" for binary
2746 multilib: {
2747 lib64: {
2748 suffix: "64",
2749 },
2750 },
2751 }
2752 `, withNativeBridgeEnabled)
2753 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2754 "bin/foo/bar/mybin",
2755 "bin/foo/bar/mybin64",
2756 "bin/arm/foo/bar/mybin",
2757 "bin/arm64/foo/bar/mybin64",
2758 "lib/foo/bar/mylib.so",
2759 "lib/arm/foo/bar/mylib.so",
2760 "lib64/foo/bar/mylib.so",
2761 "lib64/arm64/foo/bar/mylib.so",
2762 })
2763}
2764
Jooyung Han85d61762020-06-24 23:50:26 +09002765func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002766 result := android.GroupFixturePreparers(
2767 prepareForApexTest,
2768 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2769 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002770 apex {
2771 name: "myapex",
2772 key: "myapex.key",
2773 binaries: ["mybin"],
2774 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002775 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002776 }
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782 cc_binary {
2783 name: "mybin",
2784 vendor: true,
2785 shared_libs: ["libfoo"],
2786 }
2787 cc_library {
2788 name: "libfoo",
2789 proprietary: true,
2790 }
2791 `)
2792
Colin Crossc68db4b2021-11-11 18:59:15 -08002793 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002794 "bin/mybin",
2795 "lib64/libfoo.so",
2796 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2797 "lib64/libc++.so",
2798 })
2799
Colin Crossc68db4b2021-11-11 18:59:15 -08002800 apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
2801 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002802 name := apexBundle.BaseModuleName()
2803 prefix := "TARGET_"
2804 var builder strings.Builder
2805 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002806 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002807 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002808 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002809
Colin Crossc68db4b2021-11-11 18:59:15 -08002810 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002811 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2812 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002813}
2814
Jooyung Hanc5a96762022-02-04 11:54:50 +09002815func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2816 testApexError(t, `Trying to include a VNDK library`, `
2817 apex {
2818 name: "myapex",
2819 key: "myapex.key",
2820 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2821 vendor: true,
2822 use_vndk_as_stable: true,
2823 updatable: false,
2824 }
2825 apex_key {
2826 name: "myapex.key",
2827 public_key: "testkey.avbpubkey",
2828 private_key: "testkey.pem",
2829 }`)
2830}
2831
Jooyung Handf78e212020-07-22 15:54:47 +09002832func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002833 // myapex myapex2
2834 // | |
2835 // mybin ------. mybin2
2836 // \ \ / |
2837 // (stable) .---\--------` |
2838 // \ / \ |
2839 // \ / \ /
2840 // libvndk libvendor
2841 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002842 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
2846 binaries: ["mybin"],
2847 vendor: true,
2848 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002849 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002850 }
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856 cc_binary {
2857 name: "mybin",
2858 vendor: true,
2859 shared_libs: ["libvndk", "libvendor"],
2860 }
2861 cc_library {
2862 name: "libvndk",
2863 vndk: {
2864 enabled: true,
2865 },
2866 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002867 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002868 }
2869 cc_library {
2870 name: "libvendor",
2871 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002872 stl: "none",
2873 }
2874 apex {
2875 name: "myapex2",
2876 key: "myapex.key",
2877 binaries: ["mybin2"],
2878 vendor: true,
2879 use_vndk_as_stable: false,
2880 updatable: false,
2881 }
2882 cc_binary {
2883 name: "mybin2",
2884 vendor: true,
2885 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002886 }
2887 `)
2888
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002889 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002890
Jooyung Han91f92032022-02-04 12:36:33 +09002891 for _, tc := range []struct {
2892 name string
2893 apexName string
2894 moduleName string
2895 moduleVariant string
2896 libs []string
2897 contents []string
2898 requireVndkNamespace bool
2899 }{
2900 {
2901 name: "use_vndk_as_stable",
2902 apexName: "myapex",
2903 moduleName: "mybin",
2904 moduleVariant: vendorVariant + "_apex10000",
2905 libs: []string{
2906 // should link with vendor variants of VNDK libs(libvndk/libc++)
2907 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
2908 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
2909 // unstable Vendor libs as APEX variant
2910 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2911 },
2912 contents: []string{
2913 "bin/mybin",
2914 "lib64/libvendor.so",
2915 // VNDK libs (libvndk/libc++) are not included
2916 },
2917 requireVndkNamespace: true,
2918 },
2919 {
2920 name: "!use_vndk_as_stable",
2921 apexName: "myapex2",
2922 moduleName: "mybin2",
2923 moduleVariant: vendorVariant + "_myapex2",
2924 libs: []string{
2925 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
2926 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
2927 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
2928 // unstable vendor libs have "merged" APEX variants
2929 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
2930 },
2931 contents: []string{
2932 "bin/mybin2",
2933 "lib64/libvendor.so",
2934 // VNDK libs are included as well
2935 "lib64/libvndk.so",
2936 "lib64/libc++.so",
2937 },
2938 requireVndkNamespace: false,
2939 },
2940 } {
2941 t.Run(tc.name, func(t *testing.T) {
2942 // Check linked libs
2943 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
2944 libs := names(ldRule.Args["libFlags"])
2945 for _, lib := range tc.libs {
2946 ensureListContains(t, libs, lib)
2947 }
2948 // Check apex contents
2949 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09002950
Jooyung Han91f92032022-02-04 12:36:33 +09002951 // Check "requireNativeLibs"
2952 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
2953 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2954 if tc.requireVndkNamespace {
2955 ensureListContains(t, requireNativeLibs, ":vndk")
2956 } else {
2957 ensureListNotContains(t, requireNativeLibs, ":vndk")
2958 }
2959 })
2960 }
Jooyung Handf78e212020-07-22 15:54:47 +09002961}
2962
Justin Yun13decfb2021-03-08 19:25:55 +09002963func TestProductVariant(t *testing.T) {
2964 ctx := testApex(t, `
2965 apex {
2966 name: "myapex",
2967 key: "myapex.key",
2968 updatable: false,
2969 product_specific: true,
2970 binaries: ["foo"],
2971 }
2972
2973 apex_key {
2974 name: "myapex.key",
2975 public_key: "testkey.avbpubkey",
2976 private_key: "testkey.pem",
2977 }
2978
2979 cc_binary {
2980 name: "foo",
2981 product_available: true,
2982 apex_available: ["myapex"],
2983 srcs: ["foo.cpp"],
2984 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002985 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2986 variables.ProductVndkVersion = proptools.StringPtr("current")
2987 }),
2988 )
Justin Yun13decfb2021-03-08 19:25:55 +09002989
2990 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09002991 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002992 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2993 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2994 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2995 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2996}
2997
Jooyung Han8e5685d2020-09-21 11:02:57 +09002998func TestApex_withPrebuiltFirmware(t *testing.T) {
2999 testCases := []struct {
3000 name string
3001 additionalProp string
3002 }{
3003 {"system apex with prebuilt_firmware", ""},
3004 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3005 }
3006 for _, tc := range testCases {
3007 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003008 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003009 apex {
3010 name: "myapex",
3011 key: "myapex.key",
3012 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003013 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003014 `+tc.additionalProp+`
3015 }
3016 apex_key {
3017 name: "myapex.key",
3018 public_key: "testkey.avbpubkey",
3019 private_key: "testkey.pem",
3020 }
3021 prebuilt_firmware {
3022 name: "myfirmware",
3023 src: "myfirmware.bin",
3024 filename_from_src: true,
3025 `+tc.additionalProp+`
3026 }
3027 `)
3028 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
3029 "etc/firmware/myfirmware.bin",
3030 })
3031 })
3032 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003033}
3034
Jooyung Hanefb184e2020-06-25 17:14:25 +09003035func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003036 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003037 apex {
3038 name: "myapex",
3039 key: "myapex.key",
3040 vendor: true,
3041 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003042 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003043 }
3044
3045 apex_key {
3046 name: "myapex.key",
3047 public_key: "testkey.avbpubkey",
3048 private_key: "testkey.pem",
3049 }
3050
3051 cc_library {
3052 name: "mylib",
3053 vendor_available: true,
3054 }
3055 `)
3056
3057 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003058 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003059 name := apexBundle.BaseModuleName()
3060 prefix := "TARGET_"
3061 var builder strings.Builder
3062 data.Custom(&builder, name, prefix, "", data)
3063 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00003064 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 +09003065}
3066
Jooyung Han2ed99d02020-06-24 23:26:26 +09003067func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003068 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003069 apex {
3070 name: "myapex",
3071 key: "myapex.key",
3072 vintf_fragments: ["fragment.xml"],
3073 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003074 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003075 }
3076 apex_key {
3077 name: "myapex.key",
3078 public_key: "testkey.avbpubkey",
3079 private_key: "testkey.pem",
3080 }
3081 cc_binary {
3082 name: "mybin",
3083 }
3084 `)
3085
3086 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003087 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003088 name := apexBundle.BaseModuleName()
3089 prefix := "TARGET_"
3090 var builder strings.Builder
3091 data.Custom(&builder, name, prefix, "", data)
3092 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003093 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003094 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003095}
3096
Jiyong Park16e91a02018-12-20 18:18:08 +09003097func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003098 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003099 apex {
3100 name: "myapex",
3101 key: "myapex.key",
3102 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003103 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003104 }
3105
3106 apex_key {
3107 name: "myapex.key",
3108 public_key: "testkey.avbpubkey",
3109 private_key: "testkey.pem",
3110 }
3111
3112 cc_library {
3113 name: "mylib",
3114 srcs: ["mylib.cpp"],
3115 system_shared_libs: [],
3116 stl: "none",
3117 stubs: {
3118 versions: ["1", "2", "3"],
3119 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003120 apex_available: [
3121 "//apex_available:platform",
3122 "myapex",
3123 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09003124 }
3125
3126 cc_binary {
3127 name: "not_in_apex",
3128 srcs: ["mylib.cpp"],
3129 static_libs: ["mylib"],
3130 static_executable: true,
3131 system_shared_libs: [],
3132 stl: "none",
3133 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003134 `)
3135
Colin Cross7113d202019-11-20 16:39:12 -08003136 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003137
3138 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003139 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003140}
Jiyong Park9335a262018-12-24 11:31:58 +09003141
3142func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003143 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003144 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003145 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003146 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003147 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003148 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003149 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003150 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 srcs: ["mylib.cpp"],
3156 system_shared_libs: [],
3157 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003158 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003159 }
3160
3161 apex_key {
3162 name: "myapex.key",
3163 public_key: "testkey.avbpubkey",
3164 private_key: "testkey.pem",
3165 }
3166
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003167 android_app_certificate {
3168 name: "myapex.certificate",
3169 certificate: "testkey",
3170 }
3171
3172 android_app_certificate {
3173 name: "myapex.certificate.override",
3174 certificate: "testkey.override",
3175 }
3176
Jiyong Park9335a262018-12-24 11:31:58 +09003177 `)
3178
3179 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003180 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003181
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003182 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3183 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003184 "vendor/foo/devkeys/testkey.avbpubkey")
3185 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003186 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3187 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003188 "vendor/foo/devkeys/testkey.pem")
3189 }
3190
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003191 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09003192 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003193 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003194 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003195 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003196 }
3197}
Jiyong Park58e364a2019-01-19 19:24:06 +09003198
Jooyung Hanf121a652019-12-17 14:30:11 +09003199func TestCertificate(t *testing.T) {
3200 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003201 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003202 apex {
3203 name: "myapex",
3204 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }`)
3212 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3213 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3214 if actual := rule.Args["certificates"]; actual != expected {
3215 t.Errorf("certificates should be %q, not %q", expected, actual)
3216 }
3217 })
3218 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003219 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003220 apex {
3221 name: "myapex_keytest",
3222 key: "myapex.key",
3223 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003224 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003225 }
3226 apex_key {
3227 name: "myapex.key",
3228 public_key: "testkey.avbpubkey",
3229 private_key: "testkey.pem",
3230 }
3231 android_app_certificate {
3232 name: "myapex.certificate.override",
3233 certificate: "testkey.override",
3234 }`)
3235 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3236 expected := "testkey.override.x509.pem testkey.override.pk8"
3237 if actual := rule.Args["certificates"]; actual != expected {
3238 t.Errorf("certificates should be %q, not %q", expected, actual)
3239 }
3240 })
3241 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003242 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003243 apex {
3244 name: "myapex",
3245 key: "myapex.key",
3246 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003247 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003248 }
3249 apex_key {
3250 name: "myapex.key",
3251 public_key: "testkey.avbpubkey",
3252 private_key: "testkey.pem",
3253 }
3254 android_app_certificate {
3255 name: "myapex.certificate",
3256 certificate: "testkey",
3257 }`)
3258 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3259 expected := "testkey.x509.pem testkey.pk8"
3260 if actual := rule.Args["certificates"]; actual != expected {
3261 t.Errorf("certificates should be %q, not %q", expected, actual)
3262 }
3263 })
3264 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003265 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003266 apex {
3267 name: "myapex_keytest",
3268 key: "myapex.key",
3269 file_contexts: ":myapex-file_contexts",
3270 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003271 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003272 }
3273 apex_key {
3274 name: "myapex.key",
3275 public_key: "testkey.avbpubkey",
3276 private_key: "testkey.pem",
3277 }
3278 android_app_certificate {
3279 name: "myapex.certificate.override",
3280 certificate: "testkey.override",
3281 }`)
3282 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3283 expected := "testkey.override.x509.pem testkey.override.pk8"
3284 if actual := rule.Args["certificates"]; actual != expected {
3285 t.Errorf("certificates should be %q, not %q", expected, actual)
3286 }
3287 })
3288 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003289 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003290 apex {
3291 name: "myapex",
3292 key: "myapex.key",
3293 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003294 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003295 }
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }`)
3301 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3302 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3303 if actual := rule.Args["certificates"]; actual != expected {
3304 t.Errorf("certificates should be %q, not %q", expected, actual)
3305 }
3306 })
3307 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003308 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 apex {
3310 name: "myapex_keytest",
3311 key: "myapex.key",
3312 file_contexts: ":myapex-file_contexts",
3313 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003314 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 }
3316 apex_key {
3317 name: "myapex.key",
3318 public_key: "testkey.avbpubkey",
3319 private_key: "testkey.pem",
3320 }
3321 android_app_certificate {
3322 name: "myapex.certificate.override",
3323 certificate: "testkey.override",
3324 }`)
3325 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3326 expected := "testkey.override.x509.pem testkey.override.pk8"
3327 if actual := rule.Args["certificates"]; actual != expected {
3328 t.Errorf("certificates should be %q, not %q", expected, actual)
3329 }
3330 })
3331}
3332
Jiyong Park58e364a2019-01-19 19:24:06 +09003333func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003334 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003335 apex {
3336 name: "myapex",
3337 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003338 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003339 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003340 }
3341
3342 apex {
3343 name: "otherapex",
3344 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003345 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003346 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003347 }
3348
3349 apex_key {
3350 name: "myapex.key",
3351 public_key: "testkey.avbpubkey",
3352 private_key: "testkey.pem",
3353 }
3354
3355 cc_library {
3356 name: "mylib",
3357 srcs: ["mylib.cpp"],
3358 system_shared_libs: [],
3359 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003360 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003361 "myapex",
3362 "otherapex",
3363 ],
Jooyung Han24282772020-03-21 23:20:55 +09003364 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003365 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003366 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003367 cc_library {
3368 name: "mylib2",
3369 srcs: ["mylib.cpp"],
3370 system_shared_libs: [],
3371 stl: "none",
3372 apex_available: [
3373 "myapex",
3374 "otherapex",
3375 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003376 static_libs: ["mylib3"],
3377 recovery_available: true,
3378 min_sdk_version: "29",
3379 }
3380 cc_library {
3381 name: "mylib3",
3382 srcs: ["mylib.cpp"],
3383 system_shared_libs: [],
3384 stl: "none",
3385 apex_available: [
3386 "myapex",
3387 "otherapex",
3388 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003389 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003390 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003391 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003392 `)
3393
Jooyung Hanc87a0592020-03-02 17:44:33 +09003394 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003395 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003396 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003397
Vinh Tranf9754732023-01-19 22:41:46 -05003398 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003399 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003400 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003401
Vinh Tranf9754732023-01-19 22:41:46 -05003402 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003403 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003404 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003405
Colin Crossaede88c2020-08-11 12:17:01 -07003406 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3407 // each variant defines additional macros to distinguish which apex variant it is built for
3408
3409 // non-APEX variant does not have __ANDROID_APEX__ defined
3410 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3411 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3412
Vinh Tranf9754732023-01-19 22:41:46 -05003413 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003414 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3415 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003416
Jooyung Hanc87a0592020-03-02 17:44:33 +09003417 // non-APEX variant does not have __ANDROID_APEX__ defined
3418 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3419 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3420
Vinh Tranf9754732023-01-19 22:41:46 -05003421 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003422 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003423 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003424}
Jiyong Park7e636d02019-01-28 16:16:54 +09003425
3426func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003427 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003428 apex {
3429 name: "myapex",
3430 key: "myapex.key",
3431 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003433 }
3434
3435 apex_key {
3436 name: "myapex.key",
3437 public_key: "testkey.avbpubkey",
3438 private_key: "testkey.pem",
3439 }
3440
3441 cc_library_headers {
3442 name: "mylib_headers",
3443 export_include_dirs: ["my_include"],
3444 system_shared_libs: [],
3445 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003446 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003447 }
3448
3449 cc_library {
3450 name: "mylib",
3451 srcs: ["mylib.cpp"],
3452 system_shared_libs: [],
3453 stl: "none",
3454 header_libs: ["mylib_headers"],
3455 export_header_lib_headers: ["mylib_headers"],
3456 stubs: {
3457 versions: ["1", "2", "3"],
3458 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003459 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003460 }
3461
3462 cc_library {
3463 name: "otherlib",
3464 srcs: ["mylib.cpp"],
3465 system_shared_libs: [],
3466 stl: "none",
3467 shared_libs: ["mylib"],
3468 }
3469 `)
3470
Colin Cross7113d202019-11-20 16:39:12 -08003471 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003472
3473 // Ensure that the include path of the header lib is exported to 'otherlib'
3474 ensureContains(t, cFlags, "-Imy_include")
3475}
Alex Light9670d332019-01-29 18:07:33 -08003476
Jiyong Park7cd10e32020-01-14 09:22:18 +09003477type fileInApex struct {
3478 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003479 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003480 isLink bool
3481}
3482
Jooyung Han1724d582022-12-21 10:17:44 +09003483func (f fileInApex) String() string {
3484 return f.src + ":" + f.path
3485}
3486
3487func (f fileInApex) match(expectation string) bool {
3488 parts := strings.Split(expectation, ":")
3489 if len(parts) == 1 {
3490 match, _ := path.Match(parts[0], f.path)
3491 return match
3492 }
3493 if len(parts) == 2 {
3494 matchSrc, _ := path.Match(parts[0], f.src)
3495 matchDst, _ := path.Match(parts[1], f.path)
3496 return matchSrc && matchDst
3497 }
3498 panic("invalid expected file specification: " + expectation)
3499}
3500
Jooyung Hana57af4a2020-01-23 05:36:59 +00003501func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003502 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003503 module := ctx.ModuleForTests(moduleName, variant)
3504 apexRule := module.MaybeRule("apexRule")
3505 apexDir := "/image.apex/"
3506 if apexRule.Rule == nil {
3507 apexRule = module.Rule("zipApexRule")
3508 apexDir = "/image.zipapex/"
3509 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003510 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003511 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003512 for _, cmd := range strings.Split(copyCmds, "&&") {
3513 cmd = strings.TrimSpace(cmd)
3514 if cmd == "" {
3515 continue
3516 }
3517 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003518 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003519 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003520 switch terms[0] {
3521 case "mkdir":
3522 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003523 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003524 t.Fatal("copyCmds contains invalid cp command", cmd)
3525 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003526 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003527 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003528 isLink = false
3529 case "ln":
3530 if len(terms) != 3 && len(terms) != 4 {
3531 // ln LINK TARGET or ln -s LINK TARGET
3532 t.Fatal("copyCmds contains invalid ln command", cmd)
3533 }
3534 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003535 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003536 isLink = true
3537 default:
3538 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3539 }
3540 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003541 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003542 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003543 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003544 }
Jooyung Han1724d582022-12-21 10:17:44 +09003545 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003546 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003547 }
3548 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003549 return ret
3550}
3551
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003552func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003553 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003554 var failed bool
3555 var surplus []string
3556 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003557 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003558 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003559 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003560 if file.match(expected) {
3561 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003562 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003563 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003564 }
3565 }
Jooyung Han1724d582022-12-21 10:17:44 +09003566 if !matchFound {
3567 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003568 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003569 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003570
Jooyung Han31c470b2019-10-18 16:26:59 +09003571 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003572 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003573 t.Log("surplus files", surplus)
3574 failed = true
3575 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003576
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003577 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003578 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003579 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003580 if !filesMatched[expected] {
3581 missing = append(missing, expected)
3582 }
3583 }
3584 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003585 t.Log("missing files", missing)
3586 failed = true
3587 }
3588 if failed {
3589 t.Fail()
3590 }
3591}
3592
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003593func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3594 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3595}
3596
3597func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3598 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3599 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3600 if deapexer.Output != nil {
3601 outputs = append(outputs, deapexer.Output.String())
3602 }
3603 for _, output := range deapexer.ImplicitOutputs {
3604 outputs = append(outputs, output.String())
3605 }
3606 actualFiles := make([]fileInApex, 0, len(outputs))
3607 for _, output := range outputs {
3608 dir := "/deapexer/"
3609 pos := strings.LastIndex(output, dir)
3610 if pos == -1 {
3611 t.Fatal("Unknown deapexer output ", output)
3612 }
3613 path := output[pos+len(dir):]
3614 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3615 }
3616 assertFileListEquals(t, files, actualFiles)
3617}
3618
Jooyung Han344d5432019-08-23 11:17:39 +09003619func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003620 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003621 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003622 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003623 "etc/llndk.libraries.29.txt",
3624 "etc/vndkcore.libraries.29.txt",
3625 "etc/vndksp.libraries.29.txt",
3626 "etc/vndkprivate.libraries.29.txt",
3627 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003628 }
3629 testCases := []struct {
3630 vndkVersion string
3631 expectedFiles []string
3632 }{
3633 {
3634 vndkVersion: "current",
3635 expectedFiles: append(commonFiles,
3636 "lib/libvndk.so",
3637 "lib/libvndksp.so",
3638 "lib64/libvndk.so",
3639 "lib64/libvndksp.so"),
3640 },
3641 {
3642 vndkVersion: "",
3643 expectedFiles: append(commonFiles,
3644 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3645 "lib/libvndksp.so",
3646 "lib64/libvndksp.so"),
3647 },
3648 }
3649 for _, tc := range testCases {
3650 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3651 ctx := testApex(t, `
3652 apex_vndk {
3653 name: "com.android.vndk.current",
3654 key: "com.android.vndk.current.key",
3655 updatable: false,
3656 }
3657
3658 apex_key {
3659 name: "com.android.vndk.current.key",
3660 public_key: "testkey.avbpubkey",
3661 private_key: "testkey.pem",
3662 }
3663
3664 cc_library {
3665 name: "libvndk",
3666 srcs: ["mylib.cpp"],
3667 vendor_available: true,
3668 product_available: true,
3669 vndk: {
3670 enabled: true,
3671 },
3672 system_shared_libs: [],
3673 stl: "none",
3674 apex_available: [ "com.android.vndk.current" ],
3675 }
3676
3677 cc_library {
3678 name: "libvndksp",
3679 srcs: ["mylib.cpp"],
3680 vendor_available: true,
3681 product_available: true,
3682 vndk: {
3683 enabled: true,
3684 support_system_process: true,
3685 },
3686 system_shared_libs: [],
3687 stl: "none",
3688 apex_available: [ "com.android.vndk.current" ],
3689 }
3690
3691 // VNDK-Ext should not cause any problems
3692
3693 cc_library {
3694 name: "libvndk.ext",
3695 srcs: ["mylib2.cpp"],
3696 vendor: true,
3697 vndk: {
3698 enabled: true,
3699 extends: "libvndk",
3700 },
3701 system_shared_libs: [],
3702 stl: "none",
3703 }
3704
3705 cc_library {
3706 name: "libvndksp.ext",
3707 srcs: ["mylib2.cpp"],
3708 vendor: true,
3709 vndk: {
3710 enabled: true,
3711 support_system_process: true,
3712 extends: "libvndksp",
3713 },
3714 system_shared_libs: [],
3715 stl: "none",
3716 }
3717 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3718 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3719 }))
3720 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3721 })
3722 }
Jooyung Han344d5432019-08-23 11:17:39 +09003723}
3724
3725func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003726 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003727 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003728 name: "com.android.vndk.current",
3729 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003730 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003731 }
3732
3733 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003734 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003735 public_key: "testkey.avbpubkey",
3736 private_key: "testkey.pem",
3737 }
3738
3739 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003740 name: "libvndk",
3741 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003742 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003743 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003744 vndk: {
3745 enabled: true,
3746 },
3747 system_shared_libs: [],
3748 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003749 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003750 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003751
3752 cc_prebuilt_library_shared {
3753 name: "libvndk.arm",
3754 srcs: ["libvndk.arm.so"],
3755 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003756 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003757 vndk: {
3758 enabled: true,
3759 },
3760 enabled: false,
3761 arch: {
3762 arm: {
3763 enabled: true,
3764 },
3765 },
3766 system_shared_libs: [],
3767 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003768 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003769 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003770 `+vndkLibrariesTxtFiles("current"),
3771 withFiles(map[string][]byte{
3772 "libvndk.so": nil,
3773 "libvndk.arm.so": nil,
3774 }))
Colin Cross2807f002021-03-02 10:15:29 -08003775 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003776 "lib/libvndk.so",
3777 "lib/libvndk.arm.so",
3778 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003779 "lib/libc++.so",
3780 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003781 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003782 })
Jooyung Han344d5432019-08-23 11:17:39 +09003783}
3784
Jooyung Han39edb6c2019-11-06 16:53:07 +09003785func vndkLibrariesTxtFiles(vers ...string) (result string) {
3786 for _, v := range vers {
3787 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003788 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003789 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003790 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003791 name: "` + txt + `.libraries.txt",
3792 }
3793 `
3794 }
3795 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003796 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003797 result += `
3798 prebuilt_etc {
3799 name: "` + txt + `.libraries.` + v + `.txt",
3800 src: "dummy.txt",
3801 }
3802 `
3803 }
3804 }
3805 }
3806 return
3807}
3808
Jooyung Han344d5432019-08-23 11:17:39 +09003809func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003810 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003811 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003812 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003813 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003814 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003815 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003816 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003817 }
3818
3819 apex_key {
3820 name: "myapex.key",
3821 public_key: "testkey.avbpubkey",
3822 private_key: "testkey.pem",
3823 }
3824
Jooyung Han31c470b2019-10-18 16:26:59 +09003825 vndk_prebuilt_shared {
3826 name: "libvndk27",
3827 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003828 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003829 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 vndk: {
3831 enabled: true,
3832 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003833 target_arch: "arm64",
3834 arch: {
3835 arm: {
3836 srcs: ["libvndk27_arm.so"],
3837 },
3838 arm64: {
3839 srcs: ["libvndk27_arm64.so"],
3840 },
3841 },
Colin Cross2807f002021-03-02 10:15:29 -08003842 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003843 }
3844
3845 vndk_prebuilt_shared {
3846 name: "libvndk27",
3847 version: "27",
3848 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003849 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003850 vndk: {
3851 enabled: true,
3852 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 target_arch: "x86_64",
3854 arch: {
3855 x86: {
3856 srcs: ["libvndk27_x86.so"],
3857 },
3858 x86_64: {
3859 srcs: ["libvndk27_x86_64.so"],
3860 },
3861 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003862 }
3863 `+vndkLibrariesTxtFiles("27"),
3864 withFiles(map[string][]byte{
3865 "libvndk27_arm.so": nil,
3866 "libvndk27_arm64.so": nil,
3867 "libvndk27_x86.so": nil,
3868 "libvndk27_x86_64.so": nil,
3869 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003870
Colin Cross2807f002021-03-02 10:15:29 -08003871 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003872 "lib/libvndk27_arm.so",
3873 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 })
Jooyung Han344d5432019-08-23 11:17:39 +09003876}
3877
Jooyung Han90eee022019-10-01 20:02:42 +09003878func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003879 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003880 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003881 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003882 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003883 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003884 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003885 }
3886 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003887 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003888 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003889 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003890 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003891 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003892 }
3893 apex_key {
3894 name: "myapex.key",
3895 public_key: "testkey.avbpubkey",
3896 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003898
3899 assertApexName := func(expected, moduleName string) {
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003900 module := ctx.ModuleForTests(moduleName, "android_common_image")
3901 apexManifestRule := module.Rule("apexManifestRule")
3902 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003903 }
3904
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003905 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003906 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003907}
3908
Jooyung Han344d5432019-08-23 11:17:39 +09003909func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003910 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003911 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003912 name: "com.android.vndk.current",
3913 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003914 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003915 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003916 }
3917
3918 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003919 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003920 public_key: "testkey.avbpubkey",
3921 private_key: "testkey.pem",
3922 }
3923
3924 cc_library {
3925 name: "libvndk",
3926 srcs: ["mylib.cpp"],
3927 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003928 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 native_bridge_supported: true,
3930 host_supported: true,
3931 vndk: {
3932 enabled: true,
3933 },
3934 system_shared_libs: [],
3935 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003936 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003937 }
Colin Cross2807f002021-03-02 10:15:29 -08003938 `+vndkLibrariesTxtFiles("current"),
3939 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003940
Colin Cross2807f002021-03-02 10:15:29 -08003941 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003942 "lib/libvndk.so",
3943 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003944 "lib/libc++.so",
3945 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003946 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003947 })
Jooyung Han344d5432019-08-23 11:17:39 +09003948}
3949
3950func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003951 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003952 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003953 name: "com.android.vndk.current",
3954 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003955 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003956 native_bridge_supported: true,
3957 }
3958
3959 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003960 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
3964
3965 cc_library {
3966 name: "libvndk",
3967 srcs: ["mylib.cpp"],
3968 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003969 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003970 native_bridge_supported: true,
3971 host_supported: true,
3972 vndk: {
3973 enabled: true,
3974 },
3975 system_shared_libs: [],
3976 stl: "none",
3977 }
3978 `)
3979}
3980
Jooyung Han31c470b2019-10-18 16:26:59 +09003981func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003982 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003983 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003984 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003986 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003988 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003989 }
3990
3991 apex_key {
3992 name: "myapex.key",
3993 public_key: "testkey.avbpubkey",
3994 private_key: "testkey.pem",
3995 }
3996
3997 vndk_prebuilt_shared {
3998 name: "libvndk27",
3999 version: "27",
4000 target_arch: "arm",
4001 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004002 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004003 vndk: {
4004 enabled: true,
4005 },
4006 arch: {
4007 arm: {
4008 srcs: ["libvndk27.so"],
4009 }
4010 },
4011 }
4012
4013 vndk_prebuilt_shared {
4014 name: "libvndk27",
4015 version: "27",
4016 target_arch: "arm",
4017 binder32bit: true,
4018 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004019 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 vndk: {
4021 enabled: true,
4022 },
4023 arch: {
4024 arm: {
4025 srcs: ["libvndk27binder32.so"],
4026 }
4027 },
Colin Cross2807f002021-03-02 10:15:29 -08004028 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004029 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004030 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004031 withFiles(map[string][]byte{
4032 "libvndk27.so": nil,
4033 "libvndk27binder32.so": nil,
4034 }),
4035 withBinder32bit,
4036 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004037 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004038 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4039 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004040 },
4041 }),
4042 )
4043
Colin Cross2807f002021-03-02 10:15:29 -08004044 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004045 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004046 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004047 })
4048}
4049
Jooyung Han45a96772020-06-15 14:59:42 +09004050func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004051 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004052 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004053 name: "com.android.vndk.current",
4054 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004055 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004056 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004057 }
4058
4059 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004060 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004061 public_key: "testkey.avbpubkey",
4062 private_key: "testkey.pem",
4063 }
4064
4065 cc_library {
4066 name: "libz",
4067 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004068 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004069 vndk: {
4070 enabled: true,
4071 },
4072 stubs: {
4073 symbol_file: "libz.map.txt",
4074 versions: ["30"],
4075 }
4076 }
4077 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4078 "libz.map.txt": nil,
4079 }))
4080
Colin Cross2807f002021-03-02 10:15:29 -08004081 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004082 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4083 ensureListEmpty(t, provideNativeLibs)
Jooyung Han1724d582022-12-21 10:17:44 +09004084 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
4085 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4086 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4087 "*/*",
4088 })
Jooyung Han45a96772020-06-15 14:59:42 +09004089}
4090
Jooyung Hane1633032019-08-01 17:41:43 +09004091func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004092 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004093 apex {
4094 name: "myapex_nodep",
4095 key: "myapex.key",
4096 native_shared_libs: ["lib_nodep"],
4097 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004098 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004099 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004100 }
4101
4102 apex {
4103 name: "myapex_dep",
4104 key: "myapex.key",
4105 native_shared_libs: ["lib_dep"],
4106 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004107 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004108 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004109 }
4110
4111 apex {
4112 name: "myapex_provider",
4113 key: "myapex.key",
4114 native_shared_libs: ["libfoo"],
4115 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004116 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004117 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004118 }
4119
4120 apex {
4121 name: "myapex_selfcontained",
4122 key: "myapex.key",
4123 native_shared_libs: ["lib_dep", "libfoo"],
4124 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004125 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004126 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004127 }
4128
4129 apex_key {
4130 name: "myapex.key",
4131 public_key: "testkey.avbpubkey",
4132 private_key: "testkey.pem",
4133 }
4134
4135 cc_library {
4136 name: "lib_nodep",
4137 srcs: ["mylib.cpp"],
4138 system_shared_libs: [],
4139 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004140 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004141 }
4142
4143 cc_library {
4144 name: "lib_dep",
4145 srcs: ["mylib.cpp"],
4146 shared_libs: ["libfoo"],
4147 system_shared_libs: [],
4148 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004149 apex_available: [
4150 "myapex_dep",
4151 "myapex_provider",
4152 "myapex_selfcontained",
4153 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004154 }
4155
4156 cc_library {
4157 name: "libfoo",
4158 srcs: ["mytest.cpp"],
4159 stubs: {
4160 versions: ["1"],
4161 },
4162 system_shared_libs: [],
4163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004164 apex_available: [
4165 "myapex_provider",
4166 "myapex_selfcontained",
4167 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004168 }
4169 `)
4170
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004171 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004172 var provideNativeLibs, requireNativeLibs []string
4173
Sundong Ahnabb64432019-10-22 13:58:29 +09004174 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004175 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4176 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004177 ensureListEmpty(t, provideNativeLibs)
4178 ensureListEmpty(t, requireNativeLibs)
4179
Sundong Ahnabb64432019-10-22 13:58:29 +09004180 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004181 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4182 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004183 ensureListEmpty(t, provideNativeLibs)
4184 ensureListContains(t, requireNativeLibs, "libfoo.so")
4185
Sundong Ahnabb64432019-10-22 13:58:29 +09004186 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004187 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4188 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004189 ensureListContains(t, provideNativeLibs, "libfoo.so")
4190 ensureListEmpty(t, requireNativeLibs)
4191
Sundong Ahnabb64432019-10-22 13:58:29 +09004192 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004193 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4194 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004195 ensureListContains(t, provideNativeLibs, "libfoo.so")
4196 ensureListEmpty(t, requireNativeLibs)
4197}
4198
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004199func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4200 ctx := testApex(t, `
4201 apex {
4202 name: "myapex",
4203 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004204 native_shared_libs: ["mylib"],
4205 updatable: false,
4206 }
4207
4208 apex_key {
4209 name: "myapex.key",
4210 public_key: "testkey.avbpubkey",
4211 private_key: "testkey.pem",
4212 }
4213
4214 cc_library {
4215 name: "mylib",
4216 srcs: ["mylib.cpp"],
4217 system_shared_libs: [],
4218 stl: "none",
4219 apex_available: [
4220 "//apex_available:platform",
4221 "myapex",
4222 ],
4223 }
4224 `, android.FixtureMergeEnv(map[string]string{
4225 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4226 }))
4227
Jooyung Han63dff462023-02-09 00:11:27 +00004228 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004229 apexManifestRule := module.Rule("apexManifestRule")
4230 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4231}
4232
Vinh Tran8f5310f2022-10-07 18:16:47 -04004233func TestCompileMultilibProp(t *testing.T) {
4234 testCases := []struct {
4235 compileMultiLibProp string
4236 containedLibs []string
4237 notContainedLibs []string
4238 }{
4239 {
4240 containedLibs: []string{
4241 "image.apex/lib64/mylib.so",
4242 "image.apex/lib/mylib.so",
4243 },
4244 compileMultiLibProp: `compile_multilib: "both",`,
4245 },
4246 {
4247 containedLibs: []string{"image.apex/lib64/mylib.so"},
4248 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4249 compileMultiLibProp: `compile_multilib: "first",`,
4250 },
4251 {
4252 containedLibs: []string{"image.apex/lib64/mylib.so"},
4253 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4254 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4255 },
4256 {
4257 containedLibs: []string{"image.apex/lib64/mylib.so"},
4258 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4259 compileMultiLibProp: `compile_multilib: "64",`,
4260 },
4261 {
4262 containedLibs: []string{"image.apex/lib/mylib.so"},
4263 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4264 compileMultiLibProp: `compile_multilib: "32",`,
4265 },
4266 }
4267 for _, testCase := range testCases {
4268 ctx := testApex(t, fmt.Sprintf(`
4269 apex {
4270 name: "myapex",
4271 key: "myapex.key",
4272 %s
4273 native_shared_libs: ["mylib"],
4274 updatable: false,
4275 }
4276 apex_key {
4277 name: "myapex.key",
4278 public_key: "testkey.avbpubkey",
4279 private_key: "testkey.pem",
4280 }
4281 cc_library {
4282 name: "mylib",
4283 srcs: ["mylib.cpp"],
4284 apex_available: [
4285 "//apex_available:platform",
4286 "myapex",
4287 ],
4288 }
4289 `, testCase.compileMultiLibProp),
4290 )
4291 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4292 apexRule := module.Rule("apexRule")
4293 copyCmds := apexRule.Args["copy_commands"]
4294 for _, containedLib := range testCase.containedLibs {
4295 ensureContains(t, copyCmds, containedLib)
4296 }
4297 for _, notContainedLib := range testCase.notContainedLibs {
4298 ensureNotContains(t, copyCmds, notContainedLib)
4299 }
4300 }
4301}
4302
Alex Light0851b882019-02-07 13:20:53 -08004303func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004304 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004305 apex {
4306 name: "myapex",
4307 key: "myapex.key",
4308 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004309 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004310 }
4311
4312 apex_key {
4313 name: "myapex.key",
4314 public_key: "testkey.avbpubkey",
4315 private_key: "testkey.pem",
4316 }
4317
4318 cc_library {
4319 name: "mylib_common",
4320 srcs: ["mylib.cpp"],
4321 system_shared_libs: [],
4322 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004323 apex_available: [
4324 "//apex_available:platform",
4325 "myapex",
4326 ],
Alex Light0851b882019-02-07 13:20:53 -08004327 }
4328 `)
4329
Sundong Ahnabb64432019-10-22 13:58:29 +09004330 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004331 apexRule := module.Rule("apexRule")
4332 copyCmds := apexRule.Args["copy_commands"]
4333
4334 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4335 t.Log("Apex was a test apex!")
4336 t.Fail()
4337 }
4338 // Ensure that main rule creates an output
4339 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4340
4341 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004342 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004343
4344 // Ensure that both direct and indirect deps are copied into apex
4345 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4346
Colin Cross7113d202019-11-20 16:39:12 -08004347 // Ensure that the platform variant ends with _shared
4348 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004349
Colin Cross56a83212020-09-15 18:30:11 -07004350 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004351 t.Log("Found mylib_common not in any apex!")
4352 t.Fail()
4353 }
4354}
4355
4356func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004357 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004358 apex_test {
4359 name: "myapex",
4360 key: "myapex.key",
4361 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004362 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004363 }
4364
4365 apex_key {
4366 name: "myapex.key",
4367 public_key: "testkey.avbpubkey",
4368 private_key: "testkey.pem",
4369 }
4370
4371 cc_library {
4372 name: "mylib_common_test",
4373 srcs: ["mylib.cpp"],
4374 system_shared_libs: [],
4375 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004376 // TODO: remove //apex_available:platform
4377 apex_available: [
4378 "//apex_available:platform",
4379 "myapex",
4380 ],
Alex Light0851b882019-02-07 13:20:53 -08004381 }
4382 `)
4383
Sundong Ahnabb64432019-10-22 13:58:29 +09004384 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004385 apexRule := module.Rule("apexRule")
4386 copyCmds := apexRule.Args["copy_commands"]
4387
4388 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4389 t.Log("Apex was not a test apex!")
4390 t.Fail()
4391 }
4392 // Ensure that main rule creates an output
4393 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4394
4395 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004396 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004397
4398 // Ensure that both direct and indirect deps are copied into apex
4399 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4400
Colin Cross7113d202019-11-20 16:39:12 -08004401 // Ensure that the platform variant ends with _shared
4402 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004403}
4404
Alex Light9670d332019-01-29 18:07:33 -08004405func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004406 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004407 apex {
4408 name: "myapex",
4409 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004410 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004411 multilib: {
4412 first: {
4413 native_shared_libs: ["mylib_common"],
4414 }
4415 },
4416 target: {
4417 android: {
4418 multilib: {
4419 first: {
4420 native_shared_libs: ["mylib"],
4421 }
4422 }
4423 },
4424 host: {
4425 multilib: {
4426 first: {
4427 native_shared_libs: ["mylib2"],
4428 }
4429 }
4430 }
4431 }
4432 }
4433
4434 apex_key {
4435 name: "myapex.key",
4436 public_key: "testkey.avbpubkey",
4437 private_key: "testkey.pem",
4438 }
4439
4440 cc_library {
4441 name: "mylib",
4442 srcs: ["mylib.cpp"],
4443 system_shared_libs: [],
4444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004445 // TODO: remove //apex_available:platform
4446 apex_available: [
4447 "//apex_available:platform",
4448 "myapex",
4449 ],
Alex Light9670d332019-01-29 18:07:33 -08004450 }
4451
4452 cc_library {
4453 name: "mylib_common",
4454 srcs: ["mylib.cpp"],
4455 system_shared_libs: [],
4456 stl: "none",
4457 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004458 // TODO: remove //apex_available:platform
4459 apex_available: [
4460 "//apex_available:platform",
4461 "myapex",
4462 ],
Alex Light9670d332019-01-29 18:07:33 -08004463 }
4464
4465 cc_library {
4466 name: "mylib2",
4467 srcs: ["mylib.cpp"],
4468 system_shared_libs: [],
4469 stl: "none",
4470 compile_multilib: "first",
4471 }
4472 `)
4473
Sundong Ahnabb64432019-10-22 13:58:29 +09004474 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004475 copyCmds := apexRule.Args["copy_commands"]
4476
4477 // Ensure that main rule creates an output
4478 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4479
4480 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004481 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4482 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4483 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004484
4485 // Ensure that both direct and indirect deps are copied into apex
4486 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4487 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4488 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4489
Colin Cross7113d202019-11-20 16:39:12 -08004490 // Ensure that the platform variant ends with _shared
4491 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4492 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4493 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004494}
Jiyong Park04480cf2019-02-06 00:16:29 +09004495
Jiyong Park59140302020-12-14 18:44:04 +09004496func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004497 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004498 apex {
4499 name: "myapex",
4500 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004501 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004502 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004503 arch: {
4504 arm64: {
4505 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004506 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004507 },
4508 x86_64: {
4509 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004510 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004511 },
4512 }
4513 }
4514
4515 apex_key {
4516 name: "myapex.key",
4517 public_key: "testkey.avbpubkey",
4518 private_key: "testkey.pem",
4519 }
4520
4521 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004522 name: "mylib.generic",
4523 srcs: ["mylib.cpp"],
4524 system_shared_libs: [],
4525 stl: "none",
4526 // TODO: remove //apex_available:platform
4527 apex_available: [
4528 "//apex_available:platform",
4529 "myapex",
4530 ],
4531 }
4532
4533 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004534 name: "mylib.arm64",
4535 srcs: ["mylib.cpp"],
4536 system_shared_libs: [],
4537 stl: "none",
4538 // TODO: remove //apex_available:platform
4539 apex_available: [
4540 "//apex_available:platform",
4541 "myapex",
4542 ],
4543 }
4544
4545 cc_library {
4546 name: "mylib.x64",
4547 srcs: ["mylib.cpp"],
4548 system_shared_libs: [],
4549 stl: "none",
4550 // TODO: remove //apex_available:platform
4551 apex_available: [
4552 "//apex_available:platform",
4553 "myapex",
4554 ],
4555 }
4556 `)
4557
4558 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4559 copyCmds := apexRule.Args["copy_commands"]
4560
4561 // Ensure that apex variant is created for the direct dep
4562 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004563 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004564 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4565
4566 // Ensure that both direct and indirect deps are copied into apex
4567 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4568 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4569}
4570
Jiyong Park04480cf2019-02-06 00:16:29 +09004571func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004572 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004573 apex {
4574 name: "myapex",
4575 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004576 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004577 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004578 }
4579
4580 apex_key {
4581 name: "myapex.key",
4582 public_key: "testkey.avbpubkey",
4583 private_key: "testkey.pem",
4584 }
4585
4586 sh_binary {
4587 name: "myscript",
4588 src: "mylib.cpp",
4589 filename: "myscript.sh",
4590 sub_dir: "script",
4591 }
4592 `)
4593
Sundong Ahnabb64432019-10-22 13:58:29 +09004594 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004595 copyCmds := apexRule.Args["copy_commands"]
4596
4597 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4598}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004599
Jooyung Han91df2082019-11-20 01:49:42 +09004600func TestApexInVariousPartition(t *testing.T) {
4601 testcases := []struct {
4602 propName, parition, flattenedPartition string
4603 }{
4604 {"", "system", "system_ext"},
4605 {"product_specific: true", "product", "product"},
4606 {"soc_specific: true", "vendor", "vendor"},
4607 {"proprietary: true", "vendor", "vendor"},
4608 {"vendor: true", "vendor", "vendor"},
4609 {"system_ext_specific: true", "system_ext", "system_ext"},
4610 }
4611 for _, tc := range testcases {
4612 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004613 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004614 apex {
4615 name: "myapex",
4616 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004617 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004618 `+tc.propName+`
4619 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004620
Jooyung Han91df2082019-11-20 01:49:42 +09004621 apex_key {
4622 name: "myapex.key",
4623 public_key: "testkey.avbpubkey",
4624 private_key: "testkey.pem",
4625 }
4626 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004627
Jooyung Han91df2082019-11-20 01:49:42 +09004628 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004629 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4630 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004631 if actual != expected {
4632 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4633 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004634
Jooyung Han91df2082019-11-20 01:49:42 +09004635 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004636 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4637 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004638 if actual != expected {
4639 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4640 }
4641 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004642 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004643}
Jiyong Park67882562019-03-21 01:11:21 +09004644
Jooyung Han580eb4f2020-06-24 19:33:06 +09004645func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004646 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 apex {
4648 name: "myapex",
4649 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004650 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004651 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004652
Jooyung Han580eb4f2020-06-24 19:33:06 +09004653 apex_key {
4654 name: "myapex.key",
4655 public_key: "testkey.avbpubkey",
4656 private_key: "testkey.pem",
4657 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004658 `)
4659 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004660 rule := module.Output("file_contexts")
4661 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4662}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004663
Jooyung Han580eb4f2020-06-24 19:33:06 +09004664func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004665 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004666 apex {
4667 name: "myapex",
4668 key: "myapex.key",
4669 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004670 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004671 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004672
Jooyung Han580eb4f2020-06-24 19:33:06 +09004673 apex_key {
4674 name: "myapex.key",
4675 public_key: "testkey.avbpubkey",
4676 private_key: "testkey.pem",
4677 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004678 `, withFiles(map[string][]byte{
4679 "my_own_file_contexts": nil,
4680 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004681}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004682
Jooyung Han580eb4f2020-06-24 19:33:06 +09004683func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004684 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004685 apex {
4686 name: "myapex",
4687 key: "myapex.key",
4688 product_specific: true,
4689 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004690 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004691 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004692
Jooyung Han580eb4f2020-06-24 19:33:06 +09004693 apex_key {
4694 name: "myapex.key",
4695 public_key: "testkey.avbpubkey",
4696 private_key: "testkey.pem",
4697 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004698 `)
4699
Colin Cross1c460562021-02-16 17:55:47 -08004700 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004701 apex {
4702 name: "myapex",
4703 key: "myapex.key",
4704 product_specific: true,
4705 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004706 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004707 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004708
Jooyung Han580eb4f2020-06-24 19:33:06 +09004709 apex_key {
4710 name: "myapex.key",
4711 public_key: "testkey.avbpubkey",
4712 private_key: "testkey.pem",
4713 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004714 `, withFiles(map[string][]byte{
4715 "product_specific_file_contexts": nil,
4716 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004717 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4718 rule := module.Output("file_contexts")
4719 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4720}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004721
Jooyung Han580eb4f2020-06-24 19:33:06 +09004722func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004723 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004724 apex {
4725 name: "myapex",
4726 key: "myapex.key",
4727 product_specific: true,
4728 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004729 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004730 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004731
Jooyung Han580eb4f2020-06-24 19:33:06 +09004732 apex_key {
4733 name: "myapex.key",
4734 public_key: "testkey.avbpubkey",
4735 private_key: "testkey.pem",
4736 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004737
Jooyung Han580eb4f2020-06-24 19:33:06 +09004738 filegroup {
4739 name: "my-file-contexts",
4740 srcs: ["product_specific_file_contexts"],
4741 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004742 `, withFiles(map[string][]byte{
4743 "product_specific_file_contexts": nil,
4744 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004745 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4746 rule := module.Output("file_contexts")
4747 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004748}
4749
Jiyong Park67882562019-03-21 01:11:21 +09004750func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004751 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004752 apex_key {
4753 name: "myapex.key",
4754 public_key: ":my.avbpubkey",
4755 private_key: ":my.pem",
4756 product_specific: true,
4757 }
4758
4759 filegroup {
4760 name: "my.avbpubkey",
4761 srcs: ["testkey2.avbpubkey"],
4762 }
4763
4764 filegroup {
4765 name: "my.pem",
4766 srcs: ["testkey2.pem"],
4767 }
4768 `)
4769
4770 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4771 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004772 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004773 if actual_pubkey != expected_pubkey {
4774 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4775 }
4776 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004777 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004778 if actual_privkey != expected_privkey {
4779 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4780 }
4781}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004782
4783func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004784 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004785 prebuilt_apex {
4786 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004787 arch: {
4788 arm64: {
4789 src: "myapex-arm64.apex",
4790 },
4791 arm: {
4792 src: "myapex-arm.apex",
4793 },
4794 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004795 }
4796 `)
4797
Wei Li340ee8e2022-03-18 17:33:24 -07004798 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4799 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004800
Jiyong Parkc95714e2019-03-29 14:23:10 +09004801 expectedInput := "myapex-arm64.apex"
4802 if prebuilt.inputApex.String() != expectedInput {
4803 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4804 }
Wei Li340ee8e2022-03-18 17:33:24 -07004805 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4806 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4807 rule := testingModule.Rule("genProvenanceMetaData")
4808 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4809 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4810 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4811 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004812}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004813
Paul Duffinc0609c62021-03-01 17:27:16 +00004814func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004815 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004816 prebuilt_apex {
4817 name: "myapex",
4818 }
4819 `)
4820}
4821
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004822func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004823 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004824 prebuilt_apex {
4825 name: "myapex",
4826 src: "myapex-arm.apex",
4827 filename: "notmyapex.apex",
4828 }
4829 `)
4830
Wei Li340ee8e2022-03-18 17:33:24 -07004831 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4832 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004833
4834 expected := "notmyapex.apex"
4835 if p.installFilename != expected {
4836 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4837 }
Wei Li340ee8e2022-03-18 17:33:24 -07004838 rule := testingModule.Rule("genProvenanceMetaData")
4839 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4840 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4841 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4842 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004843}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004844
Samiul Islam7c02e262021-09-08 17:48:28 +01004845func TestApexSetFilenameOverride(t *testing.T) {
4846 testApex(t, `
4847 apex_set {
4848 name: "com.company.android.myapex",
4849 apex_name: "com.android.myapex",
4850 set: "company-myapex.apks",
4851 filename: "com.company.android.myapex.apex"
4852 }
4853 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4854
4855 testApex(t, `
4856 apex_set {
4857 name: "com.company.android.myapex",
4858 apex_name: "com.android.myapex",
4859 set: "company-myapex.apks",
4860 filename: "com.company.android.myapex.capex"
4861 }
4862 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4863
4864 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4865 apex_set {
4866 name: "com.company.android.myapex",
4867 apex_name: "com.android.myapex",
4868 set: "company-myapex.apks",
4869 filename: "some-random-suffix"
4870 }
4871 `)
4872}
4873
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004874func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004875 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004876 prebuilt_apex {
4877 name: "myapex.prebuilt",
4878 src: "myapex-arm.apex",
4879 overrides: [
4880 "myapex",
4881 ],
4882 }
4883 `)
4884
Wei Li340ee8e2022-03-18 17:33:24 -07004885 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4886 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004887
4888 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004889 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004890 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004891 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004892 }
Wei Li340ee8e2022-03-18 17:33:24 -07004893 rule := testingModule.Rule("genProvenanceMetaData")
4894 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4895 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4896 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4897 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004898}
4899
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004900func TestPrebuiltApexName(t *testing.T) {
4901 testApex(t, `
4902 prebuilt_apex {
4903 name: "com.company.android.myapex",
4904 apex_name: "com.android.myapex",
4905 src: "company-myapex-arm.apex",
4906 }
4907 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4908
4909 testApex(t, `
4910 apex_set {
4911 name: "com.company.android.myapex",
4912 apex_name: "com.android.myapex",
4913 set: "company-myapex.apks",
4914 }
4915 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4916}
4917
4918func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4919 _ = android.GroupFixturePreparers(
4920 java.PrepareForTestWithJavaDefaultModules,
4921 PrepareForTestWithApexBuildComponents,
4922 android.FixtureWithRootAndroidBp(`
4923 platform_bootclasspath {
4924 name: "platform-bootclasspath",
4925 fragments: [
4926 {
4927 apex: "com.android.art",
4928 module: "art-bootclasspath-fragment",
4929 },
4930 ],
4931 }
4932
4933 prebuilt_apex {
4934 name: "com.company.android.art",
4935 apex_name: "com.android.art",
4936 src: "com.company.android.art-arm.apex",
4937 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4938 }
4939
4940 prebuilt_bootclasspath_fragment {
4941 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004942 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004943 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004944 hidden_api: {
4945 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4946 metadata: "my-bootclasspath-fragment/metadata.csv",
4947 index: "my-bootclasspath-fragment/index.csv",
4948 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4949 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4950 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004951 }
4952
4953 java_import {
4954 name: "core-oj",
4955 jars: ["prebuilt.jar"],
4956 }
4957 `),
4958 ).RunTest(t)
4959}
4960
Paul Duffin092153d2021-01-26 11:42:39 +00004961// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4962// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004963func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004964 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004965
Paul Duffin89886cb2021-02-05 16:44:03 +00004966 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004967 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004968 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004969 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004970 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004971 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004972 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4973 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4974 android.NormalizePathForTesting(dexJarBuildPath))
4975 }
4976
4977 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004978 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004979 // Make sure the import has been given the correct path to the dex jar.
4980 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4981 dexJarBuildPath := p.DexJarInstallPath()
4982 stem := android.RemoveOptionalPrebuiltPrefix(name)
4983 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4984 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4985 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004986 }
4987
Paul Duffin39853512021-02-26 11:09:39 +00004988 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004989 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004990 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004991 android.AssertArrayString(t, "Check if there is no source variant",
4992 []string{"android_common"},
4993 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004994 }
4995
4996 t.Run("prebuilt only", func(t *testing.T) {
4997 bp := `
4998 prebuilt_apex {
4999 name: "myapex",
5000 arch: {
5001 arm64: {
5002 src: "myapex-arm64.apex",
5003 },
5004 arm: {
5005 src: "myapex-arm.apex",
5006 },
5007 },
Paul Duffin39853512021-02-26 11:09:39 +00005008 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005009 }
5010
5011 java_import {
5012 name: "libfoo",
5013 jars: ["libfoo.jar"],
5014 }
Paul Duffin39853512021-02-26 11:09:39 +00005015
5016 java_sdk_library_import {
5017 name: "libbar",
5018 public: {
5019 jars: ["libbar.jar"],
5020 },
5021 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005022 `
5023
5024 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5025 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5026
Martin Stjernholm44825602021-09-17 01:44:12 +01005027 deapexerName := deapexerModuleName("myapex")
5028 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5029
Paul Duffinf6932af2021-02-26 18:21:56 +00005030 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005031 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005032 rule := deapexer.Rule("deapexer")
5033 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5034 t.Errorf("expected: %q, found: %q", expected, actual)
5035 }
5036
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005037 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005038 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005039 rule = prebuiltApex.Rule("android/soong/android.Cp")
5040 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5041 t.Errorf("expected: %q, found: %q", expected, actual)
5042 }
5043
Paul Duffin89886cb2021-02-05 16:44:03 +00005044 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005045 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005046
5047 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005048 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005049 })
5050
5051 t.Run("prebuilt with source preferred", func(t *testing.T) {
5052
5053 bp := `
5054 prebuilt_apex {
5055 name: "myapex",
5056 arch: {
5057 arm64: {
5058 src: "myapex-arm64.apex",
5059 },
5060 arm: {
5061 src: "myapex-arm.apex",
5062 },
5063 },
Paul Duffin39853512021-02-26 11:09:39 +00005064 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005065 }
5066
5067 java_import {
5068 name: "libfoo",
5069 jars: ["libfoo.jar"],
5070 }
5071
5072 java_library {
5073 name: "libfoo",
5074 }
Paul Duffin39853512021-02-26 11:09:39 +00005075
5076 java_sdk_library_import {
5077 name: "libbar",
5078 public: {
5079 jars: ["libbar.jar"],
5080 },
5081 }
5082
5083 java_sdk_library {
5084 name: "libbar",
5085 srcs: ["foo/bar/MyClass.java"],
5086 unsafe_ignore_missing_latest_api: true,
5087 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005088 `
5089
5090 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5091 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5092
Paul Duffin89886cb2021-02-05 16:44:03 +00005093 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005094 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005095 ensureNoSourceVariant(t, ctx, "libfoo")
5096
5097 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005098 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005099 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005100 })
5101
5102 t.Run("prebuilt preferred with source", func(t *testing.T) {
5103 bp := `
5104 prebuilt_apex {
5105 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005106 arch: {
5107 arm64: {
5108 src: "myapex-arm64.apex",
5109 },
5110 arm: {
5111 src: "myapex-arm.apex",
5112 },
5113 },
Paul Duffin39853512021-02-26 11:09:39 +00005114 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005115 }
5116
5117 java_import {
5118 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005119 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005120 jars: ["libfoo.jar"],
5121 }
5122
5123 java_library {
5124 name: "libfoo",
5125 }
Paul Duffin39853512021-02-26 11:09:39 +00005126
5127 java_sdk_library_import {
5128 name: "libbar",
5129 prefer: true,
5130 public: {
5131 jars: ["libbar.jar"],
5132 },
5133 }
5134
5135 java_sdk_library {
5136 name: "libbar",
5137 srcs: ["foo/bar/MyClass.java"],
5138 unsafe_ignore_missing_latest_api: true,
5139 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005140 `
5141
5142 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5143 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5144
Paul Duffin89886cb2021-02-05 16:44:03 +00005145 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005146 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005147 ensureNoSourceVariant(t, ctx, "libfoo")
5148
5149 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005150 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005151 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005152 })
5153}
5154
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005155func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005156 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005157 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005158 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5159 // is disabled.
5160 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5161 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005162
Paul Duffin37856732021-02-26 14:24:15 +00005163 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5164 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01005165 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005166 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005167 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005168 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005169 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005170 foundLibfooJar = true
5171 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005172 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005173 }
5174 }
5175 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005176 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 +00005177 }
5178 }
5179
Paul Duffin40a3f652021-07-19 13:11:24 +01005180 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005181 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005182 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005183 var rule android.TestingBuildParams
5184
5185 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5186 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005187 }
5188
Paul Duffin40a3f652021-07-19 13:11:24 +01005189 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5190 t.Helper()
5191 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5192 var rule android.TestingBuildParams
5193
5194 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5195 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5196 }
5197
Paul Duffin89f570a2021-06-16 01:42:33 +01005198 fragment := java.ApexVariantReference{
5199 Apex: proptools.StringPtr("myapex"),
5200 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5201 }
5202
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005203 t.Run("prebuilt only", func(t *testing.T) {
5204 bp := `
5205 prebuilt_apex {
5206 name: "myapex",
5207 arch: {
5208 arm64: {
5209 src: "myapex-arm64.apex",
5210 },
5211 arm: {
5212 src: "myapex-arm.apex",
5213 },
5214 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005215 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5216 }
5217
5218 prebuilt_bootclasspath_fragment {
5219 name: "my-bootclasspath-fragment",
5220 contents: ["libfoo", "libbar"],
5221 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005222 hidden_api: {
5223 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5224 metadata: "my-bootclasspath-fragment/metadata.csv",
5225 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005226 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5227 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5228 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005229 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005230 }
5231
5232 java_import {
5233 name: "libfoo",
5234 jars: ["libfoo.jar"],
5235 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005236 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005237 }
Paul Duffin37856732021-02-26 14:24:15 +00005238
5239 java_sdk_library_import {
5240 name: "libbar",
5241 public: {
5242 jars: ["libbar.jar"],
5243 },
5244 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005245 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005246 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005247 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005248 `
5249
Paul Duffin89f570a2021-06-16 01:42:33 +01005250 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005251 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5252 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005253
Paul Duffin537ea3d2021-05-14 10:38:00 +01005254 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005255 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005256 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005257 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005258 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5259 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005260 })
5261
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005262 t.Run("apex_set only", func(t *testing.T) {
5263 bp := `
5264 apex_set {
5265 name: "myapex",
5266 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005267 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5268 }
5269
5270 prebuilt_bootclasspath_fragment {
5271 name: "my-bootclasspath-fragment",
5272 contents: ["libfoo", "libbar"],
5273 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005274 hidden_api: {
5275 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5276 metadata: "my-bootclasspath-fragment/metadata.csv",
5277 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005278 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5279 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5280 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005281 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005282 }
5283
5284 java_import {
5285 name: "libfoo",
5286 jars: ["libfoo.jar"],
5287 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005288 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005289 }
5290
5291 java_sdk_library_import {
5292 name: "libbar",
5293 public: {
5294 jars: ["libbar.jar"],
5295 },
5296 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005297 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005298 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005299 }
5300 `
5301
Paul Duffin89f570a2021-06-16 01:42:33 +01005302 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005303 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5304 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5305
Paul Duffin537ea3d2021-05-14 10:38:00 +01005306 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005307 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005308 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005309 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005310 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5311 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005312 })
5313
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005314 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5315 bp := `
5316 prebuilt_apex {
5317 name: "myapex",
5318 arch: {
5319 arm64: {
5320 src: "myapex-arm64.apex",
5321 },
5322 arm: {
5323 src: "myapex-arm.apex",
5324 },
5325 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005326 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5327 }
5328
5329 prebuilt_bootclasspath_fragment {
5330 name: "my-bootclasspath-fragment",
5331 contents: ["libfoo", "libbar"],
5332 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005333 hidden_api: {
5334 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5335 metadata: "my-bootclasspath-fragment/metadata.csv",
5336 index: "my-bootclasspath-fragment/index.csv",
5337 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5338 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5339 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005340 }
5341
5342 java_import {
5343 name: "libfoo",
5344 jars: ["libfoo.jar"],
5345 apex_available: ["myapex"],
5346 }
5347
5348 java_library {
5349 name: "libfoo",
5350 srcs: ["foo/bar/MyClass.java"],
5351 apex_available: ["myapex"],
5352 }
Paul Duffin37856732021-02-26 14:24:15 +00005353
5354 java_sdk_library_import {
5355 name: "libbar",
5356 public: {
5357 jars: ["libbar.jar"],
5358 },
5359 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005360 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005361 }
5362
5363 java_sdk_library {
5364 name: "libbar",
5365 srcs: ["foo/bar/MyClass.java"],
5366 unsafe_ignore_missing_latest_api: true,
5367 apex_available: ["myapex"],
5368 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005369 `
5370
5371 // In this test the source (java_library) libfoo is active since the
5372 // prebuilt (java_import) defaults to prefer:false. However the
5373 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5374 // find the dex boot jar in it. We either need to disable the source libfoo
5375 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005376 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005377 // dexbootjar check is skipped if AllowMissingDependencies is true
5378 preparerAllowMissingDeps := android.GroupFixturePreparers(
5379 preparer,
5380 android.PrepareForTestWithAllowMissingDependencies,
5381 )
5382 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005383 })
5384
5385 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5386 bp := `
5387 prebuilt_apex {
5388 name: "myapex",
5389 arch: {
5390 arm64: {
5391 src: "myapex-arm64.apex",
5392 },
5393 arm: {
5394 src: "myapex-arm.apex",
5395 },
5396 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005397 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5398 }
5399
5400 prebuilt_bootclasspath_fragment {
5401 name: "my-bootclasspath-fragment",
5402 contents: ["libfoo", "libbar"],
5403 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005404 hidden_api: {
5405 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5406 metadata: "my-bootclasspath-fragment/metadata.csv",
5407 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005408 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5409 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5410 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005411 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 }
5413
5414 java_import {
5415 name: "libfoo",
5416 prefer: true,
5417 jars: ["libfoo.jar"],
5418 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005419 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 }
5421
5422 java_library {
5423 name: "libfoo",
5424 srcs: ["foo/bar/MyClass.java"],
5425 apex_available: ["myapex"],
5426 }
Paul Duffin37856732021-02-26 14:24:15 +00005427
5428 java_sdk_library_import {
5429 name: "libbar",
5430 prefer: true,
5431 public: {
5432 jars: ["libbar.jar"],
5433 },
5434 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005435 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005436 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005437 }
5438
5439 java_sdk_library {
5440 name: "libbar",
5441 srcs: ["foo/bar/MyClass.java"],
5442 unsafe_ignore_missing_latest_api: true,
5443 apex_available: ["myapex"],
5444 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005445 `
5446
Paul Duffin89f570a2021-06-16 01:42:33 +01005447 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005448 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5449 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005450
Paul Duffin537ea3d2021-05-14 10:38:00 +01005451 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005452 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005453 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005454 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005455 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5456 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 })
5458
5459 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5460 bp := `
5461 apex {
5462 name: "myapex",
5463 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005464 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005465 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466 }
5467
5468 apex_key {
5469 name: "myapex.key",
5470 public_key: "testkey.avbpubkey",
5471 private_key: "testkey.pem",
5472 }
5473
5474 prebuilt_apex {
5475 name: "myapex",
5476 arch: {
5477 arm64: {
5478 src: "myapex-arm64.apex",
5479 },
5480 arm: {
5481 src: "myapex-arm.apex",
5482 },
5483 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005484 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5485 }
5486
5487 prebuilt_bootclasspath_fragment {
5488 name: "my-bootclasspath-fragment",
5489 contents: ["libfoo", "libbar"],
5490 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005491 hidden_api: {
5492 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5493 metadata: "my-bootclasspath-fragment/metadata.csv",
5494 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005495 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5496 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5497 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005498 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 }
5500
5501 java_import {
5502 name: "libfoo",
5503 jars: ["libfoo.jar"],
5504 apex_available: ["myapex"],
5505 }
5506
5507 java_library {
5508 name: "libfoo",
5509 srcs: ["foo/bar/MyClass.java"],
5510 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005511 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005512 }
Paul Duffin37856732021-02-26 14:24:15 +00005513
5514 java_sdk_library_import {
5515 name: "libbar",
5516 public: {
5517 jars: ["libbar.jar"],
5518 },
5519 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005520 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005521 }
5522
5523 java_sdk_library {
5524 name: "libbar",
5525 srcs: ["foo/bar/MyClass.java"],
5526 unsafe_ignore_missing_latest_api: true,
5527 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005528 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005529 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005530 `
5531
Paul Duffin89f570a2021-06-16 01:42:33 +01005532 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005533 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5534 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005535
Paul Duffin537ea3d2021-05-14 10:38:00 +01005536 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005537 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005538 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005539 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005540 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5541 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005542 })
5543
5544 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5545 bp := `
5546 apex {
5547 name: "myapex",
5548 enabled: false,
5549 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005550 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005551 }
5552
5553 apex_key {
5554 name: "myapex.key",
5555 public_key: "testkey.avbpubkey",
5556 private_key: "testkey.pem",
5557 }
5558
5559 prebuilt_apex {
5560 name: "myapex",
5561 arch: {
5562 arm64: {
5563 src: "myapex-arm64.apex",
5564 },
5565 arm: {
5566 src: "myapex-arm.apex",
5567 },
5568 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005569 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5570 }
5571
5572 prebuilt_bootclasspath_fragment {
5573 name: "my-bootclasspath-fragment",
5574 contents: ["libfoo", "libbar"],
5575 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005576 hidden_api: {
5577 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5578 metadata: "my-bootclasspath-fragment/metadata.csv",
5579 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005580 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5581 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5582 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005583 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005584 }
5585
5586 java_import {
5587 name: "libfoo",
5588 prefer: true,
5589 jars: ["libfoo.jar"],
5590 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005591 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005592 }
5593
5594 java_library {
5595 name: "libfoo",
5596 srcs: ["foo/bar/MyClass.java"],
5597 apex_available: ["myapex"],
5598 }
Paul Duffin37856732021-02-26 14:24:15 +00005599
5600 java_sdk_library_import {
5601 name: "libbar",
5602 prefer: true,
5603 public: {
5604 jars: ["libbar.jar"],
5605 },
5606 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005607 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005608 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005609 }
5610
5611 java_sdk_library {
5612 name: "libbar",
5613 srcs: ["foo/bar/MyClass.java"],
5614 unsafe_ignore_missing_latest_api: true,
5615 apex_available: ["myapex"],
5616 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 `
5618
Paul Duffin89f570a2021-06-16 01:42:33 +01005619 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005620 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5621 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005622
Paul Duffin537ea3d2021-05-14 10:38:00 +01005623 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005624 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005625 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005626 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005627 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5628 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005629 })
5630}
5631
Roland Levillain630846d2019-06-26 12:48:34 +01005632func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005633 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005634 apex_test {
5635 name: "myapex",
5636 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005637 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005638 tests: [
5639 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005640 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005641 ],
5642 }
5643
5644 apex_key {
5645 name: "myapex.key",
5646 public_key: "testkey.avbpubkey",
5647 private_key: "testkey.pem",
5648 }
5649
Liz Kammer1c14a212020-05-12 15:26:55 -07005650 filegroup {
5651 name: "fg",
5652 srcs: [
5653 "baz",
5654 "bar/baz"
5655 ],
5656 }
5657
Roland Levillain630846d2019-06-26 12:48:34 +01005658 cc_test {
5659 name: "mytest",
5660 gtest: false,
5661 srcs: ["mytest.cpp"],
5662 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005663 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005664 system_shared_libs: [],
5665 static_executable: true,
5666 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005667 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005668 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005669
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005670 cc_library {
5671 name: "mylib",
5672 srcs: ["mylib.cpp"],
5673 system_shared_libs: [],
5674 stl: "none",
5675 }
5676
Liz Kammer5bd365f2020-05-27 15:15:11 -07005677 filegroup {
5678 name: "fg2",
5679 srcs: [
5680 "testdata/baz"
5681 ],
5682 }
5683
Roland Levillain9b5fde92019-06-28 15:41:19 +01005684 cc_test {
5685 name: "mytests",
5686 gtest: false,
5687 srcs: [
5688 "mytest1.cpp",
5689 "mytest2.cpp",
5690 "mytest3.cpp",
5691 ],
5692 test_per_src: true,
5693 relative_install_path: "test",
5694 system_shared_libs: [],
5695 static_executable: true,
5696 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005697 data: [
5698 ":fg",
5699 ":fg2",
5700 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005701 }
Roland Levillain630846d2019-06-26 12:48:34 +01005702 `)
5703
Sundong Ahnabb64432019-10-22 13:58:29 +09005704 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005705 copyCmds := apexRule.Args["copy_commands"]
5706
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005707 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005708 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005709 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005710
Liz Kammer1c14a212020-05-12 15:26:55 -07005711 //Ensure that test data are copied into apex.
5712 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5713 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5714
Roland Levillain9b5fde92019-06-28 15:41:19 +01005715 // Ensure that test deps built with `test_per_src` are copied into apex.
5716 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5717 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5718 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005719
5720 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005721 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005722 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005723 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005724 prefix := "TARGET_"
5725 var builder strings.Builder
5726 data.Custom(&builder, name, prefix, "", data)
5727 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005728 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5729 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5730 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5731 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
5732 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
5733 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005734 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005735
5736 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005737 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005738 data.Custom(&builder, name, prefix, "", data)
5739 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005740 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5741 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005742}
5743
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005744func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005745 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005746 apex {
5747 name: "myapex",
5748 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005749 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005750 }
5751 apex_key {
5752 name: "myapex.key",
5753 public_key: "testkey.avbpubkey",
5754 private_key: "testkey.pem",
5755 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005756 `,
5757 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5758 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5759 }),
5760 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005761 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00005762 ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005763 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005764 var builder strings.Builder
5765 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5766 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005767 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005768}
5769
Jooyung Hand48f3c32019-08-23 11:18:57 +09005770func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5771 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5772 apex {
5773 name: "myapex",
5774 key: "myapex.key",
5775 native_shared_libs: ["libfoo"],
5776 }
5777
5778 apex_key {
5779 name: "myapex.key",
5780 public_key: "testkey.avbpubkey",
5781 private_key: "testkey.pem",
5782 }
5783
5784 cc_library {
5785 name: "libfoo",
5786 stl: "none",
5787 system_shared_libs: [],
5788 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005789 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005790 }
5791 `)
5792 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5793 apex {
5794 name: "myapex",
5795 key: "myapex.key",
5796 java_libs: ["myjar"],
5797 }
5798
5799 apex_key {
5800 name: "myapex.key",
5801 public_key: "testkey.avbpubkey",
5802 private_key: "testkey.pem",
5803 }
5804
5805 java_library {
5806 name: "myjar",
5807 srcs: ["foo/bar/MyClass.java"],
5808 sdk_version: "none",
5809 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005810 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005811 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005812 }
5813 `)
5814}
5815
Bill Peckhama41a6962021-01-11 10:58:54 -08005816func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005817 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005818 apex {
5819 name: "myapex",
5820 key: "myapex.key",
5821 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005822 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005823 }
5824
5825 apex_key {
5826 name: "myapex.key",
5827 public_key: "testkey.avbpubkey",
5828 private_key: "testkey.pem",
5829 }
5830
5831 java_import {
5832 name: "myjavaimport",
5833 apex_available: ["myapex"],
5834 jars: ["my.jar"],
5835 compile_dex: true,
5836 }
5837 `)
5838
5839 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5840 apexRule := module.Rule("apexRule")
5841 copyCmds := apexRule.Args["copy_commands"]
5842 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5843}
5844
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005845func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005846 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005847 apex {
5848 name: "myapex",
5849 key: "myapex.key",
5850 apps: [
5851 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005852 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005853 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005854 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005855 }
5856
5857 apex_key {
5858 name: "myapex.key",
5859 public_key: "testkey.avbpubkey",
5860 private_key: "testkey.pem",
5861 }
5862
5863 android_app {
5864 name: "AppFoo",
5865 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005866 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005867 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005868 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005869 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005870 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005871 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005872
5873 android_app {
5874 name: "AppFooPriv",
5875 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005876 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005877 system_modules: "none",
5878 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005879 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005880 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005881 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005882
5883 cc_library_shared {
5884 name: "libjni",
5885 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005886 shared_libs: ["libfoo"],
5887 stl: "none",
5888 system_shared_libs: [],
5889 apex_available: [ "myapex" ],
5890 sdk_version: "current",
5891 }
5892
5893 cc_library_shared {
5894 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005895 stl: "none",
5896 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005897 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005898 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005899 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005900 `)
5901
Sundong Ahnabb64432019-10-22 13:58:29 +09005902 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005903 apexRule := module.Rule("apexRule")
5904 copyCmds := apexRule.Args["copy_commands"]
5905
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005906 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5907 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005908
Colin Crossaede88c2020-08-11 12:17:01 -07005909 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005910 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005911 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005912 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005913 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005914 // JNI libraries including transitive deps are
5915 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005916 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005917 // ... embedded inside APK (jnilibs.zip)
5918 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5919 // ... and not directly inside the APEX
5920 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5921 }
Dario Frenicde2a032019-10-27 00:29:22 +01005922}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005923
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005924func TestApexWithAppImportBuildId(t *testing.T) {
5925 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5926 for _, id := range invalidBuildIds {
5927 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5928 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5929 variables.BuildId = proptools.StringPtr(id)
5930 })
5931 testApexError(t, message, `apex {
5932 name: "myapex",
5933 key: "myapex.key",
5934 apps: ["AppFooPrebuilt"],
5935 updatable: false,
5936 }
5937
5938 apex_key {
5939 name: "myapex.key",
5940 public_key: "testkey.avbpubkey",
5941 private_key: "testkey.pem",
5942 }
5943
5944 android_app_import {
5945 name: "AppFooPrebuilt",
5946 apk: "PrebuiltAppFoo.apk",
5947 presigned: true,
5948 apex_available: ["myapex"],
5949 }
5950 `, fixture)
5951 }
5952}
5953
Dario Frenicde2a032019-10-27 00:29:22 +01005954func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005955 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005956 apex {
5957 name: "myapex",
5958 key: "myapex.key",
5959 apps: [
5960 "AppFooPrebuilt",
5961 "AppFooPrivPrebuilt",
5962 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005963 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005964 }
5965
5966 apex_key {
5967 name: "myapex.key",
5968 public_key: "testkey.avbpubkey",
5969 private_key: "testkey.pem",
5970 }
5971
5972 android_app_import {
5973 name: "AppFooPrebuilt",
5974 apk: "PrebuiltAppFoo.apk",
5975 presigned: true,
5976 dex_preopt: {
5977 enabled: false,
5978 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005979 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005980 }
5981
5982 android_app_import {
5983 name: "AppFooPrivPrebuilt",
5984 apk: "PrebuiltAppFooPriv.apk",
5985 privileged: true,
5986 presigned: true,
5987 dex_preopt: {
5988 enabled: false,
5989 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005990 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005991 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005992 }
5993 `)
5994
Sundong Ahnabb64432019-10-22 13:58:29 +09005995 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005996 apexRule := module.Rule("apexRule")
5997 copyCmds := apexRule.Args["copy_commands"]
5998
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005999 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6000 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006001}
6002
6003func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006004 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006005 apex {
6006 name: "myapex",
6007 key: "myapex.key",
6008 apps: [
6009 "AppFoo",
6010 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006011 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006012 }
6013
6014 apex_key {
6015 name: "myapex.key",
6016 public_key: "testkey.avbpubkey",
6017 private_key: "testkey.pem",
6018 }
6019
6020 android_app {
6021 name: "AppFoo",
6022 srcs: ["foo/bar/MyClass.java"],
6023 sdk_version: "none",
6024 system_modules: "none",
6025 apex_available: [ "myapex" ],
6026 }
6027
6028 android_app_import {
6029 name: "AppFoo",
6030 apk: "AppFooPrebuilt.apk",
6031 filename: "AppFooPrebuilt.apk",
6032 presigned: true,
6033 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006034 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006035 }
6036 `, withFiles(map[string][]byte{
6037 "AppFooPrebuilt.apk": nil,
6038 }))
6039
6040 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006041 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006042 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006043}
6044
Dario Freni6f3937c2019-12-20 22:58:03 +00006045func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006046 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006047 apex {
6048 name: "myapex",
6049 key: "myapex.key",
6050 apps: [
6051 "TesterHelpAppFoo",
6052 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006053 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006054 }
6055
6056 apex_key {
6057 name: "myapex.key",
6058 public_key: "testkey.avbpubkey",
6059 private_key: "testkey.pem",
6060 }
6061
6062 android_test_helper_app {
6063 name: "TesterHelpAppFoo",
6064 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006065 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006066 }
6067
6068 `)
6069
6070 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6071 apexRule := module.Rule("apexRule")
6072 copyCmds := apexRule.Args["copy_commands"]
6073
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006074 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006075}
6076
Jooyung Han18020ea2019-11-13 10:50:48 +09006077func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6078 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006079 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006080 apex {
6081 name: "myapex",
6082 key: "myapex.key",
6083 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006084 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006085 }
6086
6087 apex_key {
6088 name: "myapex.key",
6089 public_key: "testkey.avbpubkey",
6090 private_key: "testkey.pem",
6091 }
6092
6093 apex {
6094 name: "otherapex",
6095 key: "myapex.key",
6096 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006097 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006098 }
6099
6100 cc_defaults {
6101 name: "libfoo-defaults",
6102 apex_available: ["otherapex"],
6103 }
6104
6105 cc_library {
6106 name: "libfoo",
6107 defaults: ["libfoo-defaults"],
6108 stl: "none",
6109 system_shared_libs: [],
6110 }`)
6111}
6112
Paul Duffine52e66f2020-03-30 17:54:29 +01006113func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006114 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006115 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006116 apex {
6117 name: "myapex",
6118 key: "myapex.key",
6119 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006120 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
6129 apex {
6130 name: "otherapex",
6131 key: "otherapex.key",
6132 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006133 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006134 }
6135
6136 apex_key {
6137 name: "otherapex.key",
6138 public_key: "testkey.avbpubkey",
6139 private_key: "testkey.pem",
6140 }
6141
6142 cc_library {
6143 name: "libfoo",
6144 stl: "none",
6145 system_shared_libs: [],
6146 apex_available: ["otherapex"],
6147 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006148}
Jiyong Park127b40b2019-09-30 16:04:35 +09006149
Paul Duffine52e66f2020-03-30 17:54:29 +01006150func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006151 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006152 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006153.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006154.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006155.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006156.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006157.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006158.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006159 apex {
6160 name: "myapex",
6161 key: "myapex.key",
6162 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006163 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
Jiyong Park127b40b2019-09-30 16:04:35 +09006172 cc_library {
6173 name: "libfoo",
6174 stl: "none",
6175 shared_libs: ["libbar"],
6176 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006177 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006178 }
6179
6180 cc_library {
6181 name: "libbar",
6182 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006183 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006184 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006185 apex_available: ["myapex"],
6186 }
6187
6188 cc_library {
6189 name: "libbaz",
6190 stl: "none",
6191 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006192 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006193}
Jiyong Park127b40b2019-09-30 16:04:35 +09006194
Paul Duffine52e66f2020-03-30 17:54:29 +01006195func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006196 testApexError(t, "\"otherapex\" is not a valid module name", `
6197 apex {
6198 name: "myapex",
6199 key: "myapex.key",
6200 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006201 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 cc_library {
6211 name: "libfoo",
6212 stl: "none",
6213 system_shared_libs: [],
6214 apex_available: ["otherapex"],
6215 }`)
6216
Paul Duffine52e66f2020-03-30 17:54:29 +01006217 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006218 apex {
6219 name: "myapex",
6220 key: "myapex.key",
6221 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006222 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 cc_library {
6232 name: "libfoo",
6233 stl: "none",
6234 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006235 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 apex_available: ["myapex"],
6237 }
6238
6239 cc_library {
6240 name: "libbar",
6241 stl: "none",
6242 system_shared_libs: [],
6243 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006244 }
6245
6246 cc_library {
6247 name: "libbaz",
6248 stl: "none",
6249 system_shared_libs: [],
6250 stubs: {
6251 versions: ["10", "20", "30"],
6252 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006254}
Jiyong Park127b40b2019-09-30 16:04:35 +09006255
Jiyong Park89e850a2020-04-07 16:37:39 +09006256func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006257 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006258 apex {
6259 name: "myapex",
6260 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006261 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006262 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006263 }
6264
6265 apex_key {
6266 name: "myapex.key",
6267 public_key: "testkey.avbpubkey",
6268 private_key: "testkey.pem",
6269 }
6270
6271 cc_library {
6272 name: "libfoo",
6273 stl: "none",
6274 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006275 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006276 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006277 }
6278
6279 cc_library {
6280 name: "libfoo2",
6281 stl: "none",
6282 system_shared_libs: [],
6283 shared_libs: ["libbaz"],
6284 apex_available: ["//apex_available:platform"],
6285 }
6286
6287 cc_library {
6288 name: "libbar",
6289 stl: "none",
6290 system_shared_libs: [],
6291 apex_available: ["myapex"],
6292 }
6293
6294 cc_library {
6295 name: "libbaz",
6296 stl: "none",
6297 system_shared_libs: [],
6298 apex_available: ["myapex"],
6299 stubs: {
6300 versions: ["1"],
6301 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006302 }`)
6303
Jiyong Park89e850a2020-04-07 16:37:39 +09006304 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6305 // because it depends on libbar which isn't available to platform
6306 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6307 if libfoo.NotAvailableForPlatform() != true {
6308 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6309 }
6310
6311 // libfoo2 however can be available to platform because it depends on libbaz which provides
6312 // stubs
6313 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6314 if libfoo2.NotAvailableForPlatform() == true {
6315 t.Errorf("%q should be available to platform", libfoo2.String())
6316 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006317}
Jiyong Parka90ca002019-10-07 15:47:24 +09006318
Paul Duffine52e66f2020-03-30 17:54:29 +01006319func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006320 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006321 apex {
6322 name: "myapex",
6323 key: "myapex.key",
6324 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006325 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006326 }
6327
6328 apex_key {
6329 name: "myapex.key",
6330 public_key: "testkey.avbpubkey",
6331 private_key: "testkey.pem",
6332 }
6333
6334 cc_library {
6335 name: "libfoo",
6336 stl: "none",
6337 system_shared_libs: [],
6338 apex_available: ["myapex"],
6339 static: {
6340 apex_available: ["//apex_available:platform"],
6341 },
6342 }`)
6343
Jiyong Park89e850a2020-04-07 16:37:39 +09006344 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6345 if libfooShared.NotAvailableForPlatform() != true {
6346 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6347 }
6348 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6349 if libfooStatic.NotAvailableForPlatform() != false {
6350 t.Errorf("%q should be available to platform", libfooStatic.String())
6351 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006352}
6353
Jiyong Park5d790c32019-11-15 18:40:32 +09006354func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006355 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006356 apex {
6357 name: "myapex",
6358 key: "myapex.key",
6359 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006360 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006361 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006362 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006363 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09006364 }
6365
6366 override_apex {
6367 name: "override_myapex",
6368 base: "myapex",
6369 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08006370 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006371 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006372 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006373 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006374 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006375 key: "mynewapex.key",
6376 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006377 }
6378
6379 apex_key {
6380 name: "myapex.key",
6381 public_key: "testkey.avbpubkey",
6382 private_key: "testkey.pem",
6383 }
6384
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006385 apex_key {
6386 name: "mynewapex.key",
6387 public_key: "testkey2.avbpubkey",
6388 private_key: "testkey2.pem",
6389 }
6390
6391 android_app_certificate {
6392 name: "myapex.certificate",
6393 certificate: "testkey",
6394 }
6395
Jiyong Park5d790c32019-11-15 18:40:32 +09006396 android_app {
6397 name: "app",
6398 srcs: ["foo/bar/MyClass.java"],
6399 package_name: "foo",
6400 sdk_version: "none",
6401 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006402 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006403 }
6404
6405 override_android_app {
6406 name: "override_app",
6407 base: "app",
6408 package_name: "bar",
6409 }
markchien7c803b82021-08-26 22:10:06 +08006410
6411 bpf {
6412 name: "bpf",
6413 srcs: ["bpf.c"],
6414 }
6415
6416 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08006417 name: "overrideBpf",
6418 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08006419 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006420
6421 prebuilt_etc {
6422 name: "myetc",
6423 src: "myprebuilt",
6424 }
6425
6426 prebuilt_etc {
6427 name: "override_myetc",
6428 src: "override_myprebuilt",
6429 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006430 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006431
Jiyong Park317645e2019-12-05 13:20:58 +09006432 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6433 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6434 if originalVariant.GetOverriddenBy() != "" {
6435 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6436 }
6437 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6438 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6439 }
6440
Jiyong Park5d790c32019-11-15 18:40:32 +09006441 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6442 apexRule := module.Rule("apexRule")
6443 copyCmds := apexRule.Args["copy_commands"]
6444
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006445 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
6446 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006447
markchien7c803b82021-08-26 22:10:06 +08006448 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08006449 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08006450
Daniel Norman5a3ce132021-08-26 15:44:43 -07006451 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6452 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6453
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006454 apexBundle := module.Module().(*apexBundle)
6455 name := apexBundle.Name()
6456 if name != "override_myapex" {
6457 t.Errorf("name should be \"override_myapex\", but was %q", name)
6458 }
6459
Baligh Uddin004d7172020-02-19 21:29:28 -08006460 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6461 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6462 }
6463
Jiyong Park20bacab2020-03-03 11:45:41 +09006464 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006465 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006466 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6467
6468 signApkRule := module.Rule("signapk")
6469 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006470
Colin Crossaa255532020-07-03 13:18:24 -07006471 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006472 var builder strings.Builder
6473 data.Custom(&builder, name, "TARGET_", "", data)
6474 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006475 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
6476 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
6477 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006478 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006479 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006480 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006481 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006482 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006483 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6484 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006485}
6486
Albert Martineefabcf2022-03-21 20:11:16 +00006487func TestMinSdkVersionOverride(t *testing.T) {
6488 // Override from 29 to 31
6489 minSdkOverride31 := "31"
6490 ctx := testApex(t, `
6491 apex {
6492 name: "myapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["mylib"],
6495 updatable: true,
6496 min_sdk_version: "29"
6497 }
6498
6499 override_apex {
6500 name: "override_myapex",
6501 base: "myapex",
6502 logging_parent: "com.foo.bar",
6503 package_name: "test.overridden.package"
6504 }
6505
6506 apex_key {
6507 name: "myapex.key",
6508 public_key: "testkey.avbpubkey",
6509 private_key: "testkey.pem",
6510 }
6511
6512 cc_library {
6513 name: "mylib",
6514 srcs: ["mylib.cpp"],
6515 runtime_libs: ["libbar"],
6516 system_shared_libs: [],
6517 stl: "none",
6518 apex_available: [ "myapex" ],
6519 min_sdk_version: "apex_inherit"
6520 }
6521
6522 cc_library {
6523 name: "libbar",
6524 srcs: ["mylib.cpp"],
6525 system_shared_libs: [],
6526 stl: "none",
6527 apex_available: [ "myapex" ],
6528 min_sdk_version: "apex_inherit"
6529 }
6530
6531 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
6532
6533 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6534 copyCmds := apexRule.Args["copy_commands"]
6535
6536 // Ensure that direct non-stubs dep is always included
6537 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6538
6539 // Ensure that runtime_libs dep in included
6540 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6541
6542 // Ensure libraries target overridden min_sdk_version value
6543 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6544}
6545
6546func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
6547 // Attempt to override from 31 to 29, should be a NOOP
6548 minSdkOverride29 := "29"
6549 ctx := testApex(t, `
6550 apex {
6551 name: "myapex",
6552 key: "myapex.key",
6553 native_shared_libs: ["mylib"],
6554 updatable: true,
6555 min_sdk_version: "31"
6556 }
6557
6558 override_apex {
6559 name: "override_myapex",
6560 base: "myapex",
6561 logging_parent: "com.foo.bar",
6562 package_name: "test.overridden.package"
6563 }
6564
6565 apex_key {
6566 name: "myapex.key",
6567 public_key: "testkey.avbpubkey",
6568 private_key: "testkey.pem",
6569 }
6570
6571 cc_library {
6572 name: "mylib",
6573 srcs: ["mylib.cpp"],
6574 runtime_libs: ["libbar"],
6575 system_shared_libs: [],
6576 stl: "none",
6577 apex_available: [ "myapex" ],
6578 min_sdk_version: "apex_inherit"
6579 }
6580
6581 cc_library {
6582 name: "libbar",
6583 srcs: ["mylib.cpp"],
6584 system_shared_libs: [],
6585 stl: "none",
6586 apex_available: [ "myapex" ],
6587 min_sdk_version: "apex_inherit"
6588 }
6589
6590 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
6591
6592 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
6593 copyCmds := apexRule.Args["copy_commands"]
6594
6595 // Ensure that direct non-stubs dep is always included
6596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
6597
6598 // Ensure that runtime_libs dep in included
6599 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
6600
6601 // Ensure libraries target the original min_sdk_version value rather than the overridden
6602 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
6603}
6604
Jooyung Han214bf372019-11-12 13:03:50 +09006605func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006606 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006607 apex {
6608 name: "myapex",
6609 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006610 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006611 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006612 }
6613
6614 apex_key {
6615 name: "myapex.key",
6616 public_key: "testkey.avbpubkey",
6617 private_key: "testkey.pem",
6618 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006619
6620 cc_library {
6621 name: "mylib",
6622 srcs: ["mylib.cpp"],
6623 stl: "libc++",
6624 system_shared_libs: [],
6625 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006626 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006627 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006628 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006629
6630 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6631 args := module.Rule("apexRule").Args
6632 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006633 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006634
6635 // The copies of the libraries in the apex should have one more dependency than
6636 // the ones outside the apex, namely the unwinder. Ideally we should check
6637 // the dependency names directly here but for some reason the names are blank in
6638 // this test.
6639 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006640 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006641 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6642 if len(apexImplicits) != len(nonApexImplicits)+1 {
6643 t.Errorf("%q missing unwinder dep", lib)
6644 }
6645 }
Jooyung Han214bf372019-11-12 13:03:50 +09006646}
6647
Paul Duffine05480a2021-03-08 15:07:14 +00006648var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006649 "api/current.txt": nil,
6650 "api/removed.txt": nil,
6651 "api/system-current.txt": nil,
6652 "api/system-removed.txt": nil,
6653 "api/test-current.txt": nil,
6654 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006655
Anton Hanssondff2c782020-12-21 17:10:01 +00006656 "100/public/api/foo.txt": nil,
6657 "100/public/api/foo-removed.txt": nil,
6658 "100/system/api/foo.txt": nil,
6659 "100/system/api/foo-removed.txt": nil,
6660
Paul Duffineedc5d52020-06-12 17:46:39 +01006661 // For java_sdk_library_import
6662 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006663}
6664
Jooyung Han58f26ab2019-12-18 15:34:32 +09006665func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006666 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006667 apex {
6668 name: "myapex",
6669 key: "myapex.key",
6670 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006671 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006672 }
6673
6674 apex_key {
6675 name: "myapex.key",
6676 public_key: "testkey.avbpubkey",
6677 private_key: "testkey.pem",
6678 }
6679
6680 java_sdk_library {
6681 name: "foo",
6682 srcs: ["a.java"],
6683 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006684 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006685 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006686
6687 prebuilt_apis {
6688 name: "sdk",
6689 api_dirs: ["100"],
6690 }
Paul Duffin9b879592020-05-26 13:21:35 +01006691 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006692
6693 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006694 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006695 "javalib/foo.jar",
6696 "etc/permissions/foo.xml",
6697 })
6698 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006699 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00006700 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 +09006701}
6702
Paul Duffin9b879592020-05-26 13:21:35 +01006703func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006704 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006705 apex {
6706 name: "myapex",
6707 key: "myapex.key",
6708 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006709 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006710 }
6711
6712 apex_key {
6713 name: "myapex.key",
6714 public_key: "testkey.avbpubkey",
6715 private_key: "testkey.pem",
6716 }
6717
6718 java_sdk_library {
6719 name: "foo",
6720 srcs: ["a.java"],
6721 api_packages: ["foo"],
6722 apex_available: ["myapex"],
6723 sdk_version: "none",
6724 system_modules: "none",
6725 }
6726
6727 java_library {
6728 name: "bar",
6729 srcs: ["a.java"],
6730 libs: ["foo"],
6731 apex_available: ["myapex"],
6732 sdk_version: "none",
6733 system_modules: "none",
6734 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006735
6736 prebuilt_apis {
6737 name: "sdk",
6738 api_dirs: ["100"],
6739 }
Paul Duffin9b879592020-05-26 13:21:35 +01006740 `, withFiles(filesForSdkLibrary))
6741
6742 // java_sdk_library installs both impl jar and permission XML
6743 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6744 "javalib/bar.jar",
6745 "javalib/foo.jar",
6746 "etc/permissions/foo.xml",
6747 })
6748
6749 // The bar library should depend on the implementation jar.
6750 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006751 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006752 t.Errorf("expected %q, found %#q", expected, actual)
6753 }
6754}
6755
6756func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006757 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006758 apex {
6759 name: "myapex",
6760 key: "myapex.key",
6761 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006762 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 java_sdk_library {
6772 name: "foo",
6773 srcs: ["a.java"],
6774 api_packages: ["foo"],
6775 apex_available: ["myapex"],
6776 sdk_version: "none",
6777 system_modules: "none",
6778 }
6779
6780 java_library {
6781 name: "bar",
6782 srcs: ["a.java"],
6783 libs: ["foo"],
6784 sdk_version: "none",
6785 system_modules: "none",
6786 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006787
6788 prebuilt_apis {
6789 name: "sdk",
6790 api_dirs: ["100"],
6791 }
Paul Duffin9b879592020-05-26 13:21:35 +01006792 `, withFiles(filesForSdkLibrary))
6793
6794 // java_sdk_library installs both impl jar and permission XML
6795 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6796 "javalib/foo.jar",
6797 "etc/permissions/foo.xml",
6798 })
6799
6800 // The bar library should depend on the stubs jar.
6801 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006802 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006803 t.Errorf("expected %q, found %#q", expected, actual)
6804 }
6805}
6806
Paul Duffineedc5d52020-06-12 17:46:39 +01006807func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006808 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006809 prebuilt_apis {
6810 name: "sdk",
6811 api_dirs: ["100"],
6812 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006813 withFiles(map[string][]byte{
6814 "apex/a.java": nil,
6815 "apex/apex_manifest.json": nil,
6816 "apex/Android.bp": []byte(`
6817 package {
6818 default_visibility: ["//visibility:private"],
6819 }
6820
6821 apex {
6822 name: "myapex",
6823 key: "myapex.key",
6824 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006825 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006826 }
6827
6828 apex_key {
6829 name: "myapex.key",
6830 public_key: "testkey.avbpubkey",
6831 private_key: "testkey.pem",
6832 }
6833
6834 java_library {
6835 name: "bar",
6836 srcs: ["a.java"],
6837 libs: ["foo"],
6838 apex_available: ["myapex"],
6839 sdk_version: "none",
6840 system_modules: "none",
6841 }
6842`),
6843 "source/a.java": nil,
6844 "source/api/current.txt": nil,
6845 "source/api/removed.txt": nil,
6846 "source/Android.bp": []byte(`
6847 package {
6848 default_visibility: ["//visibility:private"],
6849 }
6850
6851 java_sdk_library {
6852 name: "foo",
6853 visibility: ["//apex"],
6854 srcs: ["a.java"],
6855 api_packages: ["foo"],
6856 apex_available: ["myapex"],
6857 sdk_version: "none",
6858 system_modules: "none",
6859 public: {
6860 enabled: true,
6861 },
6862 }
6863`),
6864 "prebuilt/a.jar": nil,
6865 "prebuilt/Android.bp": []byte(`
6866 package {
6867 default_visibility: ["//visibility:private"],
6868 }
6869
6870 java_sdk_library_import {
6871 name: "foo",
6872 visibility: ["//apex", "//source"],
6873 apex_available: ["myapex"],
6874 prefer: true,
6875 public: {
6876 jars: ["a.jar"],
6877 },
6878 }
6879`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006880 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006881 )
6882
6883 // java_sdk_library installs both impl jar and permission XML
6884 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6885 "javalib/bar.jar",
6886 "javalib/foo.jar",
6887 "etc/permissions/foo.xml",
6888 })
6889
6890 // The bar library should depend on the implementation jar.
6891 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006892 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006893 t.Errorf("expected %q, found %#q", expected, actual)
6894 }
6895}
6896
6897func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6898 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6899 apex {
6900 name: "myapex",
6901 key: "myapex.key",
6902 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006903 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006904 }
6905
6906 apex_key {
6907 name: "myapex.key",
6908 public_key: "testkey.avbpubkey",
6909 private_key: "testkey.pem",
6910 }
6911
6912 java_sdk_library_import {
6913 name: "foo",
6914 apex_available: ["myapex"],
6915 prefer: true,
6916 public: {
6917 jars: ["a.jar"],
6918 },
6919 }
6920
6921 `, withFiles(filesForSdkLibrary))
6922}
6923
atrost6e126252020-01-27 17:01:16 +00006924func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006925 result := android.GroupFixturePreparers(
6926 prepareForApexTest,
6927 java.PrepareForTestWithPlatformCompatConfig,
6928 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006929 apex {
6930 name: "myapex",
6931 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006932 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006933 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006934 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006935 }
6936
6937 apex_key {
6938 name: "myapex.key",
6939 public_key: "testkey.avbpubkey",
6940 private_key: "testkey.pem",
6941 }
6942
6943 platform_compat_config {
6944 name: "myjar-platform-compat-config",
6945 src: ":myjar",
6946 }
6947
6948 java_library {
6949 name: "myjar",
6950 srcs: ["foo/bar/MyClass.java"],
6951 sdk_version: "none",
6952 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006953 apex_available: [ "myapex" ],
6954 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006955
6956 // Make sure that a preferred prebuilt does not affect the apex contents.
6957 prebuilt_platform_compat_config {
6958 name: "myjar-platform-compat-config",
6959 metadata: "compat-config/metadata.xml",
6960 prefer: true,
6961 }
atrost6e126252020-01-27 17:01:16 +00006962 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006963 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006964 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6965 "etc/compatconfig/myjar-platform-compat-config.xml",
6966 "javalib/myjar.jar",
6967 })
6968}
6969
Jooyung Han862c0d62022-12-21 10:15:37 +09006970func TestNoDupeApexFiles(t *testing.T) {
6971 android.GroupFixturePreparers(
6972 android.PrepareForTestWithAndroidBuildComponents,
6973 PrepareForTestWithApexBuildComponents,
6974 prepareForTestWithMyapex,
6975 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
6976 ).
6977 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
6978 RunTestWithBp(t, `
6979 apex {
6980 name: "myapex",
6981 key: "myapex.key",
6982 prebuilts: ["foo", "bar"],
6983 updatable: false,
6984 }
6985
6986 apex_key {
6987 name: "myapex.key",
6988 public_key: "testkey.avbpubkey",
6989 private_key: "testkey.pem",
6990 }
6991
6992 prebuilt_etc {
6993 name: "foo",
6994 src: "myprebuilt",
6995 filename_from_src: true,
6996 }
6997
6998 prebuilt_etc {
6999 name: "bar",
7000 src: "myprebuilt",
7001 filename_from_src: true,
7002 }
7003 `)
7004}
7005
Jiyong Park479321d2019-12-16 11:47:12 +09007006func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7007 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7008 apex {
7009 name: "myapex",
7010 key: "myapex.key",
7011 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007012 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007013 }
7014
7015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020
7021 java_library {
7022 name: "myjar",
7023 srcs: ["foo/bar/MyClass.java"],
7024 sdk_version: "none",
7025 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007026 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007027 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007028 }
7029 `)
7030}
7031
Jiyong Park7afd1072019-12-30 16:56:33 +09007032func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007033 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007034 apex {
7035 name: "myapex",
7036 key: "myapex.key",
7037 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007038 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007039 }
7040
7041 apex_key {
7042 name: "myapex.key",
7043 public_key: "testkey.avbpubkey",
7044 private_key: "testkey.pem",
7045 }
7046
7047 cc_library {
7048 name: "mylib",
7049 srcs: ["mylib.cpp"],
7050 system_shared_libs: [],
7051 stl: "none",
7052 required: ["a", "b"],
7053 host_required: ["c", "d"],
7054 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007055 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007056 }
7057 `)
7058
7059 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007060 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007061 name := apexBundle.BaseModuleName()
7062 prefix := "TARGET_"
7063 var builder strings.Builder
7064 data.Custom(&builder, name, prefix, "", data)
7065 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007066 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 -08007067 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7068 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007069}
7070
Jiyong Park7cd10e32020-01-14 09:22:18 +09007071func TestSymlinksFromApexToSystem(t *testing.T) {
7072 bp := `
7073 apex {
7074 name: "myapex",
7075 key: "myapex.key",
7076 native_shared_libs: ["mylib"],
7077 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007078 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007079 }
7080
Jiyong Park9d677202020-02-19 16:29:35 +09007081 apex {
7082 name: "myapex.updatable",
7083 key: "myapex.key",
7084 native_shared_libs: ["mylib"],
7085 java_libs: ["myjar"],
7086 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09007087 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09007088 }
7089
Jiyong Park7cd10e32020-01-14 09:22:18 +09007090 apex_key {
7091 name: "myapex.key",
7092 public_key: "testkey.avbpubkey",
7093 private_key: "testkey.pem",
7094 }
7095
7096 cc_library {
7097 name: "mylib",
7098 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007099 shared_libs: [
7100 "myotherlib",
7101 "myotherlib_ext",
7102 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007103 system_shared_libs: [],
7104 stl: "none",
7105 apex_available: [
7106 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007107 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007108 "//apex_available:platform",
7109 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007110 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007111 }
7112
7113 cc_library {
7114 name: "myotherlib",
7115 srcs: ["mylib.cpp"],
7116 system_shared_libs: [],
7117 stl: "none",
7118 apex_available: [
7119 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007120 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007121 "//apex_available:platform",
7122 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007123 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007124 }
7125
Jiyong Parkce243632023-02-17 18:22:25 +09007126 cc_library {
7127 name: "myotherlib_ext",
7128 srcs: ["mylib.cpp"],
7129 system_shared_libs: [],
7130 system_ext_specific: true,
7131 stl: "none",
7132 apex_available: [
7133 "myapex",
7134 "myapex.updatable",
7135 "//apex_available:platform",
7136 ],
7137 min_sdk_version: "current",
7138 }
7139
Jiyong Park7cd10e32020-01-14 09:22:18 +09007140 java_library {
7141 name: "myjar",
7142 srcs: ["foo/bar/MyClass.java"],
7143 sdk_version: "none",
7144 system_modules: "none",
7145 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007146 apex_available: [
7147 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007148 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007149 "//apex_available:platform",
7150 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007151 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007152 }
7153
7154 java_library {
7155 name: "myotherjar",
7156 srcs: ["foo/bar/MyClass.java"],
7157 sdk_version: "none",
7158 system_modules: "none",
7159 apex_available: [
7160 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007161 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007162 "//apex_available:platform",
7163 ],
Jooyung Han749dc692020-04-15 11:03:39 +09007164 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007165 }
7166 `
7167
7168 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7169 for _, f := range files {
7170 if f.path == file {
7171 if f.isLink {
7172 t.Errorf("%q is not a real file", file)
7173 }
7174 return
7175 }
7176 }
7177 t.Errorf("%q is not found", file)
7178 }
7179
Jiyong Parkce243632023-02-17 18:22:25 +09007180 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007181 for _, f := range files {
7182 if f.path == file {
7183 if !f.isLink {
7184 t.Errorf("%q is not a symlink", file)
7185 }
Jiyong Parkce243632023-02-17 18:22:25 +09007186 if f.src != target {
7187 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7188 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007189 return
7190 }
7191 }
7192 t.Errorf("%q is not found", file)
7193 }
7194
Jiyong Park9d677202020-02-19 16:29:35 +09007195 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7196 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007197 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007198 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007199 ensureRealfileExists(t, files, "javalib/myjar.jar")
7200 ensureRealfileExists(t, files, "lib64/mylib.so")
7201 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007202 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007203
Jiyong Park9d677202020-02-19 16:29:35 +09007204 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7205 ensureRealfileExists(t, files, "javalib/myjar.jar")
7206 ensureRealfileExists(t, files, "lib64/mylib.so")
7207 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007208 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007209
7210 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007211 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00007212 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007213 ensureRealfileExists(t, files, "javalib/myjar.jar")
7214 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007215 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7216 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007217
7218 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
7219 ensureRealfileExists(t, files, "javalib/myjar.jar")
7220 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007221 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7222 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007223}
7224
Yo Chiange8128052020-07-23 20:09:18 +08007225func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007226 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007227 apex {
7228 name: "myapex",
7229 key: "myapex.key",
7230 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007231 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007232 }
7233
7234 apex_key {
7235 name: "myapex.key",
7236 public_key: "testkey.avbpubkey",
7237 private_key: "testkey.pem",
7238 }
7239
7240 cc_library_shared {
7241 name: "mylib",
7242 srcs: ["mylib.cpp"],
7243 shared_libs: ["myotherlib"],
7244 system_shared_libs: [],
7245 stl: "none",
7246 apex_available: [
7247 "myapex",
7248 "//apex_available:platform",
7249 ],
7250 }
7251
7252 cc_prebuilt_library_shared {
7253 name: "myotherlib",
7254 srcs: ["prebuilt.so"],
7255 system_shared_libs: [],
7256 stl: "none",
7257 apex_available: [
7258 "myapex",
7259 "//apex_available:platform",
7260 ],
7261 }
7262 `)
7263
Prerana Patilb1896c82022-11-09 18:14:34 +00007264 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007265 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007266 var builder strings.Builder
7267 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7268 androidMk := builder.String()
7269 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007270 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007271 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7272 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7273 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007274 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 +08007275}
7276
Jooyung Han643adc42020-02-27 13:50:06 +09007277func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007278 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007279 apex {
7280 name: "myapex",
7281 key: "myapex.key",
Jiyong Park34d5c332022-02-24 18:02:44 +09007282 jni_libs: ["mylib", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007283 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09007284 }
7285
7286 apex_key {
7287 name: "myapex.key",
7288 public_key: "testkey.avbpubkey",
7289 private_key: "testkey.pem",
7290 }
7291
7292 cc_library {
7293 name: "mylib",
7294 srcs: ["mylib.cpp"],
7295 shared_libs: ["mylib2"],
7296 system_shared_libs: [],
7297 stl: "none",
7298 apex_available: [ "myapex" ],
7299 }
7300
7301 cc_library {
7302 name: "mylib2",
7303 srcs: ["mylib.cpp"],
7304 system_shared_libs: [],
7305 stl: "none",
7306 apex_available: [ "myapex" ],
7307 }
Jiyong Park34d5c332022-02-24 18:02:44 +09007308
7309 rust_ffi_shared {
7310 name: "libfoo.rust",
7311 crate_name: "foo",
7312 srcs: ["foo.rs"],
7313 shared_libs: ["libfoo.shared_from_rust"],
7314 prefer_rlib: true,
7315 apex_available: ["myapex"],
7316 }
7317
7318 cc_library_shared {
7319 name: "libfoo.shared_from_rust",
7320 srcs: ["mylib.cpp"],
7321 system_shared_libs: [],
7322 stl: "none",
7323 stubs: {
7324 versions: ["10", "11", "12"],
7325 },
7326 }
7327
Jooyung Han643adc42020-02-27 13:50:06 +09007328 `)
7329
7330 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
7331 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiyong Park34d5c332022-02-24 18:02:44 +09007332 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007333 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
7334 "lib64/mylib.so",
7335 "lib64/mylib2.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09007336 "lib64/libfoo.rust.so",
7337 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
7338 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09007339 })
Jiyong Park34d5c332022-02-24 18:02:44 +09007340
7341 // b/220397949
7342 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09007343}
7344
Jooyung Han49f67012020-04-17 13:43:10 +09007345func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007346 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09007347 apex {
7348 name: "myapex",
7349 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007350 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09007351 }
7352 apex_key {
7353 name: "myapex.key",
7354 public_key: "testkey.avbpubkey",
7355 private_key: "testkey.pem",
7356 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007357 `,
7358 android.FixtureModifyConfig(func(config android.Config) {
7359 delete(config.Targets, android.Android)
7360 config.AndroidCommonTarget = android.Target{}
7361 }),
7362 )
Jooyung Han49f67012020-04-17 13:43:10 +09007363
7364 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
7365 t.Errorf("Expected variants: %v, but got: %v", expected, got)
7366 }
7367}
7368
Jiyong Parkbd159612020-02-28 15:22:21 +09007369func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007370 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09007371 apex {
7372 name: "myapex",
7373 key: "myapex.key",
7374 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007375 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09007376 }
7377
7378 apex_key {
7379 name: "myapex.key",
7380 public_key: "testkey.avbpubkey",
7381 private_key: "testkey.pem",
7382 }
7383
7384 android_app {
7385 name: "AppFoo",
7386 srcs: ["foo/bar/MyClass.java"],
7387 sdk_version: "none",
7388 system_modules: "none",
7389 apex_available: [ "myapex" ],
7390 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09007391 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09007392
Colin Crosscf371cc2020-11-13 11:48:42 -08007393 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09007394 content := bundleConfigRule.Args["content"]
7395
7396 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007397 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 +09007398}
7399
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007400func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007401 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007402 apex {
7403 name: "myapex",
7404 key: "myapex.key",
7405 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007406 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007407 }
7408
7409 apex_key {
7410 name: "myapex.key",
7411 public_key: "testkey.avbpubkey",
7412 private_key: "testkey.pem",
7413 }
7414
7415 android_app_set {
7416 name: "AppSet",
7417 set: "AppSet.apks",
7418 }`)
7419 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08007420 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007421 content := bundleConfigRule.Args["content"]
7422 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
7423 s := mod.Rule("apexRule").Args["copy_commands"]
7424 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09007425 if len(copyCmds) != 4 {
7426 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007427 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007428 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
7429 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09007430 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
7431 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09007432
7433 // Ensure that canned_fs_config has an entry for the app set zip file
7434 generateFsRule := mod.Rule("generateFsConfig")
7435 cmd := generateFsRule.RuleParams.Command
7436 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07007437}
7438
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007439func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01007440 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007441 apex_set {
7442 name: "myapex",
7443 filename: "foo_v2.apex",
7444 sanitized: {
7445 none: { set: "myapex.apks", },
7446 hwaddress: { set: "myapex.hwasan.apks", },
7447 },
Paul Duffin24704672021-04-06 16:09:30 +01007448 }
7449 `
7450 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007451
Paul Duffin24704672021-04-06 16:09:30 +01007452 // Check that the extractor produces the correct output file from the correct input file.
7453 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007454
Paul Duffin24704672021-04-06 16:09:30 +01007455 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7456 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007457
Paul Duffin24704672021-04-06 16:09:30 +01007458 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
7459
7460 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01007461 m = ctx.ModuleForTests("myapex", "android_common_myapex")
7462 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01007463
7464 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07007465}
7466
Pranav Guptaeba03b02022-09-27 00:27:08 +00007467func TestApexSetApksModuleAssignment(t *testing.T) {
7468 ctx := testApex(t, `
7469 apex_set {
7470 name: "myapex",
7471 set: ":myapex_apks_file",
7472 }
7473
7474 filegroup {
7475 name: "myapex_apks_file",
7476 srcs: ["myapex.apks"],
7477 }
7478 `)
7479
7480 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
7481
7482 // Check that the extractor produces the correct apks file from the input module
7483 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
7484 extractedApex := m.Output(extractorOutput)
7485
7486 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
7487}
7488
Paul Duffin89f570a2021-06-16 01:42:33 +01007489func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007490 t.Helper()
7491
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007492 bp := `
7493 java_library {
7494 name: "some-updatable-apex-lib",
7495 srcs: ["a.java"],
7496 sdk_version: "current",
7497 apex_available: [
7498 "some-updatable-apex",
7499 ],
satayevabcd5972021-08-06 17:49:46 +01007500 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007501 }
7502
7503 java_library {
7504 name: "some-non-updatable-apex-lib",
7505 srcs: ["a.java"],
7506 apex_available: [
7507 "some-non-updatable-apex",
7508 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01007509 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01007510 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007511 }
7512
7513 bootclasspath_fragment {
7514 name: "some-non-updatable-fragment",
7515 contents: ["some-non-updatable-apex-lib"],
7516 apex_available: [
7517 "some-non-updatable-apex",
7518 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007519 hidden_api: {
7520 split_packages: ["*"],
7521 },
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007522 }
7523
7524 java_library {
7525 name: "some-platform-lib",
7526 srcs: ["a.java"],
7527 sdk_version: "current",
7528 installable: true,
7529 }
7530
7531 java_library {
7532 name: "some-art-lib",
7533 srcs: ["a.java"],
7534 sdk_version: "current",
7535 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00007536 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007537 ],
7538 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01007539 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007540 }
7541
7542 apex {
7543 name: "some-updatable-apex",
7544 key: "some-updatable-apex.key",
7545 java_libs: ["some-updatable-apex-lib"],
7546 updatable: true,
7547 min_sdk_version: "current",
7548 }
7549
7550 apex {
7551 name: "some-non-updatable-apex",
7552 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007553 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007554 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007555 }
7556
7557 apex_key {
7558 name: "some-updatable-apex.key",
7559 }
7560
7561 apex_key {
7562 name: "some-non-updatable-apex.key",
7563 }
7564
7565 apex {
Paul Duffind376f792021-01-26 11:59:35 +00007566 name: "com.android.art.debug",
7567 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01007568 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007569 updatable: true,
7570 min_sdk_version: "current",
7571 }
7572
Paul Duffinf23bc472021-04-27 12:42:20 +01007573 bootclasspath_fragment {
7574 name: "art-bootclasspath-fragment",
7575 image_name: "art",
7576 contents: ["some-art-lib"],
7577 apex_available: [
7578 "com.android.art.debug",
7579 ],
Paul Duffin9fd56472022-03-31 15:42:30 +01007580 hidden_api: {
7581 split_packages: ["*"],
7582 },
Paul Duffinf23bc472021-04-27 12:42:20 +01007583 }
7584
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007585 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00007586 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007587 }
7588
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007589 filegroup {
7590 name: "some-updatable-apex-file_contexts",
7591 srcs: [
7592 "system/sepolicy/apex/some-updatable-apex-file_contexts",
7593 ],
7594 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007595
7596 filegroup {
7597 name: "some-non-updatable-apex-file_contexts",
7598 srcs: [
7599 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
7600 ],
7601 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007602 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00007603
Paul Duffin89f570a2021-06-16 01:42:33 +01007604 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00007605}
7606
Paul Duffin89f570a2021-06-16 01:42:33 +01007607func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007608 t.Helper()
7609
Paul Duffin55607122021-03-30 23:32:51 +01007610 fs := android.MockFS{
7611 "a.java": nil,
7612 "a.jar": nil,
7613 "apex_manifest.json": nil,
7614 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007615 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007616 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7617 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7618 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007619 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007620 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007621
Paul Duffin55607122021-03-30 23:32:51 +01007622 errorHandler := android.FixtureExpectsNoErrors
7623 if errmsg != "" {
7624 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007625 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007626
Paul Duffin55607122021-03-30 23:32:51 +01007627 result := android.GroupFixturePreparers(
7628 cc.PrepareForTestWithCcDefaultModules,
7629 java.PrepareForTestWithHiddenApiBuildComponents,
7630 java.PrepareForTestWithJavaDefaultModules,
7631 java.PrepareForTestWithJavaSdkLibraryFiles,
7632 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007633 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007634 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007635 android.FixtureModifyMockFS(func(fs android.MockFS) {
7636 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7637 insert := ""
7638 for _, fragment := range fragments {
7639 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7640 }
7641 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7642 platform_bootclasspath {
7643 name: "platform-bootclasspath",
7644 fragments: [
7645 %s
7646 ],
7647 }
7648 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007649 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007650 }),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00007651 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01007652 ).
7653 ExtendWithErrorHandler(errorHandler).
7654 RunTestWithBp(t, bp)
7655
7656 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007657}
7658
Paul Duffin5556c5f2022-06-09 17:32:21 +00007659func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01007660 preparers := android.GroupFixturePreparers(
7661 java.PrepareForTestWithJavaDefaultModules,
7662 PrepareForTestWithApexBuildComponents,
7663 ).
7664 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
7665 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
7666
7667 bpBase := `
7668 apex_set {
7669 name: "com.android.myapex",
7670 installable: true,
7671 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7672 set: "myapex.apks",
7673 }
7674
7675 apex_set {
7676 name: "com.mycompany.android.myapex",
7677 apex_name: "com.android.myapex",
7678 installable: true,
7679 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7680 set: "company-myapex.apks",
7681 }
7682
7683 prebuilt_bootclasspath_fragment {
7684 name: "my-bootclasspath-fragment",
7685 apex_available: ["com.android.myapex"],
7686 %s
7687 }
7688 `
7689
7690 t.Run("java_import", func(t *testing.T) {
7691 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7692 java_import {
7693 name: "libfoo",
7694 jars: ["libfoo.jar"],
7695 apex_available: ["com.android.myapex"],
7696 }
7697 `)
7698 })
7699
7700 t.Run("java_sdk_library_import", func(t *testing.T) {
7701 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7702 java_sdk_library_import {
7703 name: "libfoo",
7704 public: {
7705 jars: ["libbar.jar"],
7706 },
7707 apex_available: ["com.android.myapex"],
7708 }
7709 `)
7710 })
7711
7712 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7713 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7714 image_name: "art",
7715 contents: ["libfoo"],
7716 `)+`
7717 java_sdk_library_import {
7718 name: "libfoo",
7719 public: {
7720 jars: ["libbar.jar"],
7721 },
7722 apex_available: ["com.android.myapex"],
7723 }
7724 `)
7725 })
7726}
7727
Paul Duffin5556c5f2022-06-09 17:32:21 +00007728func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
7729 preparers := android.GroupFixturePreparers(
7730 java.PrepareForTestWithJavaDefaultModules,
7731 PrepareForTestWithApexBuildComponents,
7732 )
7733
7734 bpBase := `
7735 apex_set {
7736 name: "com.android.myapex",
7737 installable: true,
7738 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7739 set: "myapex.apks",
7740 }
7741
7742 apex_set {
7743 name: "com.android.myapex_compressed",
7744 apex_name: "com.android.myapex",
7745 installable: true,
7746 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7747 set: "myapex_compressed.apks",
7748 }
7749
7750 prebuilt_bootclasspath_fragment {
7751 name: "my-bootclasspath-fragment",
7752 apex_available: [
7753 "com.android.myapex",
7754 "com.android.myapex_compressed",
7755 ],
7756 hidden_api: {
7757 annotation_flags: "annotation-flags.csv",
7758 metadata: "metadata.csv",
7759 index: "index.csv",
7760 signature_patterns: "signature_patterns.csv",
7761 },
7762 %s
7763 }
7764 `
7765
7766 t.Run("java_import", func(t *testing.T) {
7767 result := preparers.RunTestWithBp(t,
7768 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7769 java_import {
7770 name: "libfoo",
7771 jars: ["libfoo.jar"],
7772 apex_available: [
7773 "com.android.myapex",
7774 "com.android.myapex_compressed",
7775 ],
7776 }
7777 `)
7778
7779 module := result.Module("libfoo", "android_common_com.android.myapex")
7780 usesLibraryDep := module.(java.UsesLibraryDependency)
7781 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7782 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7783 usesLibraryDep.DexJarBuildPath().Path())
7784 })
7785
7786 t.Run("java_sdk_library_import", func(t *testing.T) {
7787 result := preparers.RunTestWithBp(t,
7788 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
7789 java_sdk_library_import {
7790 name: "libfoo",
7791 public: {
7792 jars: ["libbar.jar"],
7793 },
7794 apex_available: [
7795 "com.android.myapex",
7796 "com.android.myapex_compressed",
7797 ],
7798 compile_dex: true,
7799 }
7800 `)
7801
7802 module := result.Module("libfoo", "android_common_com.android.myapex")
7803 usesLibraryDep := module.(java.UsesLibraryDependency)
7804 android.AssertPathRelativeToTopEquals(t, "dex jar path",
7805 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
7806 usesLibraryDep.DexJarBuildPath().Path())
7807 })
7808
7809 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
7810 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
7811 image_name: "art",
7812 contents: ["libfoo"],
7813 `)+`
7814 java_sdk_library_import {
7815 name: "libfoo",
7816 public: {
7817 jars: ["libbar.jar"],
7818 },
7819 apex_available: [
7820 "com.android.myapex",
7821 "com.android.myapex_compressed",
7822 ],
7823 compile_dex: true,
7824 }
7825 `)
7826 })
7827}
7828
Jooyung Han548640b2020-04-27 12:10:30 +09007829func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7830 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7831 apex {
7832 name: "myapex",
7833 key: "myapex.key",
7834 updatable: true,
7835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842 `)
7843}
7844
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007845func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7846 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7847 apex {
7848 name: "myapex",
7849 key: "myapex.key",
7850 }
7851
7852 apex_key {
7853 name: "myapex.key",
7854 public_key: "testkey.avbpubkey",
7855 private_key: "testkey.pem",
7856 }
7857 `)
7858}
7859
Daniel Norman69109112021-12-02 12:52:42 -08007860func TestUpdatable_cannot_be_vendor_apex(t *testing.T) {
7861 testApexError(t, `"myapex" .*: updatable: vendor APEXes are not updatable`, `
7862 apex {
7863 name: "myapex",
7864 key: "myapex.key",
7865 updatable: true,
7866 soc_specific: true,
7867 }
7868
7869 apex_key {
7870 name: "myapex.key",
7871 public_key: "testkey.avbpubkey",
7872 private_key: "testkey.pem",
7873 }
7874 `)
7875}
7876
satayevb98371c2021-06-15 16:49:50 +01007877func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7878 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7879 apex {
7880 name: "myapex",
7881 key: "myapex.key",
7882 systemserverclasspath_fragments: [
7883 "mysystemserverclasspathfragment",
7884 ],
7885 min_sdk_version: "29",
7886 updatable: true,
7887 }
7888
7889 apex_key {
7890 name: "myapex.key",
7891 public_key: "testkey.avbpubkey",
7892 private_key: "testkey.pem",
7893 }
7894
7895 java_library {
7896 name: "foo",
7897 srcs: ["b.java"],
7898 min_sdk_version: "29",
7899 installable: true,
7900 apex_available: [
7901 "myapex",
7902 ],
7903 }
7904
7905 systemserverclasspath_fragment {
7906 name: "mysystemserverclasspathfragment",
7907 generate_classpaths_proto: false,
7908 contents: [
7909 "foo",
7910 ],
7911 apex_available: [
7912 "myapex",
7913 ],
7914 }
satayevabcd5972021-08-06 17:49:46 +01007915 `,
7916 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7917 )
satayevb98371c2021-06-15 16:49:50 +01007918}
7919
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007920func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007921 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7922 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7923 // modules to be included in the BootJars.
7924 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7925 return android.GroupFixturePreparers(
7926 dexpreopt.FixtureSetBootJars(bootJars...),
7927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7928 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7929 }),
7930 )
7931 }
7932
7933 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7934 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7935 // specified in the ArtApexJars configuration.
7936 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7937 return android.GroupFixturePreparers(
7938 dexpreopt.FixtureSetArtBootJars(bootJars...),
7939 dexpreopt.FixtureSetBootJars(bootJars...),
7940 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7941 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7942 }),
7943 )
7944 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007945
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007946 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007947 preparer := android.GroupFixturePreparers(
7948 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7949 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7950 )
7951 fragments := []java.ApexVariantReference{
7952 {
7953 Apex: proptools.StringPtr("com.android.art.debug"),
7954 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7955 },
7956 {
7957 Apex: proptools.StringPtr("some-non-updatable-apex"),
7958 Module: proptools.StringPtr("some-non-updatable-fragment"),
7959 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007960 }
satayevabcd5972021-08-06 17:49:46 +01007961 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007962 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007963
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007964 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007965 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7966 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007967 preparer := android.GroupFixturePreparers(
7968 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7969 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7970 )
Paul Duffin60264a02021-04-12 20:02:36 +01007971 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007972 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007973
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007974 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 +01007975 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 +01007976 // Update the dexpreopt ArtApexJars directly.
7977 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7978 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007979 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007980
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007981 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 +01007982 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 +01007983 // Update the dexpreopt ArtApexJars directly.
7984 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7985 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007986 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007987
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007988 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 +01007989 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 +01007990 preparer := android.GroupFixturePreparers(
7991 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7992 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7993 )
Paul Duffin60264a02021-04-12 20:02:36 +01007994 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007995 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007996
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007997 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 +01007998 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007999 fragment := java.ApexVariantReference{
8000 Apex: proptools.StringPtr("some-non-updatable-apex"),
8001 Module: proptools.StringPtr("some-non-updatable-fragment"),
8002 }
8003 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008004 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01008005
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008006 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008007 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008008 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8009 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008010 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008011
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008012 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01008013 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01008014 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
8015 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008016 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008017
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008018 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01008019 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01008020 // Update the dexpreopt ArtApexJars directly.
8021 preparer := prepareSetArtJars("platform:some-platform-lib")
8022 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008023 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008024
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008025 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008026 preparer := android.GroupFixturePreparers(
8027 java.FixtureConfigureBootJars("platform:some-platform-lib"),
8028 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
8029 )
8030 fragments := []java.ApexVariantReference{
8031 {
8032 Apex: proptools.StringPtr("some-non-updatable-apex"),
8033 Module: proptools.StringPtr("some-non-updatable-fragment"),
8034 },
8035 }
8036 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01008037 })
Paul Duffin064b70c2020-11-02 17:32:38 +00008038}
8039
8040func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008041 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008042 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008043 fragment := java.ApexVariantReference{
8044 Apex: proptools.StringPtr("myapex"),
8045 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8046 }
8047
Paul Duffin064b70c2020-11-02 17:32:38 +00008048 testDexpreoptWithApexes(t, `
8049 prebuilt_apex {
8050 name: "myapex" ,
8051 arch: {
8052 arm64: {
8053 src: "myapex-arm64.apex",
8054 },
8055 arm: {
8056 src: "myapex-arm.apex",
8057 },
8058 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008059 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8060 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008061
Paul Duffin89f570a2021-06-16 01:42:33 +01008062 prebuilt_bootclasspath_fragment {
8063 name: "my-bootclasspath-fragment",
8064 contents: ["libfoo"],
8065 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008066 hidden_api: {
8067 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8068 metadata: "my-bootclasspath-fragment/metadata.csv",
8069 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008070 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8071 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8072 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008073 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008074 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008075
Paul Duffin89f570a2021-06-16 01:42:33 +01008076 java_import {
8077 name: "libfoo",
8078 jars: ["libfoo.jar"],
8079 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008080 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008081 }
8082 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008083 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008084}
8085
Spandan Dasf14e2542021-11-12 00:01:37 +00008086func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008087 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008088 bp += `
8089 apex_key {
8090 name: "myapex.key",
8091 public_key: "testkey.avbpubkey",
8092 private_key: "testkey.pem",
8093 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008094 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008095 "lib1/src/A.java": nil,
8096 "lib2/src/B.java": nil,
8097 "system/sepolicy/apex/myapex-file_contexts": nil,
8098 }
8099
Paul Duffin45338f02021-03-30 23:07:52 +01008100 errorHandler := android.FixtureExpectsNoErrors
8101 if errmsg != "" {
8102 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008103 }
Colin Crossae8600b2020-10-29 17:09:13 -07008104
Paul Duffin45338f02021-03-30 23:07:52 +01008105 android.GroupFixturePreparers(
8106 android.PrepareForTestWithAndroidBuildComponents,
8107 java.PrepareForTestWithJavaBuildComponents,
8108 PrepareForTestWithApexBuildComponents,
8109 android.PrepareForTestWithNeverallowRules(rules),
8110 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008111 apexBootJars := make([]string, 0, len(bootJars))
8112 for _, apexBootJar := range bootJars {
8113 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008114 }
satayevd604b212021-07-21 14:23:52 +01008115 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008116 }),
8117 fs.AddToFixture(),
8118 ).
8119 ExtendWithErrorHandler(errorHandler).
8120 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008121}
8122
8123func TestApexPermittedPackagesRules(t *testing.T) {
8124 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008125 name string
8126 expectedError string
8127 bp string
8128 bootJars []string
8129 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008130 }{
8131
8132 {
8133 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8134 expectedError: "",
8135 bp: `
8136 java_library {
8137 name: "bcp_lib1",
8138 srcs: ["lib1/src/*.java"],
8139 permitted_packages: ["foo.bar"],
8140 apex_available: ["myapex"],
8141 sdk_version: "none",
8142 system_modules: "none",
8143 }
8144 java_library {
8145 name: "nonbcp_lib2",
8146 srcs: ["lib2/src/*.java"],
8147 apex_available: ["myapex"],
8148 permitted_packages: ["a.b"],
8149 sdk_version: "none",
8150 system_modules: "none",
8151 }
8152 apex {
8153 name: "myapex",
8154 key: "myapex.key",
8155 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008156 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008157 }`,
8158 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008159 bcpPermittedPackages: map[string][]string{
8160 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008161 "foo.bar",
8162 },
8163 },
8164 },
8165 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008166 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008167 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 +01008168 bp: `
8169 java_library {
8170 name: "bcp_lib1",
8171 srcs: ["lib1/src/*.java"],
8172 apex_available: ["myapex"],
8173 permitted_packages: ["foo.bar"],
8174 sdk_version: "none",
8175 system_modules: "none",
8176 }
8177 java_library {
8178 name: "bcp_lib2",
8179 srcs: ["lib2/src/*.java"],
8180 apex_available: ["myapex"],
8181 permitted_packages: ["foo.bar", "bar.baz"],
8182 sdk_version: "none",
8183 system_modules: "none",
8184 }
8185 apex {
8186 name: "myapex",
8187 key: "myapex.key",
8188 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008189 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008190 }
8191 `,
8192 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008193 bcpPermittedPackages: map[string][]string{
8194 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008195 "foo.bar",
8196 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008197 "bcp_lib2": []string{
8198 "foo.bar",
8199 },
8200 },
8201 },
8202 {
8203 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8204 expectedError: "",
8205 bp: `
8206 java_library {
8207 name: "bcp_lib_restricted",
8208 srcs: ["lib1/src/*.java"],
8209 apex_available: ["myapex"],
8210 permitted_packages: ["foo.bar"],
8211 sdk_version: "none",
8212 min_sdk_version: "29",
8213 system_modules: "none",
8214 }
8215 java_library {
8216 name: "bcp_lib_unrestricted",
8217 srcs: ["lib2/src/*.java"],
8218 apex_available: ["myapex"],
8219 permitted_packages: ["foo.bar", "bar.baz"],
8220 sdk_version: "none",
8221 min_sdk_version: "29",
8222 system_modules: "none",
8223 }
8224 apex {
8225 name: "myapex",
8226 key: "myapex.key",
8227 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8228 updatable: true,
8229 min_sdk_version: "29",
8230 }
8231 `,
8232 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8233 bcpPermittedPackages: map[string][]string{
8234 "bcp_lib1_non_updateable": []string{
8235 "foo.bar",
8236 },
8237 // 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 +01008238 },
8239 },
8240 }
8241 for _, tc := range testcases {
8242 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008243 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8244 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008245 })
8246 }
8247}
8248
Jiyong Park62304bb2020-04-13 16:19:48 +09008249func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008250 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008251 apex {
8252 name: "myapex",
8253 key: "myapex.key",
8254 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008255 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008256 }
8257
8258 apex_key {
8259 name: "myapex.key",
8260 public_key: "testkey.avbpubkey",
8261 private_key: "testkey.pem",
8262 }
8263
8264 cc_library {
8265 name: "mylib",
8266 srcs: ["mylib.cpp"],
8267 system_shared_libs: [],
8268 stl: "none",
8269 stubs: {
8270 versions: ["1"],
8271 },
8272 apex_available: ["myapex"],
8273 }
8274
8275 cc_library {
8276 name: "myprivlib",
8277 srcs: ["mylib.cpp"],
8278 system_shared_libs: [],
8279 stl: "none",
8280 apex_available: ["myapex"],
8281 }
8282
8283
8284 cc_test {
8285 name: "mytest",
8286 gtest: false,
8287 srcs: ["mylib.cpp"],
8288 system_shared_libs: [],
8289 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008290 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008291 test_for: ["myapex"]
8292 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008293
8294 cc_library {
8295 name: "mytestlib",
8296 srcs: ["mylib.cpp"],
8297 system_shared_libs: [],
8298 shared_libs: ["mylib", "myprivlib"],
8299 stl: "none",
8300 test_for: ["myapex"],
8301 }
8302
8303 cc_benchmark {
8304 name: "mybench",
8305 srcs: ["mylib.cpp"],
8306 system_shared_libs: [],
8307 shared_libs: ["mylib", "myprivlib"],
8308 stl: "none",
8309 test_for: ["myapex"],
8310 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008311 `)
8312
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008313 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008314 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008315 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8316 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8317 }
8318
8319 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008320 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008321 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8322 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8323 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8324}
Jiyong Park46a512f2020-12-04 18:02:13 +09008325
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008326func TestIndirectTestFor(t *testing.T) {
8327 ctx := testApex(t, `
8328 apex {
8329 name: "myapex",
8330 key: "myapex.key",
8331 native_shared_libs: ["mylib", "myprivlib"],
8332 updatable: false,
8333 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008334
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008335 apex_key {
8336 name: "myapex.key",
8337 public_key: "testkey.avbpubkey",
8338 private_key: "testkey.pem",
8339 }
8340
8341 cc_library {
8342 name: "mylib",
8343 srcs: ["mylib.cpp"],
8344 system_shared_libs: [],
8345 stl: "none",
8346 stubs: {
8347 versions: ["1"],
8348 },
8349 apex_available: ["myapex"],
8350 }
8351
8352 cc_library {
8353 name: "myprivlib",
8354 srcs: ["mylib.cpp"],
8355 system_shared_libs: [],
8356 stl: "none",
8357 shared_libs: ["mylib"],
8358 apex_available: ["myapex"],
8359 }
8360
8361 cc_library {
8362 name: "mytestlib",
8363 srcs: ["mylib.cpp"],
8364 system_shared_libs: [],
8365 shared_libs: ["myprivlib"],
8366 stl: "none",
8367 test_for: ["myapex"],
8368 }
8369 `)
8370
8371 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008372 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008373 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8374 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8375 }
8376
8377 // The platform variant of mytestlib links to the platform variant of the
8378 // internal myprivlib.
8379 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8380
8381 // The platform variant of myprivlib links to the platform variant of mylib
8382 // and bypasses its stubs.
8383 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 +09008384}
8385
Martin Stjernholmec009002021-03-27 15:18:31 +00008386func TestTestForForLibInOtherApex(t *testing.T) {
8387 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8388 _ = testApex(t, `
8389 apex {
8390 name: "com.android.art",
8391 key: "myapex.key",
8392 native_shared_libs: ["mylib"],
8393 updatable: false,
8394 }
8395
8396 apex {
8397 name: "com.android.art.debug",
8398 key: "myapex.key",
8399 native_shared_libs: ["mylib", "mytestlib"],
8400 updatable: false,
8401 }
8402
8403 apex_key {
8404 name: "myapex.key",
8405 public_key: "testkey.avbpubkey",
8406 private_key: "testkey.pem",
8407 }
8408
8409 cc_library {
8410 name: "mylib",
8411 srcs: ["mylib.cpp"],
8412 system_shared_libs: [],
8413 stl: "none",
8414 stubs: {
8415 versions: ["1"],
8416 },
8417 apex_available: ["com.android.art", "com.android.art.debug"],
8418 }
8419
8420 cc_library {
8421 name: "mytestlib",
8422 srcs: ["mylib.cpp"],
8423 system_shared_libs: [],
8424 shared_libs: ["mylib"],
8425 stl: "none",
8426 apex_available: ["com.android.art.debug"],
8427 test_for: ["com.android.art"],
8428 }
8429 `,
8430 android.MockFS{
8431 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8432 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8433 }.AddToFixture())
8434}
8435
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008436// TODO(jungjw): Move this to proptools
8437func intPtr(i int) *int {
8438 return &i
8439}
8440
8441func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008442 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008443 apex_set {
8444 name: "myapex",
8445 set: "myapex.apks",
8446 filename: "foo_v2.apex",
8447 overrides: ["foo"],
8448 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008449 `,
8450 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8451 variables.Platform_sdk_version = intPtr(30)
8452 }),
8453 android.FixtureModifyConfig(func(config android.Config) {
8454 config.Targets[android.Android] = []android.Target{
8455 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8456 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8457 }
8458 }),
8459 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008460
Paul Duffin24704672021-04-06 16:09:30 +01008461 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008462
8463 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008464 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008465 actual := extractedApex.Args["abis"]
8466 expected := "ARMEABI_V7A,ARM64_V8A"
8467 if actual != expected {
8468 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8469 }
8470 actual = extractedApex.Args["sdk-version"]
8471 expected = "30"
8472 if actual != expected {
8473 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8474 }
8475
Paul Duffin6717d882021-06-15 19:09:41 +01008476 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008477 a := m.Module().(*ApexSet)
8478 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008479 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008480 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8481 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8482 }
8483}
8484
Anton Hansson805e0a52022-11-25 14:06:46 +00008485func TestApexSet_NativeBridge(t *testing.T) {
8486 ctx := testApex(t, `
8487 apex_set {
8488 name: "myapex",
8489 set: "myapex.apks",
8490 filename: "foo_v2.apex",
8491 overrides: ["foo"],
8492 }
8493 `,
8494 android.FixtureModifyConfig(func(config android.Config) {
8495 config.Targets[android.Android] = []android.Target{
8496 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8497 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8498 }
8499 }),
8500 )
8501
8502 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8503
8504 // Check extract_apks tool parameters. No native bridge arch expected
8505 extractedApex := m.Output("extracted/myapex.apks")
8506 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8507}
8508
Jiyong Park7d95a512020-05-10 15:16:24 +09008509func TestNoStaticLinkingToStubsLib(t *testing.T) {
8510 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8511 apex {
8512 name: "myapex",
8513 key: "myapex.key",
8514 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008515 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008516 }
8517
8518 apex_key {
8519 name: "myapex.key",
8520 public_key: "testkey.avbpubkey",
8521 private_key: "testkey.pem",
8522 }
8523
8524 cc_library {
8525 name: "mylib",
8526 srcs: ["mylib.cpp"],
8527 static_libs: ["otherlib"],
8528 system_shared_libs: [],
8529 stl: "none",
8530 apex_available: [ "myapex" ],
8531 }
8532
8533 cc_library {
8534 name: "otherlib",
8535 srcs: ["mylib.cpp"],
8536 system_shared_libs: [],
8537 stl: "none",
8538 stubs: {
8539 versions: ["1", "2", "3"],
8540 },
8541 apex_available: [ "myapex" ],
8542 }
8543 `)
8544}
8545
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008546func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008547 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008548 apex {
8549 name: "myapex",
8550 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008551 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008552 custom_sign_tool: "sign_myapex",
8553 }
8554
8555 apex_key {
8556 name: "myapex.key",
8557 public_key: "testkey.avbpubkey",
8558 private_key: "testkey.pem",
8559 }
8560 `)
8561
8562 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8563 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8564 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"`)
8565}
8566
8567func TestApexKeysTxtOverrides(t *testing.T) {
8568 ctx := testApex(t, `
8569 apex {
8570 name: "myapex",
8571 key: "myapex.key",
8572 updatable: false,
8573 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008574 }
8575
8576 apex_key {
8577 name: "myapex.key",
8578 public_key: "testkey.avbpubkey",
8579 private_key: "testkey.pem",
8580 }
8581
8582 prebuilt_apex {
8583 name: "myapex",
8584 prefer: true,
8585 arch: {
8586 arm64: {
8587 src: "myapex-arm64.apex",
8588 },
8589 arm: {
8590 src: "myapex-arm.apex",
8591 },
8592 },
8593 }
8594
8595 apex_set {
8596 name: "myapex_set",
8597 set: "myapex.apks",
8598 filename: "myapex_set.apex",
8599 overrides: ["myapex"],
8600 }
8601 `)
8602
8603 apexKeysText := ctx.SingletonForTests("apex_keys_text")
8604 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
8605 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 +09008606 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 +09008607}
8608
Jooyung Han938b5932020-06-20 12:47:47 +09008609func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008610 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008611 apex {
8612 name: "myapex",
8613 key: "myapex.key",
8614 apps: ["app"],
8615 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008616 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008617 }
8618
8619 apex_key {
8620 name: "myapex.key",
8621 public_key: "testkey.avbpubkey",
8622 private_key: "testkey.pem",
8623 }
8624
8625 android_app {
8626 name: "app",
8627 srcs: ["foo/bar/MyClass.java"],
8628 package_name: "foo",
8629 sdk_version: "none",
8630 system_modules: "none",
8631 apex_available: [ "myapex" ],
8632 }
8633 `, withFiles(map[string][]byte{
8634 "sub/Android.bp": []byte(`
8635 override_apex {
8636 name: "override_myapex",
8637 base: "myapex",
8638 apps: ["override_app"],
8639 allowed_files: ":allowed",
8640 }
8641 // Overridable "path" property should be referenced indirectly
8642 filegroup {
8643 name: "allowed",
8644 srcs: ["allowed.txt"],
8645 }
8646 override_android_app {
8647 name: "override_app",
8648 base: "app",
8649 package_name: "bar",
8650 }
8651 `),
8652 }))
8653
8654 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
8655 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8656 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8657 }
8658
8659 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
8660 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8661 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8662 }
8663}
8664
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008665func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008666 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008667 apex {
8668 name: "myapex",
8669 key: "myapex.key",
8670 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008671 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008672 }
8673
8674 apex_key {
8675 name: "myapex.key",
8676 public_key: "testkey.avbpubkey",
8677 private_key: "testkey.pem",
8678 }
8679
8680 cc_library {
8681 name: "mylib",
8682 srcs: ["mylib.cpp"],
8683 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008684 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008685 },
8686 apex_available: ["myapex"],
8687 }
8688
8689 cc_prebuilt_library_shared {
8690 name: "mylib",
8691 prefer: false,
8692 srcs: ["prebuilt.so"],
8693 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008694 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008695 },
8696 apex_available: ["myapex"],
8697 }
8698 `)
8699}
8700
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008701func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008702 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008703 apex {
8704 name: "myapex",
8705 key: "myapex.key",
8706 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008707 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008708 }
8709 apex_key {
8710 name: "myapex.key",
8711 public_key: "testkey.avbpubkey",
8712 private_key: "testkey.pem",
8713 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008714 `,
8715 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8716 variables.CompressedApex = proptools.BoolPtr(true)
8717 }),
8718 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008719
8720 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
8721 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8722
8723 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
8724 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8725
8726 // Make sure output of bundle is .capex
8727 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8728 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8729
8730 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008731 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008732 var builder strings.Builder
8733 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8734 androidMk := builder.String()
8735 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8736}
8737
Martin Stjernholm2856c662020-12-02 15:03:42 +00008738func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008739 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008740 apex {
8741 name: "myapex",
8742 key: "myapex.key",
8743 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008744 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008745 }
8746
8747 apex_key {
8748 name: "myapex.key",
8749 public_key: "testkey.avbpubkey",
8750 private_key: "testkey.pem",
8751 }
8752
8753 cc_library {
8754 name: "mylib",
8755 srcs: ["mylib.cpp"],
8756 apex_available: ["myapex"],
8757 shared_libs: ["otherlib"],
8758 system_shared_libs: [],
8759 }
8760
8761 cc_library {
8762 name: "otherlib",
8763 srcs: ["mylib.cpp"],
8764 stubs: {
8765 versions: ["current"],
8766 },
8767 }
8768
8769 cc_prebuilt_library_shared {
8770 name: "otherlib",
8771 prefer: true,
8772 srcs: ["prebuilt.so"],
8773 stubs: {
8774 versions: ["current"],
8775 },
8776 }
8777 `)
8778
8779 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008780 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008781 var builder strings.Builder
8782 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8783 androidMk := builder.String()
8784
8785 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
8786 // a thing there.
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008787 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 +00008788}
8789
Jiyong Parke3867542020-12-03 17:28:25 +09008790func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008791 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09008792 apex {
8793 name: "myapex",
8794 key: "myapex.key",
8795 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008796 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09008797 }
8798
8799 apex_key {
8800 name: "myapex.key",
8801 public_key: "testkey.avbpubkey",
8802 private_key: "testkey.pem",
8803 }
8804
8805 cc_library {
8806 name: "mylib",
8807 srcs: ["mylib.cpp"],
8808 system_shared_libs: [],
8809 stl: "none",
8810 apex_available: ["myapex"],
8811 shared_libs: ["mylib2"],
8812 target: {
8813 apex: {
8814 exclude_shared_libs: ["mylib2"],
8815 },
8816 },
8817 }
8818
8819 cc_library {
8820 name: "mylib2",
8821 srcs: ["mylib.cpp"],
8822 system_shared_libs: [],
8823 stl: "none",
8824 }
8825 `)
8826
8827 // Check if mylib is linked to mylib2 for the non-apex target
8828 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
8829 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
8830
8831 // Make sure that the link doesn't occur for the apex target
8832 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
8833 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
8834
8835 // It shouldn't appear in the copy cmd as well.
8836 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
8837 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
8838}
8839
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008840func TestPrebuiltStubLibDep(t *testing.T) {
8841 bpBase := `
8842 apex {
8843 name: "myapex",
8844 key: "myapex.key",
8845 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008846 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008847 }
8848 apex_key {
8849 name: "myapex.key",
8850 public_key: "testkey.avbpubkey",
8851 private_key: "testkey.pem",
8852 }
8853 cc_library {
8854 name: "mylib",
8855 srcs: ["mylib.cpp"],
8856 apex_available: ["myapex"],
8857 shared_libs: ["stublib"],
8858 system_shared_libs: [],
8859 }
8860 apex {
8861 name: "otherapex",
8862 enabled: %s,
8863 key: "myapex.key",
8864 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008865 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008866 }
8867 `
8868
8869 stublibSourceBp := `
8870 cc_library {
8871 name: "stublib",
8872 srcs: ["mylib.cpp"],
8873 apex_available: ["otherapex"],
8874 system_shared_libs: [],
8875 stl: "none",
8876 stubs: {
8877 versions: ["1"],
8878 },
8879 }
8880 `
8881
8882 stublibPrebuiltBp := `
8883 cc_prebuilt_library_shared {
8884 name: "stublib",
8885 srcs: ["prebuilt.so"],
8886 apex_available: ["otherapex"],
8887 stubs: {
8888 versions: ["1"],
8889 },
8890 %s
8891 }
8892 `
8893
8894 tests := []struct {
8895 name string
8896 stublibBp string
8897 usePrebuilt bool
8898 modNames []string // Modules to collect AndroidMkEntries for
8899 otherApexEnabled []string
8900 }{
8901 {
8902 name: "only_source",
8903 stublibBp: stublibSourceBp,
8904 usePrebuilt: false,
8905 modNames: []string{"stublib"},
8906 otherApexEnabled: []string{"true", "false"},
8907 },
8908 {
8909 name: "source_preferred",
8910 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8911 usePrebuilt: false,
8912 modNames: []string{"stublib", "prebuilt_stublib"},
8913 otherApexEnabled: []string{"true", "false"},
8914 },
8915 {
8916 name: "prebuilt_preferred",
8917 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8918 usePrebuilt: true,
8919 modNames: []string{"stublib", "prebuilt_stublib"},
8920 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8921 },
8922 {
8923 name: "only_prebuilt",
8924 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8925 usePrebuilt: true,
8926 modNames: []string{"stublib"},
8927 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8928 },
8929 }
8930
8931 for _, test := range tests {
8932 t.Run(test.name, func(t *testing.T) {
8933 for _, otherApexEnabled := range test.otherApexEnabled {
8934 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008935 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008936
8937 type modAndMkEntries struct {
8938 mod *cc.Module
8939 mkEntries android.AndroidMkEntries
8940 }
8941 entries := []*modAndMkEntries{}
8942
8943 // Gather shared lib modules that are installable
8944 for _, modName := range test.modNames {
8945 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8946 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8947 continue
8948 }
8949 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008950 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008951 continue
8952 }
Colin Crossaa255532020-07-03 13:18:24 -07008953 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008954 if ent.Disabled {
8955 continue
8956 }
8957 entries = append(entries, &modAndMkEntries{
8958 mod: mod,
8959 mkEntries: ent,
8960 })
8961 }
8962 }
8963 }
8964
8965 var entry *modAndMkEntries = nil
8966 for _, ent := range entries {
8967 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8968 if entry != nil {
8969 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8970 } else {
8971 entry = ent
8972 }
8973 }
8974 }
8975
8976 if entry == nil {
8977 t.Errorf("AndroidMk entry for \"stublib\" missing")
8978 } else {
8979 isPrebuilt := entry.mod.Prebuilt() != nil
8980 if isPrebuilt != test.usePrebuilt {
8981 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8982 }
8983 if !entry.mod.IsStubs() {
8984 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8985 }
8986 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8987 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8988 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008989 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008990 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008991 if !android.InList(expected, cflags) {
8992 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8993 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008994 }
8995 })
8996 }
8997 })
8998 }
8999}
9000
Martin Stjernholmdf298b32021-05-21 20:57:29 +01009001func TestHostApexInHostOnlyBuild(t *testing.T) {
9002 testApex(t, `
9003 apex {
9004 name: "myapex",
9005 host_supported: true,
9006 key: "myapex.key",
9007 updatable: false,
9008 payload_type: "zip",
9009 }
9010 apex_key {
9011 name: "myapex.key",
9012 public_key: "testkey.avbpubkey",
9013 private_key: "testkey.pem",
9014 }
9015 `,
9016 android.FixtureModifyConfig(func(config android.Config) {
9017 // We may not have device targets in all builds, e.g. in
9018 // prebuilts/build-tools/build-prebuilts.sh
9019 config.Targets[android.Android] = []android.Target{}
9020 }))
9021}
9022
Colin Crossc33e5212021-05-25 18:16:02 -07009023func TestApexJavaCoverage(t *testing.T) {
9024 bp := `
9025 apex {
9026 name: "myapex",
9027 key: "myapex.key",
9028 java_libs: ["mylib"],
9029 bootclasspath_fragments: ["mybootclasspathfragment"],
9030 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9031 updatable: false,
9032 }
9033
9034 apex_key {
9035 name: "myapex.key",
9036 public_key: "testkey.avbpubkey",
9037 private_key: "testkey.pem",
9038 }
9039
9040 java_library {
9041 name: "mylib",
9042 srcs: ["mylib.java"],
9043 apex_available: ["myapex"],
9044 compile_dex: true,
9045 }
9046
9047 bootclasspath_fragment {
9048 name: "mybootclasspathfragment",
9049 contents: ["mybootclasspathlib"],
9050 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009051 hidden_api: {
9052 split_packages: ["*"],
9053 },
Colin Crossc33e5212021-05-25 18:16:02 -07009054 }
9055
9056 java_library {
9057 name: "mybootclasspathlib",
9058 srcs: ["mybootclasspathlib.java"],
9059 apex_available: ["myapex"],
9060 compile_dex: true,
9061 }
9062
9063 systemserverclasspath_fragment {
9064 name: "mysystemserverclasspathfragment",
9065 contents: ["mysystemserverclasspathlib"],
9066 apex_available: ["myapex"],
9067 }
9068
9069 java_library {
9070 name: "mysystemserverclasspathlib",
9071 srcs: ["mysystemserverclasspathlib.java"],
9072 apex_available: ["myapex"],
9073 compile_dex: true,
9074 }
9075 `
9076
9077 result := android.GroupFixturePreparers(
9078 PrepareForTestWithApexBuildComponents,
9079 prepareForTestWithMyapex,
9080 java.PrepareForTestWithJavaDefaultModules,
9081 android.PrepareForTestWithAndroidBuildComponents,
9082 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009083 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9084 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009085 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009086 ).RunTest(t)
9087
9088 // Make sure jacoco ran on both mylib and mybootclasspathlib
9089 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9090 t.Errorf("Failed to find jacoco rule for mylib")
9091 }
9092 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9093 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9094 }
9095 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9096 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9097 }
9098}
9099
Jiyong Park192600a2021-08-03 07:52:17 +00009100func TestProhibitStaticExecutable(t *testing.T) {
9101 testApexError(t, `executable mybin is static`, `
9102 apex {
9103 name: "myapex",
9104 key: "myapex.key",
9105 binaries: ["mybin"],
9106 min_sdk_version: "29",
9107 }
9108
9109 apex_key {
9110 name: "myapex.key",
9111 public_key: "testkey.avbpubkey",
9112 private_key: "testkey.pem",
9113 }
9114
9115 cc_binary {
9116 name: "mybin",
9117 srcs: ["mylib.cpp"],
9118 relative_install_path: "foo/bar",
9119 static_executable: true,
9120 system_shared_libs: [],
9121 stl: "none",
9122 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009123 min_sdk_version: "29",
9124 }
9125 `)
9126
9127 testApexError(t, `executable mybin.rust is static`, `
9128 apex {
9129 name: "myapex",
9130 key: "myapex.key",
9131 binaries: ["mybin.rust"],
9132 min_sdk_version: "29",
9133 }
9134
9135 apex_key {
9136 name: "myapex.key",
9137 public_key: "testkey.avbpubkey",
9138 private_key: "testkey.pem",
9139 }
9140
9141 rust_binary {
9142 name: "mybin.rust",
9143 srcs: ["foo.rs"],
9144 static_executable: true,
9145 apex_available: ["myapex"],
9146 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009147 }
9148 `)
9149}
9150
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009151func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9152 ctx := testApex(t, `
9153 apex {
9154 name: "myapex",
9155 key: "myapex.key",
9156 updatable: false,
9157 java_libs: ["foo"],
9158 }
9159
9160 apex_key {
9161 name: "myapex.key",
9162 public_key: "testkey.avbpubkey",
9163 private_key: "testkey.pem",
9164 }
9165
9166 java_library {
9167 name: "foo",
9168 srcs: ["foo.java"],
9169 apex_available: ["myapex"],
9170 installable: true,
9171 }
9172 `,
9173 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9174 )
9175
9176 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9177 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9178 var builder strings.Builder
9179 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9180 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009181 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 +00009182}
9183
9184func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9185 ctx := testApex(t, `
9186 prebuilt_apex {
9187 name: "myapex",
9188 arch: {
9189 arm64: {
9190 src: "myapex-arm64.apex",
9191 },
9192 arm: {
9193 src: "myapex-arm.apex",
9194 },
9195 },
9196 exported_java_libs: ["foo"],
9197 }
9198
9199 java_import {
9200 name: "foo",
9201 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009202 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009203 }
9204 `,
9205 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9206 )
9207
9208 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9209 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9210 mainModuleEntries := entriesList[0]
9211 android.AssertArrayString(t,
9212 "LOCAL_REQUIRED_MODULES",
9213 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9214 []string{
9215 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9216 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9217 })
9218}
9219
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009220func TestAndroidMk_RequiredModules(t *testing.T) {
9221 ctx := testApex(t, `
9222 apex {
9223 name: "myapex",
9224 key: "myapex.key",
9225 updatable: false,
9226 java_libs: ["foo"],
9227 required: ["otherapex"],
9228 }
9229
9230 apex {
9231 name: "otherapex",
9232 key: "myapex.key",
9233 updatable: false,
9234 java_libs: ["foo"],
9235 required: ["otherapex"],
9236 }
9237
9238 apex_key {
9239 name: "myapex.key",
9240 public_key: "testkey.avbpubkey",
9241 private_key: "testkey.pem",
9242 }
9243
9244 java_library {
9245 name: "foo",
9246 srcs: ["foo.java"],
9247 apex_available: ["myapex", "otherapex"],
9248 installable: true,
9249 }
9250 `)
9251
9252 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
9253 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9254 var builder strings.Builder
9255 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9256 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009257 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009258}
9259
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009260func TestAndroidMk_RequiredDeps(t *testing.T) {
9261 ctx := testApex(t, `
9262 apex {
9263 name: "myapex",
9264 key: "myapex.key",
9265 updatable: false,
9266 }
9267
9268 apex_key {
9269 name: "myapex.key",
9270 public_key: "testkey.avbpubkey",
9271 private_key: "testkey.pem",
9272 }
9273 `)
9274
9275 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009276 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009277 data := android.AndroidMkDataForTest(t, ctx, bundle)
9278 var builder strings.Builder
9279 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9280 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00009281 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009282
9283 flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009284 flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009285 flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
9286 var flattenedBuilder strings.Builder
9287 flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
9288 flattenedAndroidMk := flattenedBuilder.String()
Sasha Smundakdcb61292022-12-08 10:41:33 -08009289 ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009290}
9291
Jooyung Hana6d36672022-02-24 13:58:07 +09009292func TestApexOutputFileProducer(t *testing.T) {
9293 for _, tc := range []struct {
9294 name string
9295 ref string
9296 expected_data []string
9297 }{
9298 {
9299 name: "test_using_output",
9300 ref: ":myapex",
9301 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
9302 },
9303 {
9304 name: "test_using_apex",
9305 ref: ":myapex{.apex}",
9306 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
9307 },
9308 } {
9309 t.Run(tc.name, func(t *testing.T) {
9310 ctx := testApex(t, `
9311 apex {
9312 name: "myapex",
9313 key: "myapex.key",
9314 compressible: true,
9315 updatable: false,
9316 }
9317
9318 apex_key {
9319 name: "myapex.key",
9320 public_key: "testkey.avbpubkey",
9321 private_key: "testkey.pem",
9322 }
9323
9324 java_test {
9325 name: "`+tc.name+`",
9326 srcs: ["a.java"],
9327 data: ["`+tc.ref+`"],
9328 }
9329 `,
9330 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9331 variables.CompressedApex = proptools.BoolPtr(true)
9332 }))
9333 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9334 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9335 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9336 })
9337 }
9338}
9339
satayev758968a2021-12-06 11:42:40 +00009340func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9341 preparer := android.GroupFixturePreparers(
9342 PrepareForTestWithApexBuildComponents,
9343 prepareForTestWithMyapex,
9344 java.PrepareForTestWithJavaSdkLibraryFiles,
9345 java.PrepareForTestWithJavaDefaultModules,
9346 android.PrepareForTestWithAndroidBuildComponents,
9347 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9348 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9349 )
9350
9351 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9352 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9353 preparer.RunTestWithBp(t, `
9354 apex {
9355 name: "myapex",
9356 key: "myapex.key",
9357 bootclasspath_fragments: ["mybootclasspathfragment"],
9358 min_sdk_version: "30",
9359 updatable: false,
9360 }
9361
9362 apex_key {
9363 name: "myapex.key",
9364 public_key: "testkey.avbpubkey",
9365 private_key: "testkey.pem",
9366 }
9367
9368 bootclasspath_fragment {
9369 name: "mybootclasspathfragment",
9370 contents: ["mybootclasspathlib"],
9371 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009372 hidden_api: {
9373 split_packages: ["*"],
9374 },
satayev758968a2021-12-06 11:42:40 +00009375 }
9376
9377 java_sdk_library {
9378 name: "mybootclasspathlib",
9379 srcs: ["mybootclasspathlib.java"],
9380 apex_available: ["myapex"],
9381 compile_dex: true,
9382 unsafe_ignore_missing_latest_api: true,
9383 min_sdk_version: "31",
9384 static_libs: ["util"],
9385 }
9386
9387 java_library {
9388 name: "util",
9389 srcs: ["a.java"],
9390 apex_available: ["myapex"],
9391 min_sdk_version: "31",
9392 static_libs: ["another_util"],
9393 }
9394
9395 java_library {
9396 name: "another_util",
9397 srcs: ["a.java"],
9398 min_sdk_version: "31",
9399 apex_available: ["myapex"],
9400 }
9401 `)
9402 })
9403
9404 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9405 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9406 preparer.RunTestWithBp(t, `
9407 apex {
9408 name: "myapex",
9409 key: "myapex.key",
9410 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9411 min_sdk_version: "30",
9412 updatable: false,
9413 }
9414
9415 apex_key {
9416 name: "myapex.key",
9417 public_key: "testkey.avbpubkey",
9418 private_key: "testkey.pem",
9419 }
9420
9421 systemserverclasspath_fragment {
9422 name: "mysystemserverclasspathfragment",
9423 contents: ["mysystemserverclasspathlib"],
9424 apex_available: ["myapex"],
9425 }
9426
9427 java_sdk_library {
9428 name: "mysystemserverclasspathlib",
9429 srcs: ["mysystemserverclasspathlib.java"],
9430 apex_available: ["myapex"],
9431 compile_dex: true,
9432 min_sdk_version: "32",
9433 unsafe_ignore_missing_latest_api: true,
9434 static_libs: ["util"],
9435 }
9436
9437 java_library {
9438 name: "util",
9439 srcs: ["a.java"],
9440 apex_available: ["myapex"],
9441 min_sdk_version: "31",
9442 static_libs: ["another_util"],
9443 }
9444
9445 java_library {
9446 name: "another_util",
9447 srcs: ["a.java"],
9448 min_sdk_version: "31",
9449 apex_available: ["myapex"],
9450 }
9451 `)
9452 })
9453
9454 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9455 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9456 RunTestWithBp(t, `
9457 apex {
9458 name: "myapex",
9459 key: "myapex.key",
9460 bootclasspath_fragments: ["mybootclasspathfragment"],
9461 min_sdk_version: "30",
9462 updatable: false,
9463 }
9464
9465 apex_key {
9466 name: "myapex.key",
9467 public_key: "testkey.avbpubkey",
9468 private_key: "testkey.pem",
9469 }
9470
9471 bootclasspath_fragment {
9472 name: "mybootclasspathfragment",
9473 contents: ["mybootclasspathlib"],
9474 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009475 hidden_api: {
9476 split_packages: ["*"],
9477 },
satayev758968a2021-12-06 11:42:40 +00009478 }
9479
9480 java_sdk_library {
9481 name: "mybootclasspathlib",
9482 srcs: ["mybootclasspathlib.java"],
9483 apex_available: ["myapex"],
9484 compile_dex: true,
9485 unsafe_ignore_missing_latest_api: true,
9486 }
9487 `)
9488 })
9489
9490 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9491 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9492 RunTestWithBp(t, `
9493 apex {
9494 name: "myapex",
9495 key: "myapex.key",
9496 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9497 min_sdk_version: "30",
9498 updatable: false,
9499 }
9500
9501 apex_key {
9502 name: "myapex.key",
9503 public_key: "testkey.avbpubkey",
9504 private_key: "testkey.pem",
9505 }
9506
9507 systemserverclasspath_fragment {
9508 name: "mysystemserverclasspathfragment",
9509 contents: ["mysystemserverclasspathlib"],
9510 apex_available: ["myapex"],
9511 }
9512
9513 java_sdk_library {
9514 name: "mysystemserverclasspathlib",
9515 srcs: ["mysystemserverclasspathlib.java"],
9516 apex_available: ["myapex"],
9517 compile_dex: true,
9518 unsafe_ignore_missing_latest_api: true,
9519 }
9520 `)
9521 })
9522}
9523
Jiakai Zhang6decef92022-01-12 17:56:19 +00009524// Verifies that the APEX depends on all the Make modules in the list.
9525func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9526 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9527 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009528 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009529 }
9530}
9531
9532// Verifies that the APEX does not depend on any of the Make modules in the list.
9533func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9534 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9535 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009536 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009537 }
9538}
9539
Cole Faust1021ccd2023-02-26 21:15:25 -08009540// TODO(b/193460475): Re-enable this test
9541//func TestApexStrictUpdtabilityLint(t *testing.T) {
9542// bpTemplate := `
9543// apex {
9544// name: "myapex",
9545// key: "myapex.key",
9546// java_libs: ["myjavalib"],
9547// updatable: %v,
9548// min_sdk_version: "29",
9549// }
9550// apex_key {
9551// name: "myapex.key",
9552// }
9553// java_library {
9554// name: "myjavalib",
9555// srcs: ["MyClass.java"],
9556// apex_available: [ "myapex" ],
9557// lint: {
9558// strict_updatability_linting: %v,
9559// },
9560// sdk_version: "current",
9561// min_sdk_version: "29",
9562// }
9563// `
9564// fs := android.MockFS{
9565// "lint-baseline.xml": nil,
9566// }
9567//
9568// testCases := []struct {
9569// testCaseName string
9570// apexUpdatable bool
9571// javaStrictUpdtabilityLint bool
9572// lintFileExists bool
9573// disallowedFlagExpected bool
9574// }{
9575// {
9576// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9577// apexUpdatable: true,
9578// javaStrictUpdtabilityLint: true,
9579// lintFileExists: false,
9580// disallowedFlagExpected: false,
9581// },
9582// {
9583// testCaseName: "non-updatable apex respects strict_updatability of javalib",
9584// apexUpdatable: false,
9585// javaStrictUpdtabilityLint: false,
9586// lintFileExists: true,
9587// disallowedFlagExpected: false,
9588// },
9589// {
9590// testCaseName: "non-updatable apex respects strict updatability of javalib",
9591// apexUpdatable: false,
9592// javaStrictUpdtabilityLint: true,
9593// lintFileExists: true,
9594// disallowedFlagExpected: true,
9595// },
9596// {
9597// testCaseName: "updatable apex sets strict updatability of javalib to true",
9598// apexUpdatable: true,
9599// javaStrictUpdtabilityLint: false, // will be set to true by mutator
9600// lintFileExists: true,
9601// disallowedFlagExpected: true,
9602// },
9603// }
9604//
9605// for _, testCase := range testCases {
9606// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
9607// fixtures := []android.FixturePreparer{}
9608// if testCase.lintFileExists {
9609// fixtures = append(fixtures, fs.AddToFixture())
9610// }
9611//
9612// result := testApex(t, bp, fixtures...)
9613// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9614// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9615// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
9616//
9617// if disallowedFlagActual != testCase.disallowedFlagExpected {
9618// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9619// }
9620// }
9621//}
9622//
9623//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
9624// bp := `
9625// apex {
9626// name: "myapex",
9627// key: "myapex.key",
9628// java_libs: ["myjavalib"],
9629// updatable: true,
9630// min_sdk_version: "29",
9631// }
9632// apex_key {
9633// name: "myapex.key",
9634// }
9635// java_library {
9636// name: "myjavalib",
9637// srcs: ["MyClass.java"],
9638// apex_available: [ "myapex" ],
9639// sdk_version: "current",
9640// min_sdk_version: "29",
9641// }
9642// `
9643//
9644// testCases := []struct {
9645// testCaseName string
9646// moduleDirectory string
9647// disallowedFlagExpected bool
9648// }{
9649// {
9650// testCaseName: "lintable module defined outside libcore",
9651// moduleDirectory: "",
9652// disallowedFlagExpected: true,
9653// },
9654// {
9655// testCaseName: "lintable module defined in libcore root directory",
9656// moduleDirectory: "libcore/",
9657// disallowedFlagExpected: false,
9658// },
9659// {
9660// testCaseName: "lintable module defined in libcore child directory",
9661// moduleDirectory: "libcore/childdir/",
9662// disallowedFlagExpected: true,
9663// },
9664// }
9665//
9666// for _, testCase := range testCases {
9667// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
9668// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
9669// result := testApex(t, "", lintFileCreator, bpFileCreator)
9670// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9671// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9672// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
9673// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
9674//
9675// if disallowedFlagActual != testCase.disallowedFlagExpected {
9676// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
9677// }
9678// }
9679//}
9680//
9681//// checks transtive deps of an apex coming from bootclasspath_fragment
9682//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
9683// bp := `
9684// apex {
9685// name: "myapex",
9686// key: "myapex.key",
9687// bootclasspath_fragments: ["mybootclasspathfragment"],
9688// updatable: true,
9689// min_sdk_version: "29",
9690// }
9691// apex_key {
9692// name: "myapex.key",
9693// }
9694// bootclasspath_fragment {
9695// name: "mybootclasspathfragment",
9696// contents: ["myjavalib"],
9697// apex_available: ["myapex"],
9698// hidden_api: {
9699// split_packages: ["*"],
9700// },
9701// }
9702// java_library {
9703// name: "myjavalib",
9704// srcs: ["MyClass.java"],
9705// apex_available: [ "myapex" ],
9706// sdk_version: "current",
9707// min_sdk_version: "29",
9708// compile_dex: true,
9709// }
9710// `
9711// fs := android.MockFS{
9712// "lint-baseline.xml": nil,
9713// }
9714//
9715// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
9716// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9717// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
9718// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
9719// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
9720// }
9721//}
Spandan Das66773252022-01-15 00:23:18 +00009722
Spandan Das42e89502022-05-06 22:12:55 +00009723// updatable apexes should propagate updatable=true to its apps
9724func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
9725 bp := `
9726 apex {
9727 name: "myapex",
9728 key: "myapex.key",
9729 updatable: %v,
9730 apps: [
9731 "myapp",
9732 ],
9733 min_sdk_version: "30",
9734 }
9735 apex_key {
9736 name: "myapex.key",
9737 }
9738 android_app {
9739 name: "myapp",
9740 updatable: %v,
9741 apex_available: [
9742 "myapex",
9743 ],
9744 sdk_version: "current",
9745 min_sdk_version: "30",
9746 }
9747 `
9748 testCases := []struct {
9749 name string
9750 apex_is_updatable_bp bool
9751 app_is_updatable_bp bool
9752 app_is_updatable_expected bool
9753 }{
9754 {
9755 name: "Non-updatable apex respects updatable property of non-updatable app",
9756 apex_is_updatable_bp: false,
9757 app_is_updatable_bp: false,
9758 app_is_updatable_expected: false,
9759 },
9760 {
9761 name: "Non-updatable apex respects updatable property of updatable app",
9762 apex_is_updatable_bp: false,
9763 app_is_updatable_bp: true,
9764 app_is_updatable_expected: true,
9765 },
9766 {
9767 name: "Updatable apex respects updatable property of updatable app",
9768 apex_is_updatable_bp: true,
9769 app_is_updatable_bp: true,
9770 app_is_updatable_expected: true,
9771 },
9772 {
9773 name: "Updatable apex sets updatable=true on non-updatable app",
9774 apex_is_updatable_bp: true,
9775 app_is_updatable_bp: false,
9776 app_is_updatable_expected: true,
9777 },
9778 }
9779 for _, testCase := range testCases {
9780 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
9781 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
9782 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
9783 }
9784}
9785
Kiyoung Kim487689e2022-07-26 09:48:22 +09009786func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9787 bp := `
9788 apex {
9789 name: "myapex",
9790 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009791 native_shared_libs: ["libbaz"],
9792 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009793 min_sdk_version: "29",
9794 }
9795 apex_key {
9796 name: "myapex.key",
9797 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009798 cc_binary {
9799 name: "binfoo",
9800 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009801 apex_available: ["myapex"],
9802 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009803 recovery_available: false,
9804 }
9805 cc_library {
9806 name: "libbar",
9807 srcs: ["libbar.cc"],
9808 stubs: {
9809 symbol_file: "libbar.map.txt",
9810 versions: [
9811 "29",
9812 ],
9813 },
9814 }
9815 cc_library {
9816 name: "libbaz",
9817 srcs: ["libbaz.cc"],
9818 apex_available: ["myapex"],
9819 min_sdk_version: "29",
9820 stubs: {
9821 symbol_file: "libbaz.map.txt",
9822 versions: [
9823 "29",
9824 ],
9825 },
Kiyoung Kim487689e2022-07-26 09:48:22 +09009826 }
9827 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009828 name: "libbar",
9829 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009830 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009831 variants: ["apex.29"],
9832 }
9833 cc_api_variant {
9834 name: "libbar",
9835 variant: "apex",
9836 version: "29",
9837 src: "libbar_apex_29.so",
9838 }
9839 cc_api_library {
9840 name: "libbaz",
9841 src: "libbaz_stub.so",
9842 min_sdk_version: "29",
9843 variants: ["apex.29"],
9844 }
9845 cc_api_variant {
9846 name: "libbaz",
9847 variant: "apex",
9848 version: "29",
9849 src: "libbaz_apex_29.so",
9850 }
9851 cc_api_library {
9852 name: "libqux",
9853 src: "libqux_stub.so",
9854 min_sdk_version: "29",
9855 variants: ["apex.29"],
9856 }
9857 cc_api_variant {
9858 name: "libqux",
9859 variant: "apex",
9860 version: "29",
9861 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009862 }
9863 api_imports {
9864 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009865 apex_shared_libs: [
9866 "libbar",
9867 "libbaz",
9868 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +09009869 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +09009870 }
9871 `
9872 result := testApex(t, bp)
9873
9874 hasDep := func(m android.Module, wantDep android.Module) bool {
9875 t.Helper()
9876 var found bool
9877 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9878 if dep == wantDep {
9879 found = true
9880 }
9881 })
9882 return found
9883 }
9884
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009885 // Library defines stubs and cc_api_library should be used with cc_api_library
9886 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
9887 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
9888 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +09009889
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009890 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
9891 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +09009892
Kiyoung Kim76b06f32023-02-06 22:08:13 +09009893 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
9894 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
9895 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
9896 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
9897
9898 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
9899 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
9900 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
9901 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
9902 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
9903
9904 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
9905 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
9906 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
9907
9908 // cc_api_library defined without original library should be linked with cc_api_library
9909 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
9910 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
9911 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
9912}
9913
9914func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
9915 bp := `
9916 apex {
9917 name: "myapex",
9918 key: "myapex.key",
9919 native_shared_libs: ["libbar"],
9920 min_sdk_version: "29",
9921 }
9922 apex_key {
9923 name: "myapex.key",
9924 }
9925 cc_binary {
9926 name: "binfoo",
9927 shared_libs: ["libbar"],
9928 recovery_available: false,
9929 }
9930 cc_library {
9931 name: "libbar",
9932 srcs: ["libbar.cc"],
9933 apex_available: ["myapex"],
9934 min_sdk_version: "29",
9935 stubs: {
9936 symbol_file: "libbar.map.txt",
9937 versions: [
9938 "29",
9939 ],
9940 },
9941 }
9942 cc_api_library {
9943 name: "libbar",
9944 src: "libbar_stub.so",
9945 variants: ["apex.29"],
9946 }
9947 cc_api_variant {
9948 name: "libbar",
9949 variant: "apex",
9950 version: "29",
9951 src: "libbar_apex_29.so",
9952 }
9953 api_imports {
9954 name: "api_imports",
9955 apex_shared_libs: [
9956 "libbar",
9957 ],
9958 }
9959 `
9960
9961 result := testApex(t, bp)
9962
9963 hasDep := func(m android.Module, wantDep android.Module) bool {
9964 t.Helper()
9965 var found bool
9966 result.VisitDirectDeps(m, func(dep blueprint.Module) {
9967 if dep == wantDep {
9968 found = true
9969 }
9970 })
9971 return found
9972 }
9973
9974 // Library defines stubs and cc_api_library should be used with cc_api_library
9975 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
9976 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
9977 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
9978
9979 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
9980 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
9981
9982 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
9983 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
9984 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
9985 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +09009986}
Dennis Shend4f5d932023-01-31 20:27:21 +00009987
9988func TestTrimmedApex(t *testing.T) {
9989 bp := `
9990 apex {
9991 name: "myapex",
9992 key: "myapex.key",
9993 native_shared_libs: ["libfoo","libbaz"],
9994 min_sdk_version: "29",
9995 trim_against: "mydcla",
9996 }
9997 apex {
9998 name: "mydcla",
9999 key: "myapex.key",
10000 native_shared_libs: ["libfoo","libbar"],
10001 min_sdk_version: "29",
10002 file_contexts: ":myapex-file_contexts",
10003 dynamic_common_lib_apex: true,
10004 }
10005 apex_key {
10006 name: "myapex.key",
10007 }
10008 cc_library {
10009 name: "libfoo",
10010 shared_libs: ["libc"],
10011 apex_available: ["myapex","mydcla"],
10012 min_sdk_version: "29",
10013 }
10014 cc_library {
10015 name: "libbar",
10016 shared_libs: ["libc"],
10017 apex_available: ["myapex","mydcla"],
10018 min_sdk_version: "29",
10019 }
10020 cc_library {
10021 name: "libbaz",
10022 shared_libs: ["libc"],
10023 apex_available: ["myapex","mydcla"],
10024 min_sdk_version: "29",
10025 }
10026 cc_api_library {
10027 name: "libc",
10028 src: "libc.so",
10029 min_sdk_version: "29",
10030 recovery_available: true,
10031 }
10032 api_imports {
10033 name: "api_imports",
10034 shared_libs: [
10035 "libc",
10036 ],
10037 header_libs: [],
10038 }
10039 `
10040 ctx := testApex(t, bp)
10041 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
10042 apexRule := module.MaybeRule("apexRule")
10043 if apexRule.Rule == nil {
10044 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10045 }
10046
10047 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
10048 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
10049 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10050 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10051 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10052 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10053}